Commit 503b5cb2 authored by Christian Robottom's avatar Christian Robottom

Assorted fixes to zeopasswd.py: support realms, support ZConfig-free

usage, python2.1 fixes, and fix one or two bugs (missing import, lacking
check for invalid database type, etc)
parent e37011c9
...@@ -17,12 +17,16 @@ ...@@ -17,12 +17,16 @@
usage: python zeopasswd.py [options] username [password] usage: python zeopasswd.py [options] username [password]
-C/--configuration URL -- configuration file or URL -C/--configuration URL -- configuration file or URL
-p/--protocol -- authentication protocol name
-f/--filename -- authentication database filename
-r/--realm -- authentication database realm
-d/--delete -- delete user instead of updating password -d/--delete -- delete user instead of updating password
""" """
import getopt import getopt
import getpass import getpass
import sys import sys
import os
import ZConfig import ZConfig
import ZEO import ZEO
...@@ -35,22 +39,41 @@ def usage(msg): ...@@ -35,22 +39,41 @@ def usage(msg):
def options(args): def options(args):
"""Password-specific options loaded from regular ZEO config file.""" """Password-specific options loaded from regular ZEO config file."""
schema = ZConfig.loadSchema(os.path.join(os.path.dirname(ZEO.__file__),
"schema.xml"))
try: 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: except getopt.error, msg:
usage(msg) usage(msg)
config = None config = None
delete = False delete = 0
auth_protocol = None
auth_db = ""
auth_realm = None
for k, v in options: for k, v in options:
if k == '-C' or k == '--configure': 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) config, nil = ZConfig.loadConfig(schema, v)
if k == '-d' or k == '--delete': if k == '-d' or k == '--delete':
delete = True delete = 1
if config is None: if k == '-p' or k == '--protocol':
usage("Must specifiy configuration file") 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("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("Must specifiy configuration file or protocol and database")
password = None password = None
if delete: if delete:
...@@ -69,20 +92,21 @@ def options(args): ...@@ -69,20 +92,21 @@ def options(args):
else: else:
username, password = args username, password = args
return config.zeo, delete, username, password return auth_protocol, auth_db, auth_realm, delete, username, password
def main(args=None): def main(args=None):
options, delete, username, password = options(args) p, auth_db, auth_realm, delete, username, password = options(args)
p = options.authentication_protocol
if p is None: if p is None:
usage("ZEO configuration does not specify authentication-protocol") usage("ZEO configuration does not specify authentication-protocol")
if p == "digest": if p == "digest":
from ZEO.auth.auth_digest import DigestDatabase as Database from ZEO.auth.auth_digest import DigestDatabase as Database
elif p == "srp": elif p == "srp":
from ZEO.auth.auth_srp import SRPDatabase as Database from ZEO.auth.auth_srp import SRPDatabase as Database
if options.authentication_database is None: else:
raise ValueError, "Unknown database type %r" % p
if auth_db is None:
usage("ZEO configuration does not specify authentication-database") usage("ZEO configuration does not specify authentication-database")
db = Database(options.authentication_database) db = Database(auth_db, auth_realm)
if delete: if delete:
db.del_user(username) db.del_user(username)
else: else:
...@@ -92,4 +116,5 @@ def main(args=None): ...@@ -92,4 +116,5 @@ def main(args=None):
db.save() db.save()
if __name__ == "__main__": 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