5 commits - pykolab/auth pykolab/cli pykolab/wap_client

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Thu Jul 31 15:10:32 CEST 2014


 pykolab/auth/ldap/__init__.py     |   12 -
 pykolab/auth/ldap/cache.py        |   25 ++-
 pykolab/cli/cmd_delete_mailbox.py |    5 
 pykolab/cli/cmd_list_users.py     |   39 +++++
 pykolab/cli/commands.py           |    1 
 pykolab/wap_client/__init__.py    |  253 ++++++++++++++++++++++----------------
 6 files changed, 208 insertions(+), 127 deletions(-)

New commits:
commit 0bae4c3a4a95245406f4f3f2f59e5cfbe9138ead
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jul 31 15:10:24 2014 +0200

    Add a command list-users

diff --git a/pykolab/cli/cmd_list_users.py b/pykolab/cli/cmd_list_users.py
new file mode 100644
index 0000000..ff1ddef
--- /dev/null
+++ b/pykolab/cli/cmd_list_users.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2012 Kolab Systems AG (http://www.kolabsys.com)
+#
+# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import commands
+
+import pykolab
+
+from pykolab import utils
+from pykolab.translate import _
+
+log = pykolab.getLogger('pykolab.cli')
+conf = pykolab.getConf()
+
+def __init__():
+    commands.register('list_users', execute, description="List organizational units.")
+
+def execute(*args, **kw):
+    from pykolab import wap_client
+
+    wap_client.authenticate(username=conf.get("ldap", "bind_dn"), password=conf.get("ldap", "bind_pw"))
+
+    users = wap_client.users_list()
+    print '\n'.join(users['list'].keys())


commit 1105186d786bd1764b3c3b2cfb09ec6c97365f38
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jul 31 15:09:44 2014 +0200

    Add a variety of useful wap_client functions to write functional tests on top of

diff --git a/pykolab/wap_client/__init__.py b/pykolab/wap_client/__init__.py
index 299b847..bf35f79 100644
--- a/pykolab/wap_client/__init__.py
+++ b/pykolab/wap_client/__init__.py
@@ -67,6 +67,9 @@ def authenticate(username=None, password=None, domain=None):
 
     response = request('POST', "system.authenticate", post=post)
 
+    if not response:
+        return False
+
     if response.has_key('session_token'):
         session_id = response['session_token']
         return True
@@ -126,6 +129,31 @@ def form_value_generate(params):
 
     return request('POST', 'form_value.generate', post=post)
 
+def form_value_generate_password(*args, **kw):
+    return request('GET', 'form_value.generate_password')
+
+def form_value_list_options(object_type, object_type_id, attribute):
+    post = json.dumps(
+            {
+                    'object_type': object_type,
+                    'type_id': object_type_id,
+                    'attribute': attribute
+                }
+        )
+
+    return request('POST', 'form_value.list_options', post=post)
+
+def form_value_select_options(object_type, object_type_id, attribute):
+    post = json.dumps(
+            {
+                    'object_type': object_type,
+                    'type_id': object_type_id,
+                    'attributes': [ attribute ]
+                }
+        )
+
+    return request('POST', 'form_value.select_options', post=post)
+
 def get_group_input():
     group_types = group_types_list()
 
@@ -298,6 +326,21 @@ def ou_add(params={}):
 def ou_delete(params={}):
     return request('POST', 'ou.delete', post=json.dumps(params))
 
+def ou_find(params=None):
+    post = { 'search': { 'params': {} } }
+
+    for (k,v) in params.iteritems():
+        post['search']['params'][k] = { 'value': v, 'type': 'exact' }
+
+    return request('POST', 'ou.find', post=json.dumps(post))
+
+def ou_info(ou):
+    _params = { 'id': ou }
+
+    ou = request('GET', 'ou.info', get=_params)
+
+    return ou
+
 def ous_list(params={}):
     return request('POST', 'ous.list', post=json.dumps(params))
 
@@ -308,7 +351,6 @@ def request(method, api_uri, get=None, post=None, headers={}):
         del response_data['status']
         return response_data['result']
     else:
-        print "ERROR: %r" % (response_data['reason'])
         return False
 
 def request_raw(method, api_uri, get=None, post=None, headers={}):
@@ -345,9 +387,111 @@ def request_raw(method, api_uri, get=None, post=None, headers={}):
 
     return response_data
 
+def resource_add(params=None):
+    if params == None:
+        params = get_user_input()
+
+    return request('POST', 'resource.add', post=json.dumps(params))
+
+def resource_delete(params=None):
+    if params == None:
+        params = {
+            'id': utils.ask_question("Resource DN to delete", "resource")
+        }
+
+    return request('POST', 'resource.delete', post=json.dumps(params))
+
+def resource_find(params=None):
+    post = { 'search': { 'params': {} } }
+
+    for (k,v) in params.iteritems():
+        post['search']['params'][k] = { 'value': v, 'type': 'exact' }
+
+    return request('POST', 'resource.find', post=json.dumps(post))
+
+def resource_info(resource=None):
+    if resource == None:
+        resource = utils.ask_question("Resource DN")
+    return request('GET', 'resource.info', get={ 'id': resource })
+
+def resource_types_list():
+    return request('GET', 'resource_types.list')
+
+def resources_list(params={}):
+    return request('POST', 'resources.list', post=json.dumps(params))
+
+def role_add(params=None):
+    if params == None:
+        role_name = utils.ask_question("Role name")
+        params = {
+                'cn': role_name
+            }
+
+    params = json.dumps(params)
+
+    return request('POST', 'role.add', params)
+
 def role_capabilities():
     return request('GET', 'role.capabilities')
 
+def role_delete(params=None):
+    if params == None:
+        role_name = utils.ask_question("Role name")
+        role = role_find_by_attribute({'cn': role_name})
+        params = {
+                'role': role.keys()[0]
+            }
+
+    if not params.has_key('role'):
+        role = role_find_by_attribute(params)
+        params = {
+                'role': role.keys()[0]
+            }
+
+    post = json.dumps(params)
+
+    return request('POST', 'role.delete', post=post)
+
+def role_find_by_attribute(params=None):
+    if params == None:
+        role_name = utils.ask_question("Role name")
+    else:
+        role_name = params['cn']
+
+    get = { 'cn': role_name }
+    role = request('GET', 'role.find_by_attribute', get=get)
+
+    return role
+
+def role_info(role_name):
+    role = role_find_by_attribute({'cn': role_name})
+
+    get = { 'role': role['id'] }
+
+    role = request('GET', 'role.info', get=get)
+
+    return role
+
+def roles_list():
+    return request('GET', 'roles.list')
+
+def sharedfolder_add(params=None):
+    if params == None:
+        params = get_user_input()
+
+    return request('POST', 'sharedfolder.add', post=json.dumps(params))
+
+def sharedfolder_delete(params=None):
+    if params == None:
+        params = {
+            'id': utils.ask_question("Shared Folder DN to delete", "sharedfolder")
+        }
+
+    return request('POST', 'sharedfolder.delete', post=json.dumps(params))
+
+def sharedfolders_list(params={}):
+    return request('POST', 'sharedfolders.list', post=json.dumps(params))
+
 def system_capabilities():
     return request('GET', 'system.capabilities')
 
@@ -433,83 +577,6 @@ def user_form_value_generate(params=None):
 
     return request('POST', 'form_value.generate', post=post)
 
-def form_value_generate_password(*args, **kw):
-    return request('GET', 'form_value.generate_password')
-
-def form_value_list_options(object_type, object_type_id, attribute):
-    post = json.dumps(
-            {
-                    'object_type': object_type,
-                    'type_id': object_type_id,
-                    'attribute': attribute
-                }
-        )
-
-    return request('POST', 'form_value.list_options', post=post)
-
-def form_value_select_options(object_type, object_type_id, attribute):
-    post = json.dumps(
-            {
-                    'object_type': object_type,
-                    'type_id': object_type_id,
-                    'attributes': [ attribute ]
-                }
-        )
-
-    return request('POST', 'form_value.select_options', post=post)
-
-def role_find_by_attribute(params=None):
-    if params == None:
-        role_name = utils.ask_question("Role name")
-    else:
-        role_name = params['cn']
-
-    get = { 'cn': role_name }
-    role = request('GET', 'role.find_by_attribute', get=get)
-
-    return role
-
-def role_add(params=None):
-    if params == None:
-        role_name = utils.ask_question("Role name")
-        params = {
-                'cn': role_name
-            }
-
-    params = json.dumps(params)
-
-    return request('POST', 'role.add', params)
-
-def role_delete(params=None):
-    if params == None:
-        role_name = utils.ask_question("Role name")
-        role = role_find_by_attribute({'cn': role_name})
-        params = {
-                'role': role.keys()[0]
-            }
-
-    if not params.has_key('role'):
-        role = role_find_by_attribute(params)
-        params = {
-                'role': role.keys()[0]
-            }
-
-    post = json.dumps(params)
-
-    return request('POST', 'role.delete', post=post)
-
-def role_info(role_name):
-    role = role_find_by_attribute({'cn': role_name})
-
-    get = { 'role': role['id'] }
-
-    role = request('GET', 'role.info', get=get)
-
-    return role
-
-def roles_list():
-    return request('GET', 'roles.list')
-
 def user_form_value_generate_uid(params=None):
     if params == None:
         params = get_user_input()
@@ -532,34 +599,8 @@ def user_info(user=None):
 
     return user
 
-def user_types_list():
-    return request('GET', 'user_types.list')
-
 def users_list(params={}):
     return request('POST', 'users.list', post=json.dumps(params))
 
-def resource_types_list():
-    return request('GET', 'resource_types.list')
-
-def resources_list():
-    return request('GET', 'resources.list')
-
-def resource_info(resource=None):
-    if resource == None:
-        resource = utils.ask_question("Resource DN")
-    return request('GET', 'resource.info', get={ 'id': resource })
-
-def resource_add(params=None):
-    if params == None:
-        params = get_user_input()
-
-    return request('POST', 'resource.add', post=json.dumps(params))
-
-def resource_delete(params=None):
-    if params == None:
-        params = {
-            'id': utils.ask_question("Resource DN to delete", "resource")
-        }
-
-    return request('POST', 'resource.delete', post=json.dumps(params))
-
+def user_types_list():
+    return request('GET', 'user_types.list')


commit b50abf401de96dae1fa4a585eba6a135e1a39f11
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jul 31 15:09:06 2014 +0200

    Un-not-register the list-users command

diff --git a/pykolab/cli/commands.py b/pykolab/cli/commands.py
index 3139073..515d40c 100644
--- a/pykolab/cli/commands.py
+++ b/pykolab/cli/commands.py
@@ -55,7 +55,6 @@ def __init__():
 
     register('help', list_commands)
 
-    register('list_users', not_yet_implemented, description="Not yet implemented")
     register('delete_user', not_yet_implemented, description="Not yet implemented")
 
     register('list_groups', not_yet_implemented, description="Not yet implemented")


commit ae52e363418f07d5e485bcd9ba39ed8f25ba24d2
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jul 31 15:08:35 2014 +0200

    Do not issue a fatal error should deleting a mailbox not succeed

diff --git a/pykolab/cli/cmd_delete_mailbox.py b/pykolab/cli/cmd_delete_mailbox.py
index ce30c2b..ea64abc 100644
--- a/pykolab/cli/cmd_delete_mailbox.py
+++ b/pykolab/cli/cmd_delete_mailbox.py
@@ -57,5 +57,8 @@ def execute(*args, **kw):
         sys.exit(1)
 
     for delete_folder in delete_folders:
-        imap.delete_mailfolder(delete_folder)
+        try:
+            imap.delete_mailfolder(delete_folder)
+        except Exception, errmsg:
+            log.error(_("Could not delete mailbox '%s'") % (delete_folder))
 


commit 8d344ac056a6a987939ca65b4175e96ef7665b2c
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jul 31 15:06:40 2014 +0200

    If the engine cannot be created (such as when running functional tests as a non-root user), create the cache in memory).

diff --git a/pykolab/auth/ldap/__init__.py b/pykolab/auth/ldap/__init__.py
index 7249009..7bfccd7 100644
--- a/pykolab/auth/ldap/__init__.py
+++ b/pykolab/auth/ldap/__init__.py
@@ -1414,7 +1414,7 @@ class LDAP(pykolab.base.Base):
         success = True
         for _type in ['user','group','role','sharedfolder']:
             try:
-                eval("self._change_delete_%s(entry, change)" % (_type))
+                eval("success = self._change_delete_%s(entry, change)" % (_type))
             except:
                 success = False
 
@@ -2243,7 +2243,7 @@ class LDAP(pykolab.base.Base):
             try:
                 entry['type'] = self._entry_type(entry)
             except:
-                entry['type'] = "unknown"
+                entry['type'] = None
 
             log.debug(_("Entry type: %s") % (entry['type']), level=8)
 
@@ -2317,14 +2317,6 @@ class LDAP(pykolab.base.Base):
 #
 #                    server = self.imap.user_mailbox_server(folder)
 
-        log.debug(
-                _("Done with _synchronize_callback() for entry %r") % (
-                        entry['id']
-                    ),
-                level=9
-            )
-
-
     def _unbind(self):
         """
             Discard the current set of bind credentials.
diff --git a/pykolab/auth/ldap/cache.py b/pykolab/auth/ldap/cache.py
index eaf2ffa..07c3d28 100644
--- a/pykolab/auth/ldap/cache.py
+++ b/pykolab/auth/ldap/cache.py
@@ -175,9 +175,13 @@ def init_db(domain,reinit=False):
 
     db_uri = 'sqlite:///%s/%s.db' % (KOLAB_LIB_PATH, domain)
     echo = conf.debuglevel > 8
-    engine = create_engine(db_uri, echo=echo)
 
-    metadata.create_all(engine)
+    try:
+        engine = create_engine(db_uri, echo=echo)
+        metadata.create_all(engine)
+    except:
+        engine = create_engine('sqlite://')
+        metadata.create_all(engine)
 
     Session = sessionmaker(bind=engine)
     db = Session()
@@ -185,14 +189,17 @@ def init_db(domain,reinit=False):
     return db
 
 def last_modify_timestamp(domain):
-    db = init_db(domain)
-    last_change = db.query(Entry).order_by(desc(Entry.last_change)).first()
-
     modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format')
     if modifytimestamp_format == None:
         modifytimestamp_format = "%Y%m%d%H%M%SZ"
 
-    if not last_change == None:
-        return last_change.last_change.strftime(modifytimestamp_format)
-
-    return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format)
+    try:
+        db = init_db(domain)
+        last_change = db.query(Entry).order_by(desc(Entry.last_change)).first()
+
+        if not last_change == None:
+            return last_change.last_change.strftime(modifytimestamp_format)
+        else:
+            return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format)
+    except:
+        return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format)




More information about the commits mailing list