예제 #1
0
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)

    """
예제 #2
0
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)

    '''
예제 #3
0
파일: members.py 프로젝트: ot4me/mematool
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'))