class TestLdapModelFactory(unittest.TestCase): def setUp(self): unittest.TestCase.setUp(self) self.username = "******" self.password = "******" ldap_connector = LdapConnector(username=self.username, password=self.password) self.ldapcon = ldap_connector.get_connection() self.ldmf = LdapModelFactory(self.ldapcon) def tearDown(self): unittest.TestCase.tearDown(self) self.ldapcon = None ################# User def test_getUser(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user, mematool.model.ldapmodel.Member) def test_getUserList(self): o = self.ldmf.getUserList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getActiveMemberList(self): o = self.ldmf.getActiveMemberList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getUserGroupList(self): o = self.ldmf.getUserGroupList(self.username) self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getHighestUidNumber(self): o = self.ldmf.getHighestUidNumber() self.assertIsInstance(o, str) self.assertRegexpMatches(o, r"^\d+$") o = int(o) self.assertGreaterEqual(o, 1000) def test_getUidNumberFromUid(self): o = self.ldmf.getUidNumberFromUid(self.username) self.assertIsInstance(o, str) self.assertRegexpMatches(o, r"^\d+$") o = int(o) self.assertGreaterEqual(o, 1000) """ def test_prepareVolatileAttribute(self): # @todo raise NotImplemented() def test__updateMember(self): # @todo raise NotImplemented() def test__addMember(self): # @todo raise NotImplemented() def test_deleteUser(self): # @todo raise NotImplemented() def test_changeUserGroup(self): # @todo raise NotImplemented() def test_updateAvatar(self): # @todo raise NotImplemented() """ ################# Group def test_getGroup(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user.groups, list) self.assertGreaterEqual(len(user.groups), 1) for g in user.groups: group = self.ldmf.getGroup(g) self.assertIsInstance(group, mematool.model.dbmodel.Group) def test_getGroupList(self): o = self.ldmf.getGroupList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getGroupMembers(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user.groups, list) self.assertGreaterEqual(len(user.groups), 1) for g in user.groups: o = self.ldmf.getGroupMembers(g) self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_addDeleteGroup(self): # add self.assertTrue(self.ldmf.addGroup("test_group")) o = self.ldmf.getGroupList() self.assertIn("test_group", o) # delete self.assertTrue(self.ldmf.deleteGroup("test_group")) o = self.ldmf.getGroupList() self.assertNotIn("test_group", o) def test_getHighestGidNumber(self): o = self.ldmf.getHighestGidNumber() self.assertIsInstance(o, str) self.assertRegexpMatches(o, r"^\d+$") o = int(o) self.assertGreaterEqual(o, 1000) ################# Domain def test_addDeleteDomain(self): res = self.ldmf.addDomain("example.com") self.assertTrue(res) res = self.ldmf.getDomainList() self.assertIn("example.com", res) res = self.ldmf.deleteDomain("example.com") self.assertTrue(res) res = self.ldmf.getDomainList() self.assertNotIn("example.com", res) def test_getDomain(self): res = self.ldmf.addDomain("example.com") self.assertTrue(res) d = self.ldmf.getDomain("example.com") self.assertIsInstance(d, mematool.model.ldapmodel.Domain) res = self.ldmf.deleteDomain("example.com") self.assertTrue(res) def test_getDomainList(self): res = self.ldmf.getDomainList() self.assertIsInstance(res, list) ################# Alias def test_getAlias(self): res = self.ldmf.addDomain("example.com") alias = mematool.model.ldapmodel.Alias() alias.dn_mail = "*****@*****.**" alias.mail = ["*****@*****.**"] alias.maildrop = ["*****@*****.**"] try: res = self.ldmf.addAlias(alias) self.assertTrue(res) except mematool.helpers.exceptions.EntryExists: pass res = self.ldmf.getAlias("*****@*****.**") self.assertIsInstance(res, mematool.model.ldapmodel.Alias) res = self.ldmf.deleteAlias("*****@*****.**") self.assertTrue(res) res = self.ldmf.deleteDomain("example.com") self.assertTrue(res) def test_getAliasList(self): res = self.ldmf.getAliasList("example.com") self.assertIsInstance(res, list) def test_getMaildropList(self): res = self.ldmf.getMaildropList("*****@*****.**") self.assertIsInstance(res, dict) def test_addDeleteAlias(self): res = self.ldmf.addDomain("example.com") # self.assertTrue(res) alias = mematool.model.ldapmodel.Alias() alias.dn_mail = "*****@*****.**" alias.mail = ["*****@*****.**"] alias.maildrop = ["*****@*****.**"] try: res = self.ldmf.addAlias(alias) self.assertTrue(res) except mematool.helpers.exceptions.EntryExists: pass res = self.ldmf.deleteAlias("*****@*****.**") self.assertTrue(res) res = self.ldmf.deleteDomain("example.com") self.assertTrue(res) """
class TestLdapModelFactory(unittest.TestCase): def setUp(self): unittest.TestCase.setUp(self) self.username = '******' self.password = '******' ldap_connector = LdapConnector(username=self.username, password=self.password) self.ldapcon = ldap_connector.get_connection() self.ldmf = LdapModelFactory(self.ldapcon) def tearDown(self): unittest.TestCase.tearDown(self) self.ldapcon = None ################# User def test_getUser(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user, mematool.model.ldapmodel.Member) def test_getUserList(self): o = self.ldmf.getUserList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getActiveMemberList(self): o = self.ldmf.getActiveMemberList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getUserGroupList(self): o = self.ldmf.getUserGroupList(self.username) self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getHighestUidNumber(self): o = self.ldmf.getHighestUidNumber() self.assertIsInstance(o, str) self.assertRegexpMatches(o, r'^\d+$') o = int(o) self.assertGreaterEqual(o, 1000) def test_getUidNumberFromUid(self): o = self.ldmf.getUidNumberFromUid(self.username) self.assertIsInstance(o, str) self.assertRegexpMatches(o, r'^\d+$') o = int(o) self.assertGreaterEqual(o, 1000) ''' def test_prepareVolatileAttribute(self): # @todo raise NotImplemented() def test__updateMember(self): # @todo raise NotImplemented() def test__addMember(self): # @todo raise NotImplemented() def test_deleteUser(self): # @todo raise NotImplemented() def test_changeUserGroup(self): # @todo raise NotImplemented() def test_updateAvatar(self): # @todo raise NotImplemented() ''' ################# Group def test_getGroup(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user.groups, list) self.assertGreaterEqual(len(user.groups), 1) for g in user.groups: group = self.ldmf.getGroup(g) self.assertIsInstance(group, mematool.model.dbmodel.Group) def test_getGroupList(self): o = self.ldmf.getGroupList() self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_getGroupMembers(self): user = self.ldmf.getUser(self.username) self.assertIsInstance(user.groups, list) self.assertGreaterEqual(len(user.groups), 1) for g in user.groups: o = self.ldmf.getGroupMembers(g) self.assertIsInstance(o, list) self.assertGreaterEqual(len(o), 1) def test_addDeleteGroup(self): # add self.assertTrue(self.ldmf.addGroup('test_group')) o = self.ldmf.getGroupList() self.assertIn('test_group', o) # delete self.assertTrue(self.ldmf.deleteGroup('test_group')) o = self.ldmf.getGroupList() self.assertNotIn('test_group', o) def test_getHighestGidNumber(self): o = self.ldmf.getHighestGidNumber() self.assertIsInstance(o, str) self.assertRegexpMatches(o, r'^\d+$') o = int(o) self.assertGreaterEqual(o, 1000) ################# Domain def test_addDeleteDomain(self): res = self.ldmf.addDomain('example.com') self.assertTrue(res) res = self.ldmf.getDomainList() self.assertIn('example.com', res) res = self.ldmf.deleteDomain('example.com') self.assertTrue(res) res = self.ldmf.getDomainList() self.assertNotIn('example.com', res) def test_getDomain(self): res = self.ldmf.addDomain('example.com') self.assertTrue(res) d = self.ldmf.getDomain('example.com') self.assertIsInstance(d, mematool.model.ldapmodel.Domain) res = self.ldmf.deleteDomain('example.com') self.assertTrue(res) def test_getDomainList(self): res = self.ldmf.getDomainList() self.assertIsInstance(res, list) ################# Alias def test_getAlias(self): res = self.ldmf.addDomain('example.com') alias = mematool.model.ldapmodel.Alias() alias.dn_mail = '*****@*****.**' alias.mail = ['*****@*****.**'] alias.maildrop = ['*****@*****.**'] try: res = self.ldmf.addAlias(alias) self.assertTrue(res) except mematool.helpers.exceptions.EntryExists: pass res = self.ldmf.getAlias('*****@*****.**') self.assertIsInstance(res, mematool.model.ldapmodel.Alias) res = self.ldmf.deleteAlias('*****@*****.**') self.assertTrue(res) res = self.ldmf.deleteDomain('example.com') self.assertTrue(res) def test_getAliasList(self): res = self.ldmf.getAliasList('example.com') self.assertIsInstance(res, list) def test_getMaildropList(self): res = self.ldmf.getMaildropList('*****@*****.**') self.assertIsInstance(res, dict) def test_addDeleteAlias(self): res = self.ldmf.addDomain('example.com') #self.assertTrue(res) alias = mematool.model.ldapmodel.Alias() alias.dn_mail = '*****@*****.**' alias.mail = ['*****@*****.**'] alias.maildrop = ['*****@*****.**'] try: res = self.ldmf.addAlias(alias) self.assertTrue(res) except mematool.helpers.exceptions.EntryExists: pass res = self.ldmf.deleteAlias('*****@*****.**') self.assertTrue(res) res = self.ldmf.deleteDomain('example.com') self.assertTrue(res) '''
class MembersController(BaseController): def __init__(self): super(MembersController, self).__init__() self.lmf = LdapModelFactory() @BaseController.needAdmin def __before__(self): super(MembersController, self).__before__() def _sidebar(self): super(MembersController, self)._sidebar() c.actions.append({'name' : _('Show all members'), 'args' : {'controller' : 'members', 'action' : 'showAllMembers'}}) c.actions.append({'name' : _('Add member'), 'args' : {'controller' : 'members', 'action' : 'addMember'}}) c.actions.append({'name' : _('Active members'), 'args' : {'controller' : 'members', 'action' : 'showActiveMembers'}}) c.actions.append({'name' : _('Former members'), 'args' : {'controller' : 'members', 'action' : 'showFormerMembers'}}) c.actions.append({'name' : _('Groups'), 'args' : {'controller' : 'groups', 'action' : 'index'}}) def index(self): return self.showAllMembers() @BaseController.needAdmin def addMember(self): c.heading = _('Add member') c.mode = 'add' c.groups = [] return render('/members/editMember.mako') def editMember(self): if (not 'member_id' in request.params): redirect(url(controller='members', action='showAllMembers')) try: member = self.lmf.getUser(request.params['member_id']) c.heading = _('Edit member') c.mode = 'edit' c.member = member if member.fullMember: c.member.full_member = 'checked' if member.lockedMember: c.member.locked_member = 'checked' return render('/members/editMember.mako') except LookupError: print 'No such user !' return 'ERROR 4x0' def checkMember(f): def new_f(self): # @TODO request.params may contain multiple values per key... test & fix if (not 'member_id' in request.params): redirect(url(controller='members', action='showAllMembers')) else: formok = True errors = [] try: ParamChecker.checkMode('mode', values=('add', 'edit')) except InvalidParameterFormat as ipf: formok = False errors.append(ipf.message) m = Member() for v in m.str_vars: setattr(m, v, request.params.get(v, '')) m.uid = request.params['member_id'] try: m.check() except InvalidParameterFormat as ipf: formok = False errors += ipf.message if request.params['mode'] == 'add' or not request.params.get('userPassword', '') == '': try: ParamChecker.checkPassword('userPassword', 'userPassword2') except InvalidParameterFormat as ipf: formok = False errors.append(ipf.message) if not formok: session['errors'] = errors session['reqparams'] = {} # @TODO request.params may contain multiple values per key... test & fix for k in request.params.iterkeys(): if (k == 'full_member' or k == 'locked_member') and request.params[k] == 'on': session['reqparams'][k] = 'checked' else: session['reqparams'][k] = request.params[k] session.save() if request.params['mode'] == 'add': redirect(url(controller='members', action='addMember')) else: redirect(url(controller='members', action='editMember', member_id=request.params['member_id'])) return f(self) return new_f @checkMember @restrict('POST') def doEditMember(self): try: if request.params['mode'] == 'edit': member = self.lmf.getUser(request.params['member_id']) else: member = Member() member.uid = request.params['member_id'] for v in member.str_vars: if v in request.params: setattr(member, v, request.params.get(v).lstrip(' ').rstrip(' ')) # @TODO review: for now we don't allow custom GIDs member.gidNumber = '100' member.cn = member.givenName + ' ' + member.sn member.homeDirectory = '/home/' + request.params['member_id'] if not request.params.get('userPassword', '') == '' and request.params['userPassword'] == request.params['userPassword2']: member.setPassword(request.params['userPassword']) if 'full_member' in request.params: member.fullMember = True else: member.fullMember = False if 'locked_member' in request.params: member.lockedMember = True else: member.lockedMember = False if 'spaceKey' in request.params: member.spaceKey = True else: member.spaceKey = False if 'npoMember' in request.params: member.npoMember = True else: member.npoMember = False if 'isMinor' in request.params: member.isMinor = True else: member.isMinor = False member.nationality = member.nationality.upper() if request.params['mode'] == 'edit': self.lmf.saveMember(member) else: self.lmf.saveMember(member) session['flash'] = _('Member details successfully edited') session.save() redirect(url(controller='members', action='editMember', member_id=request.params['member_id'])) except LookupError: print 'No such user !' # @TODO make much more noise ! redirect(url(controller='members', action='showAllMembers')) def showAllMembers(self, _filter='active'): try: c.heading = _('All members') members = self.lmf.getUsers() c.members = [] # make sure to clean out some vars for m in members: m.sambaNTPassword = '******' m.userPassword = '******' if _filter == 'active' and not m.lockedMember: c.members.append(m) elif _filter == 'former' and m.lockedMember: c.members.append(m) elif _filter == 'all': c.members.append(m) return render('/members/viewAll.mako') except LookupError as e: import sys, traceback traceback.print_exc(file=sys.stdout) print 'Lookup error!' print e pass except NoResultFound: print 'No such sql user !' return 'ERROR 4x0' def exportList(self): try: members = self.lmf.getUsers() c.members = [] # make sure to clean out some vars for m in members: m.sambaNTPassword = '******' m.userPassword = '******' if not m.lockedMember: c.members.append(m) if 'listType' in request.params and request.params['listType'] == 'RCSL': response.content_type = 'text/plain' return render('/members/exportRCSLCSV.mako') else: response.content_type = 'text/plain' return render('/members/exportCSV.mako') except LookupError as e: print 'Lookup error!' print e pass return 'ERROR 4x0' def showActiveMembers(self): return self.showAllMembers(_filter='active') def showFormerMembers(self): return self.showAllMembers(_filter='former') def validateMember(self): if (not 'member_id' in request.params): redirect(url(controller='members', action='showAllMembers')) try: member = self.lmf.getUser(request.params['member_id']) if member.validate: tm = Session.query(TmpMember).filter(TmpMember.id == member.uidNumber).first() member.cn = u'{0} {1}'.format(tm.gn, tm.sn) member.givenName = tm.gn member.sn = tm.sn member.homePostalAddress = tm.homePostalAddress member.homePhone = tm.phone member.mobile = tm.mobile member.mail = tm.mail member.xmppID = tm.xmppID self.lmf.saveMember(member) Session.delete(tm) Session.commit() self.postValidationMail(request.params['member_id'], member.mail, validated=True) else: session['flash'] = _('Nothing to validate!') except LookupError: session['flash'] = _('Member validation failed!') session.save() redirect(url(controller='members', action='showAllMembers')) def rejectValidation(self): if (not 'member_id' in request.params): redirect(url(controller='members', action='showAllMembers')) try: member = self.lmf.getUser(request.params['member_id']) if member.validate: tm = Session.query(TmpMember).filter(TmpMember.id == member.uidNumber).first() mail = tm.mail Session.delete(tm) Session.commit() self.postValidationMail(request.params['member_id'], mail, validated=False) else: session['flash'] = _('Nothing to reject!') except LookupError: session['flash'] = _('Failed to reject validation!') session.save() redirect(url(controller='members', action='showAllMembers')) def postValidationMail(self, member_id, member_mail, validated=True): if validated: validation_string = 'validated' else: validation_string = 'rejected' # office e-mail body = 'Hi,\n' body += session['identity'] + ' just ' + validation_string + ' the profile changes of the following member:\n' body += member_id + '\n\n' body += 'regards,\nMeMaTool' to = '*****@*****.**' subject = config.get('mematool.name_prefix') + ' mematool - request for validation - ' + validation_string self.sendMail(to, subject, body) # user e-mail body = 'Hi,\n' body += 'The office has just ' + validation_string + ' your profile changes.\n' body += 'If you don\'t agree with this decision, please contact them for more information.\n\n' body += 'regards,\nMeMaTool on behalf of the office' self.sendMail(member_mail, subject, body) def viewDiff(self): if not 'member_id' in request.params: redirect(url(controller='members', action='showAllMembers')) try: member = self.lmf.getUser(request.params['member_id']) if member.validate: c.heading = _('View diff') c.member = member tmpmember = Session.query(TmpMember).filter(TmpMember.id == member.uidNumber).first() c.tmpmember = tmpmember return render('/members/viewDiff.mako') except LookupError: print 'No such user !' return 'ERROR 4x0' @BaseController.needAdmin def deleteUser(self): try: member_id = request.params.get('member_id') self.lmf.deleteUser(member_id) aliases = self.lmf.getMaildropList(member_id) errors = '' for dn, attr in aliases.items(): if errors == '': errors = 'Could not auto-delete the following aliases:' m = re.match(r'^mail=([^,]+),', dn) if m: alias = m.group(1) url_ = url(controller='mails', action='editAlias', alias=alias) errors += '\n<br/><a href="{0}" target="_blank">{1}</a>'.format(url_, alias) if not errors == '': if not 'errors' in session: session['errors'] = [] session['errors'].append(literal(errors)) session['flash'] = _('User successfully deleted') session.save() except LookupError: session['flash'] = _('Failed to delete user') session.save() # @TODO make much more noise ! redirect(url(controller='members', action='showAllMembers'))