[docs]defchange_password(form_data):ifform_data:form_data["username"]=re.sub(r"\W","",form_data["username"])if(form_dataandform_data["username"]=="unknown"orform_data["old_password"]isNoneorform_data["new_password"]isNoneorform_data["new_password_confirm"]isNone):return{"unable_to_set":True}ifform_data["new_password"]!=form_data["new_password_confirm"]:return{"unable_to_set":True,"password_match":False}realm=settings.CSL_REALMerrors=[]try:kinit=pexpect.spawnu("/usr/bin/kpasswd {}@{}".format(form_data["username"],realm),timeout=settings.KINIT_TIMEOUT)match=kinit.expect([":",pexpect.EOF])ifmatch==1:return{"unable_to_set":True,"error":"User {} does not exist.".format(form_data["username"])}kinit.sendline(form_data["old_password"])kinit.expect([":",pexpect.EOF])ifmatch==1:return{"unable_to_set":True,"error":"Old password was incorrect."}kinit.sendline(form_data["new_password"])kinit.expect([":",pexpect.EOF])ifmatch==1:return{"unable_to_set":True}kinit.sendline(form_data["new_password_confirm"])kinit.expect(pexpect.EOF)kinit.close()exitstatus=kinit.exitstatusexceptpexpect.TIMEOUT:return{"unable_to_set":True,"errors":errors}ifexitstatus==0:logging.debug("Password changed for %s",form_data["username"])return{"unable_to_set":False}return{"unable_to_set":True}