X-Git-Url: https://git.distorted.org.uk/~mdw/chopwood/blobdiff_plain/74b87214c100957fb37de47a8c58f6c3d8cebf3a..1e83d6d9ae0d486fc1205e70123a356220db3bff:/cmd-admin.py diff --git a/cmd-admin.py b/cmd-admin.py index 577fe7a..fb72497 100644 --- a/cmd-admin.py +++ b/cmd-admin.py @@ -26,9 +26,13 @@ from __future__ import with_statement import agpl as AGPL +import backend as BE import cmdutil as CU +import config as CONF; CFG = CONF.CFG import dbmaint as D +import operation as OP from output import OUT, PRINT +import service as S import subcommand as SC import util as U @@ -64,6 +68,19 @@ def cmd_adduser(user, email = None): def cmd_deluser(user, email = None): with D.DB: CU.check_user(user) + for service, alias in D.DB.execute( + "SELECT service, alias FROM services WHERE user = $user", + user = user): + if service == 'master': continue + try: + svc = S.SERVICES[service] + except KeyError: + OUT.warn("User `%s' has account for unknown service `%s'" % + (user, service)) + else: + if svc.manage_pwent_p: + if alias is None: alias = user + svc.rmpwent(alias) D.DB.execute("DELETE FROM users WHERE user = $user", user = user) @SC.subcommand( @@ -118,11 +135,12 @@ def cmd_editsvc(service, rename = None): opts = [SC.Opt('alias', '-a', '--alias', "alias by which USER is known to SERVICE", argname = 'ALIAS')], - params = [SC.Arg('user'), SC.Arg('service')]) -def cmd_addacct(user, service, alias = None): + params = [SC.Arg('user'), SC.Arg('service')], + rparam = SC.Arg('fields')) +def cmd_addacct(user, service, fields, alias = None): with D.DB: CU.check_user(user) - CU.check_service(service) + svc = CU.check_service(service) D.DB.execute("""SELECT 1 FROM services WHERE user = $user AND service = $service""", user = user, service = service) @@ -133,18 +151,32 @@ def cmd_addacct(user, service, alias = None): VALUES ($service, $user, $alias)""", service = service, user = user, alias = alias) + if svc.manage_pwent_p: + if alias is None: alias = user + passwd = CFG.RQCLASS.reset([OP.acct(svc, alias)]).pwgen() + svc.mkpwent(alias, passwd, fields) + elif fields: + raise U.ExpectedError, ( + 400, "Password entry fields supplied, " + "but `%s' entries must be created manually" % service) + @SC.subcommand( 'delacct', ['admin'], "Remove USER's SERVICE account.", params = [SC.Arg('user'), SC.Arg('service')]) def cmd_delacct(user, service): with D.DB: - CU.resolve_account(service, user) + svc, alias = CU.resolve_account(service, user) if service == 'master': raise U.ExpectedError, \ (400, "Can't delete master accounts: use `deluser'") D.DB.execute("""DELETE FROM services WHERE service = $service AND user = $user""", service = service, user = user) + if svc.manage_pwent_p: + svc.rmpwent(alias) + else: + OUT.warn("You must remove the `%s' password entry for `%s' by hand" % + (service, user)) @SC.subcommand( 'editacct', ['admin'], "Modify USER's SERVICE account record.",