[ZODB-Dev] zeopasswd.py fixups

Christian Reis kiko at async.com.br
Mon Jul 28 18:12:16 EDT 2003


The current zeopasswd.py requires using a ZConfig object, and doesn't
support realms. It has an import problem, and one or two checks it could
do that it doesn't. The following patch fixes the current problems, adds
realm support, and provides options for setting manually the data you
require (no backwards-incompatible changes).

I've tested it lightly, seems to create correct databases for digest.

Jeremy, does it look good to go?

Index: ZEO/zeopasswd.py
===================================================================
RCS file: /cvs-repository/ZODB3/ZEO/zeopasswd.py,v
retrieving revision 1.2
diff -u -r1.2 zeopasswd.py
--- ZEO/zeopasswd.py	30 May 2003 19:20:57 -0000	1.2
+++ ZEO/zeopasswd.py	28 Jul 2003 20:11:21 -0000
@@ -17,12 +17,16 @@
 usage: python zeopasswd.py [options] username [password]
 
 -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
 """
 
 import getopt
 import getpass
 import sys
+import os
 
 import ZConfig
 import ZEO
@@ -35,22 +39,41 @@
 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("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
     if delete:
@@ -69,20 +92,21 @@
         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")
     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:
+    else:
+        raise ValueError, "Unknown database type %r" % p
+    if auth_db is None:
         usage("ZEO configuration does not specify authentication-database")
-    db = Database(options.authentication_database)
+    db = Database(auth_db, auth_realm)
     if delete:
         db.del_user(username)
     else:
@@ -92,4 +116,5 @@
     db.save()
 
 if __name__ == "__main__":
-    main(sys.argv)
+    main(sys.argv[1:])
+

Take care,
--
Christian Reis, Senior Engineer, Async Open Source, Brazil.
http://async.com.br/~kiko/ | [+55 16] 261 2331 | NMFL



More information about the ZODB-Dev mailing list