Commit b909df74 authored by Christian Robottom's avatar Christian Robottom

Reapply fixes to zeopasswd.py that allow a user to specify the

authentication database details via commandline parameters (in lieu of
the default ZConfig). Also fixed some minor bugs -- missing import,
missing realm, etc.

For no extra charge did some usage cleanups and added a check to
Database to make sure the realm is consistent.
parent 57c663b0
......@@ -59,8 +59,12 @@ class Database:
"""
self._users = {}
self.filename = filename
self.realm = realm
self.load()
if self.realm and self.realm != realm:
raise ValueError, ("Specified realm %r differs from "
"database realm %r" % (realm or '', self.realm))
else:
self.realm = realm
def save(self, fd=None):
filename = self.filename
......
......@@ -16,73 +16,105 @@
usage: python zeopasswd.py [options] username [password]
-C/--configuration URL -- configuration file or URL
-d/--delete -- delete user instead of updating password
Specify either a configuration file:
-C/--configuration -- ZConfig configuration file
or the individual options:
-f/--filename -- authentication database filename
-p/--protocol -- authentication protocol name
-r/--realm -- authentication database realm
Additional options:
-d/--delete -- delete user instead of updating password
"""
import getopt
import getpass
import sys
import os
import ZConfig
import ZEO
def usage(msg):
print msg
print __doc__
print msg
sys.exit(2)
def options(args):
"""Password-specific options loaded from regular ZEO config file."""
schema = ZConfig.loadSchema(os.path.join(os.path.dirname(ZEO.__file__),
"schema.xml"))
try:
options, args = getopt.getopt(args, "C:", ["configure="])
options, args = getopt.getopt(args, "dr:p:f:C:", ["configure=",
"protocol=",
"filename=",
"realm"])
except getopt.error, msg:
usage(msg)
config = None
delete = False
delete = 0
auth_protocol = None
auth_db = ""
auth_realm = None
for k, v in options:
if k == '-C' or k == '--configure':
schemafile = os.path.join(os.path.dirname(ZEO.__file__),
"schema.xml")
schema = ZConfig.loadSchema(schemafile)
config, nil = ZConfig.loadConfig(schema, v)
if k == '-d' or k == '--delete':
delete = True
if config is None:
usage("Must specifiy configuration file")
delete = 1
if k == '-p' or k == '--protocol':
auth_protocol = v
if k == '-f' or k == '--filename':
auth_db = v
if k == '-r' or k == '--realm':
auth_realm = v
if config is not None:
if auth_protocol or auth_db:
usage("Error: Conflicting options; use either -C *or* -p and -f")
auth_protocol = config.zeo.authentication_protocol
auth_db = config.zeo.authentication_database
auth_realm = config.zeo.authentication_realm
elif not (auth_protocol and auth_db):
usage("Error: Must specifiy configuration file or protocol and database")
password = None
if delete:
if not args:
usage("Must specify username to delete")
usage("Error: Must specify a username to delete")
elif len(args) > 1:
usage("Too many arguments")
usage("Error: Too many arguments")
username = args[0]
else:
if not args:
usage("Must specify username")
usage("Error: Must specify a username")
elif len(args) > 2:
usage("Too many arguments")
usage("Error: Too many arguments")
elif len(args) == 1:
username = args[0]
else:
username, password = args
return config.zeo, delete, username, password
return auth_protocol, auth_db, auth_realm, delete, username, password
def main(args=None):
options, delete, username, password = options(args)
p = options.authentication_protocol
p, auth_db, auth_realm, delete, username, password = options(args)
if p is None:
usage("ZEO configuration does not specify authentication-protocol")
usage("Error: configuration does not specify auth protocol")
if p == "digest":
from ZEO.auth.auth_digest import DigestDatabase as Database
elif p == "srp":
from ZEO.auth.auth_srp import SRPDatabase as Database
if options.authentication_database is None:
usage("ZEO configuration does not specify authentication-database")
db = Database(options.authentication_database)
else:
raise ValueError, "Unknown database type %r" % p
if auth_db is None:
usage("Error: configuration does not specify auth database")
db = Database(auth_db, auth_realm)
if delete:
db.del_user(username)
else:
......@@ -92,4 +124,5 @@ def main(args=None):
db.save()
if __name__ == "__main__":
main(sys.argv)
main(sys.argv[1:])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment