mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Add function to allow user's to set/reset their kerberos password
Remove some unused calls to retrieve the current realm
This commit is contained in:
@@ -43,6 +43,8 @@ def parse_options():
|
|||||||
help="User's first name")
|
help="User's first name")
|
||||||
parser.add_option("-l", "--lastname", dest="sn",
|
parser.add_option("-l", "--lastname", dest="sn",
|
||||||
help="User's last name")
|
help="User's last name")
|
||||||
|
parser.add_option("-p", "--password", dest="password",
|
||||||
|
help="Set user's password")
|
||||||
parser.add_option("-s", "--shell", dest="shell",
|
parser.add_option("-s", "--shell", dest="shell",
|
||||||
help="Set user's login shell to shell")
|
help="Set user's login shell to shell")
|
||||||
parser.add_option("--usage", action="store_true",
|
parser.add_option("--usage", action="store_true",
|
||||||
@@ -75,10 +77,11 @@ def main():
|
|||||||
else:
|
else:
|
||||||
user.setValue('loginshell', "/bin/bash")
|
user.setValue('loginshell', "/bin/bash")
|
||||||
|
|
||||||
|
username = args[1]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
client = ipaclient.IPAClient()
|
client = ipaclient.IPAClient()
|
||||||
client.add_user(user)
|
client.add_user(user)
|
||||||
print args[1] + " successfully added"
|
|
||||||
except xmlrpclib.Fault, f:
|
except xmlrpclib.Fault, f:
|
||||||
print f.faultString
|
print f.faultString
|
||||||
return 1
|
return 1
|
||||||
@@ -92,6 +95,14 @@ def main():
|
|||||||
print "%s" % (e.message)
|
print "%s" % (e.message)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
if options.password is not None:
|
||||||
|
try:
|
||||||
|
client.modifyPassword(username, None, options.password)
|
||||||
|
except ipa.ipaerror.IPAError, e:
|
||||||
|
print "%s" % (e.message)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
print username + " successfully added"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -65,8 +65,6 @@ class IPAClient:
|
|||||||
def add_user(self,user,user_container=None):
|
def add_user(self,user,user_container=None):
|
||||||
"""Add a user. user is a ipa.user.User object"""
|
"""Add a user. user is a ipa.user.User object"""
|
||||||
|
|
||||||
realm = config.config.get_realm()
|
|
||||||
|
|
||||||
user_dict = user.toDict()
|
user_dict = user.toDict()
|
||||||
|
|
||||||
# dn is set on the server-side
|
# dn is set on the server-side
|
||||||
@@ -110,24 +108,25 @@ class IPAClient:
|
|||||||
def update_user(self,user):
|
def update_user(self,user):
|
||||||
"""Update a user entry."""
|
"""Update a user entry."""
|
||||||
|
|
||||||
realm = config.config.get_realm()
|
|
||||||
|
|
||||||
result = self.transport.update_user(user.origDataDict(), user.toDict())
|
result = self.transport.update_user(user.origDataDict(), user.toDict())
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def delete_user(self,uid):
|
def delete_user(self,uid):
|
||||||
"""Delete a user entry."""
|
"""Delete a user entry."""
|
||||||
|
|
||||||
realm = config.config.get_realm()
|
|
||||||
|
|
||||||
result = self.transport.delete_user(uid)
|
result = self.transport.delete_user(uid)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def modifyPassword(self,uid,oldpass,newpass):
|
||||||
|
"""Modify a user's password"""
|
||||||
|
|
||||||
|
result = self.transport.modifyPassword(uid,oldpass,newpass)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def mark_user_deleted(self,uid):
|
def mark_user_deleted(self,uid):
|
||||||
"""Set a user as inactive by uid."""
|
"""Set a user as inactive by uid."""
|
||||||
|
|
||||||
realm = config.config.get_realm()
|
|
||||||
|
|
||||||
result = self.transport.mark_user_deleted(uid)
|
result = self.transport.mark_user_deleted(uid)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@@ -150,8 +149,6 @@ class IPAClient:
|
|||||||
def add_group(self,group,group_container=None):
|
def add_group(self,group,group_container=None):
|
||||||
"""Add a group. group is a ipa.group.Group object"""
|
"""Add a group. group is a ipa.group.Group object"""
|
||||||
|
|
||||||
realm = config.config.get_realm()
|
|
||||||
|
|
||||||
group_dict = group.toDict()
|
group_dict = group.toDict()
|
||||||
|
|
||||||
# dn is set on the server-side
|
# dn is set on the server-side
|
||||||
|
|||||||
@@ -195,6 +195,22 @@ class RPCClient:
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def modifyPassword(self,uid,oldpass,newpass):
|
||||||
|
"""Modify a user's password"""
|
||||||
|
server = self.setup_server()
|
||||||
|
|
||||||
|
if oldpass is None:
|
||||||
|
oldpass = "__NONE__"
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = server.modifyPassword(uid,oldpass,newpass)
|
||||||
|
except xmlrpclib.Fault, fault:
|
||||||
|
raise ipaerror.gen_exception(fault.faultCode, fault.faultString)
|
||||||
|
except socket.error, (value, msg):
|
||||||
|
raise xmlrpclib.Fault(value, msg)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def mark_user_deleted(self,uid):
|
def mark_user_deleted(self,uid):
|
||||||
"""Mark a user as deleted/inactive"""
|
"""Mark a user as deleted/inactive"""
|
||||||
server = self.setup_server()
|
server = self.setup_server()
|
||||||
|
|||||||
@@ -469,6 +469,24 @@ class IPAdmin(SimpleLDAPObject):
|
|||||||
raise ipaerror.gen_exception(ipaerror.LDAP_DATABASE_ERROR, None, e)
|
raise ipaerror.gen_exception(ipaerror.LDAP_DATABASE_ERROR, None, e)
|
||||||
return "Success"
|
return "Success"
|
||||||
|
|
||||||
|
def modifyPassword(self,dn,oldpass,newpass):
|
||||||
|
"""Set the user password using RFC 3062, LDAP Password Modify Extended
|
||||||
|
Operation. This ends up calling the IPA password slapi plugin
|
||||||
|
handler so the Kerberos password gets set properly.
|
||||||
|
|
||||||
|
oldpass is not mandatory
|
||||||
|
"""
|
||||||
|
|
||||||
|
sctrl = self.__get_server_controls__()
|
||||||
|
|
||||||
|
try:
|
||||||
|
if sctrl is not None:
|
||||||
|
self.set_option(ldap.OPT_SERVER_CONTROLS, sctrl)
|
||||||
|
self.passwd_s(dn, oldpass, newpass)
|
||||||
|
except ldap.LDAPError, e:
|
||||||
|
raise ipaerror.gen_exception(ipaerror.LDAP_DATABASE_ERROR, None, e)
|
||||||
|
return "Success"
|
||||||
|
|
||||||
def __wrapmethods(self):
|
def __wrapmethods(self):
|
||||||
"""This wraps all methods of SimpleLDAPObject, so that we can intercept
|
"""This wraps all methods of SimpleLDAPObject, so that we can intercept
|
||||||
the methods that deal with entries. Instead of using a raw list of tuples
|
the methods that deal with entries. Instead of using a raw list of tuples
|
||||||
|
|||||||
@@ -524,6 +524,24 @@ class IPAServer:
|
|||||||
self.releaseConnection(conn)
|
self.releaseConnection(conn)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def modifyPassword (self, uid, oldpass, newpass, opts=None):
|
||||||
|
"""Set/Reset a user's password
|
||||||
|
|
||||||
|
uid tells us who's password to change
|
||||||
|
oldpass is the old password (if available)
|
||||||
|
newpass is the new password
|
||||||
|
"""
|
||||||
|
user_dn = self.get_user_by_uid(uid, ['dn', 'uid', 'objectclass'], opts)
|
||||||
|
if user_dn is None:
|
||||||
|
raise ipaerror.gen_exception(ipaerror.LDAP_NOT_FOUND)
|
||||||
|
|
||||||
|
conn = self.getConnection(opts)
|
||||||
|
try:
|
||||||
|
res = conn.modifyPassword(user_dn['dn'], oldpass, newpass)
|
||||||
|
finally:
|
||||||
|
self.releaseConnection(conn)
|
||||||
|
return res
|
||||||
|
|
||||||
# Group support
|
# Group support
|
||||||
|
|
||||||
def __is_group_unique(self, cn, opts):
|
def __is_group_unique(self, cn, opts):
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ def handler(req, profiling=False):
|
|||||||
h.register_function(f.update_user)
|
h.register_function(f.update_user)
|
||||||
h.register_function(f.delete_user)
|
h.register_function(f.delete_user)
|
||||||
h.register_function(f.mark_user_deleted)
|
h.register_function(f.mark_user_deleted)
|
||||||
|
h.register_function(f.modifyPassword)
|
||||||
h.register_function(f.get_group_by_cn)
|
h.register_function(f.get_group_by_cn)
|
||||||
h.register_function(f.get_group_by_dn)
|
h.register_function(f.get_group_by_dn)
|
||||||
h.register_function(f.add_group)
|
h.register_function(f.add_group)
|
||||||
|
|||||||
Reference in New Issue
Block a user