X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/chopwood/blobdiff_plain/a2916c0635fec5b45ad742904db9f5769b48f53d..8f6848e2f6be4cde36f1e3599de0e7ef0457a30b:/cmd-admin.py diff --git a/cmd-admin.py b/cmd-admin.py index dc52461..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,33 +135,48 @@ 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) if D.DB.fetchone() is not None: raise U.ExpectedError, ( - 400, "User `%s' already has `%s' account" % (user, service)) + 400, "User `%s' already has a `%s' account" % (user, service)) D.DB.execute("""INSERT INTO services (service, user, alias) 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.", @@ -164,7 +196,7 @@ def cmd_editacct(user, service, alias = None, noalias = False): user = user, service = service) @SC.subcommand( - 'source', ['admin', 'userv'], """\ + 'source', ['admin', 'userv', 'remote'], """\ Write source code (in `.tar.gz' format) to standard output.""") def cmd_source_admin(): AGPL.source(OUT)