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