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
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(
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.",