Exemplo n.º 1
0
    def authenticateCredentials(self, credentials):
        """ See IAuthenticationPlugin.

        o We expect the credentials to be those returned by
          ILoginPasswordExtractionPlugin.
        """
        login = credentials.get('login')
        password = credentials.get('password')

        if login is None or password is None:
            return None

        # We can't depend on security when authenticating the user,
        # or we'll get stuck in loops
        mbtool = getToolByName(self, TOOLNAME)
        member = mbtool.getUserAuthProvider(login)
        if member is None:
            return None
        # Check workflow state is active
        wftool = getToolByName(self, 'portal_workflow')
        review_state = wftool.getInfoFor(member, 'review_state')
        wfmapper = ICategoryMapper(mbtool)
        cat_set = generateCategorySetIdForType(member.portal_type)
        if not wfmapper.isInCategory(cat_set, ACTIVE_STATUS_CATEGORY,
                                     review_state):
            return None
        # Delegate to member object
        member = IMembraneUserAuth(member)
        return member.authenticateCredentials(credentials)
Exemplo n.º 2
0
 def testStatusCategoriesGetCleared(self):
     mt = getattr(self.portal, TOOLNAME)
     pt = 'TestMember'
     cat_map = ICategoryMapper(mt)
     cat_set = generateCategorySetIdForType(pt)
     self.failUnless(cat_map.hasCategorySet(cat_set))
     mt.unregisterMembraneType(pt)
     self.failIf(cat_map.hasCategorySet(cat_set))
Exemplo n.º 3
0
 def testMembraneActiveWorkflowMapping(self):
     states = { 'TrainingCenter' : ['active', 'inactive'],
                'eduMember'      : ['active', 'inactive'],
                }
     categoryMap = ICategoryMapper(self.portal.membrane_tool)
     for t, s in states.items():
         categorySet = generateCategorySetIdForType(t)
         self.assertEquals(s, categoryMap.listCategoryValues(categorySet, ACTIVE_STATUS_CATEGORY))
Exemplo n.º 4
0
def removeStatusCategories(event):
    """
    Removes the related status categories from the category mapper
    when a membrane type is unregistered.
    """
    cat_map = ICategoryMapper(event.tool)
    cat_set = generateCategorySetIdForType(event.portal_type)
    cat_map.delCategorySet(cat_set)
Exemplo n.º 5
0
 def __call__(self):
     types = self.request.get('types', [])
     for portal_type in types:
         states = self.request.get("%s_active_states" % portal_type, [])
         cat_set = generateCategorySetIdForType(portal_type)
         self.cat_map.replaceCategoryValues(cat_set,
                                            ACTIVE_STATUS_CATEGORY,
                                            states)
     return self.template()
Exemplo n.º 6
0
    def getRoles(self):
        """Get roles for this team-group.
        
        Return an empty list of roles if the team is in a workflow state
        that is not active in membrane_tool.
        """
        mb = getToolByName(self.context, MEMBRANE_TOOL)
        wf = getToolByName(self.context, "portal_workflow")

        reviewState = wf.getInfoFor(self.context, "review_state")
        wfmapper = ICategoryMapper(mb)
        categories = generateCategorySetIdForType(self.context.portal_type)
        if wfmapper.isInCategory(categories, ACTIVE_STATUS_CATEGORY, reviewState):
            return self.context.getRoles()
        else:
            return ()
Exemplo n.º 7
0
def initializeStatusCategories(event):
    """
    Initializes the category sets and categories of a category mapper
    to be used to track "active" workflow states for a membrane type.
    Triggered when a new membrane type is registered.  Defaults to all
    workflow states being active.
    """
    cat_map = ICategoryMapper(event.tool)
    cat_set = generateCategorySetIdForType(event.portal_type)
    cat_map.addCategorySet(cat_set)
    cat_map.addCategory(cat_set, ACTIVE_STATUS_CATEGORY)

    states = getAllWFStatesForType(event.tool, event.portal_type)
    for state in states:
        cat_map.addToCategory(cat_set, ACTIVE_STATUS_CATEGORY,
                              state)
Exemplo n.º 8
0
 def testStatusCategoriesAreInitialized(self):
     mt = getattr(self.portal, TOOLNAME)
     cat_map = ICategoryMapper(mt)
     for pt in ['TestMember', 'TestGroup']:
         cat_set = generateCategorySetIdForType(pt)
         self.failUnless(cat_map.hasCategorySet(cat_set))
         self.failUnless(cat_map.hasCategory(cat_set,
                                             ACTIVE_STATUS_CATEGORY))
         wft = getattr(self.portal, 'portal_workflow')
         chain = wft.getChainForPortalType(pt)
         for wfid in chain:
             wf = getattr(wft, wfid)
             states = wf.states.objectIds()
             for state in states:
                 self.failUnless(cat_map.isInCategory(cat_set,
                                                      ACTIVE_STATUS_CATEGORY,
                                                      state))
Exemplo n.º 9
0
 def testAuthenticateActiveStatesOnly(self):
     mbtool = getattr(self.portal, TOOLNAME)
     wftool = getattr(self.portal, 'portal_workflow')
     authcred = self.portal.pmm.authenticateCredentials
     credentials = {'login':'******', 'password':'******'}
     cat_map = ICategoryMapper(mbtool)
     cat_set = generateCategorySetIdForType(self.member.portal_type)
     mem_state = wftool.getInfoFor(self.member, 'review_state')
     right = (IMembraneUserAuth(self.member).getUserId(),
              self.member.getUserName())
     self.failUnlessEqual(authcred(credentials), right)
     cat_map.removeFromCategory(cat_set, ACTIVE_STATUS_CATEGORY,
                                mem_state)
     self.failUnlessEqual(authcred(credentials), None)
     cat_map.addToCategory(cat_set, ACTIVE_STATUS_CATEGORY,
                           mem_state)
     self.failUnlessEqual(authcred(credentials), right)
Exemplo n.º 10
0
    def _extractMembraneTypes(self):
        cat_map = ICategoryMapper(self.context)
        fragment = self._doc.createDocumentFragment()

        for mtype in self.context.listMembraneTypes():
            # extract the membrane types
            child = self._doc.createElement('membrane-type')
            child.setAttribute('name', mtype)

            # extract the "active" w/f states for the type
            cat_set = generateCategorySetIdForType(mtype)
            states = cat_map.listCategoryValues(cat_set,
                                                ACTIVE_STATUS_CATEGORY)
            for state in states:
                sub = self._doc.createElement('active-workflow-state')
                sub.setAttribute('name', state)
                child.appendChild(sub)

            fragment.appendChild(child)
        return fragment
Exemplo n.º 11
0
    def _initMembraneTypes(self, node):
        for child in node.childNodes:
            if child.nodeName != 'membrane-type':
                continue

            # register membrane types
            mtype = str(child.getAttribute('name'))
            if mtype and mtype not in self.context.listMembraneTypes():
                self.context.registerMembraneType(mtype)

            # register "active" workflow states
            cat_map = ICategoryMapper(self.context)
            states = []
            for sub in child.childNodes:
                if sub.nodeName != 'active-workflow-state':
                    continue
                state = str(sub.getAttribute('name'))
                if state and state not in states:
                    states.append(state)
            if states:
                cat_set = generateCategorySetIdForType(mtype)
                cat_map.replaceCategoryValues(cat_set,
                                              ACTIVE_STATUS_CATEGORY,
                                              states)
Exemplo n.º 12
0
def install(self):
    """ Do stuff that GS will do for us soon ..
    """
    out = StringIO()

    # XXX: this doesn't actually work, as it steps on work done in
    # Install.py
    #
    # Note that we can apply profiles after adding a Plone site using
    # instancemanager: does it make more sense to leave it to
    # instancemanager?
    #
    # # Apply membrane and remember profiles (we can't QI them)
    # membrane_tool = getToolByName(self, 'membrane_tool')
    # if not membrane_tool:
    #     setup_tool = getToolByName(self, 'portal_setup')
    #     for p in ('membrane', 'remember', ):
    #         setup_tool.setImportContext('profile-%s:default' % p)
    #         out.write( 'Switched to profile: %s \n' % p)
    #         result = setup_tool.runAllImportSteps()
    #         print >>out,  'Steps run: %s \n' % ', '.join(result['steps'])

    # Change default member to MemberOfPublic
    plone = getToolByName(self, "portal_url").getPortalObject()
    adder = getAdderUtility(plone)
    adder.default_member_type = "MemberOfPublic"

    # Require approval for the adding of plain old members
    workflow_tool = getToolByName(self, "portal_workflow")
    workflow_tool.setChainForPortalTypes(["Member"], "MemberApprovalWorkflow")

    # Repair status_map for our new types.
    # TODO: setting their workflow *after* registering the types in
    # TODO: Install.py messes with the default active state(s) of the
    # TODO: members. Fix AGX to generate them after workflow
    # TODO: registration.
    membrane_tool = getToolByName(self, "membrane_tool")
    cat_map = ICategoryMapper(membrane_tool)
    for portal_type in ["MemberOfParliament", "Staff", "MemberOfPublic"]:
        cat_set = generateCategorySetIdForType(portal_type)
        # states = getAllWFStatesForType(self, portal_type)
        states = ACTIVE_MEMBRANE_STATES[portal_type]
        cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states)

    # Change the default workflow
    workflow_tool = getToolByName(self, "portal_workflow")
    workflow_tool.setDefaultChain("BungeniWorkflow")
    workflow_tool.setChainForPortalTypes(["Folder", "Large Plone Folder"], "BungeniWorkflow")
    workflow_tool.updateRoleMappings()

    # Enable syndication
    # XXX: Figure out a better way to identify the content that needs syndication
    syndication_tool = getToolByName(self, "portal_syndication")
    if not syndication_tool.isSiteSyndicationAllowed():
        syndication_tool.editProperties(isAllowed=1)
    if not syndication_tool.isSyndicationAllowed(self.events):
        syndication_tool.enableSyndication(self.events)

    # # Change the default roles managed by teams
    # teams_tool = getToolByName(self, 'portal_teams')
    # allowed_roles = teams_tool.getDefaultAllowedRoles()
    # teams_tool.setDefaultAllowedRoles(
    #         allowed_roles+['ReviewerForSpeaker', 'CurrentMP'])
    teams_tool = getToolByName(self, "portal_teams")
    teams_tool.setAllowedTeamTypes(TEAM_TYPES)

    # Replace the default MailHost with a MaildropHost
    if shasattr(plone, "MailHost") and plone.MailHost.meta_type != "Secure Maildrop Host":
        plone.manage_delObjects("MailHost")
    if not shasattr(plone, "MailHost"):
        plone.manage_addProduct["SecureMaildropHost"].manage_addSecureMaildropHost("MailHost")

    return out.getvalue()
Exemplo n.º 13
0
def install(self):
    """ Do stuff that GS will do for us soon ..
    """
    out = StringIO()

    # XXX: this doesn't actually work, as it steps on work done in
    # Install.py
    #
    # Note that we can apply profiles after adding a Plone site using
    # instancemanager: does it make more sense to leave it to
    # instancemanager?
    #
    # # Apply membrane and remember profiles (we can't QI them)
    # membrane_tool = getToolByName(self, 'membrane_tool')
    # if not membrane_tool:
    #     setup_tool = getToolByName(self, 'portal_setup')
    #     for p in ('membrane', 'remember', ):
    #         setup_tool.setImportContext('profile-%s:default' % p)
    #         out.write( 'Switched to profile: %s \n' % p)
    #         result = setup_tool.runAllImportSteps()
    #         print >>out,  'Steps run: %s \n' % ', '.join(result['steps'])

    # Change default member to MemberOfPublic
    plone = getToolByName(self, 'portal_url').getPortalObject()
    adder = getAdderUtility(plone)
    adder.default_member_type = 'MemberOfPublic'

    # Require approval for the adding of plain old members
    workflow_tool = getToolByName(self, 'portal_workflow')
    workflow_tool.setChainForPortalTypes(['Member'], "MemberApprovalWorkflow")

    # Repair status_map for our new types.
    # TODO: setting their workflow *after* registering the types in
    # TODO: Install.py messes with the default active state(s) of the
    # TODO: members. Fix AGX to generate them after workflow
    # TODO: registration.
    membrane_tool = getToolByName(self, 'membrane_tool')
    cat_map = ICategoryMapper(membrane_tool)
    for portal_type in ['MemberOfParliament', 'Staff', 'MemberOfPublic']:
        cat_set = generateCategorySetIdForType(portal_type)
        # states = getAllWFStatesForType(self, portal_type)
        states = ACTIVE_MEMBRANE_STATES[portal_type]
        cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states)

    # Change the default workflow
    workflow_tool = getToolByName(self, 'portal_workflow')
    workflow_tool.setDefaultChain('BungeniWorkflow')
    workflow_tool.setChainForPortalTypes(['Folder', 'Large Plone Folder'],
                                         "BungeniWorkflow")
    workflow_tool.updateRoleMappings()

    # Enable syndication
    # XXX: Figure out a better way to identify the content that needs syndication
    syndication_tool = getToolByName(self, 'portal_syndication')
    if not syndication_tool.isSiteSyndicationAllowed():
        syndication_tool.editProperties(isAllowed=1)
    if not syndication_tool.isSyndicationAllowed(self.events):
        syndication_tool.enableSyndication(self.events)

    # # Change the default roles managed by teams
    # teams_tool = getToolByName(self, 'portal_teams')
    # allowed_roles = teams_tool.getDefaultAllowedRoles()
    # teams_tool.setDefaultAllowedRoles(
    #         allowed_roles+['ReviewerForSpeaker', 'CurrentMP'])
    teams_tool = getToolByName(self, 'portal_teams')
    teams_tool.setAllowedTeamTypes(TEAM_TYPES)

    # Replace the default MailHost with a MaildropHost
    if (shasattr(plone, 'MailHost')
            and plone.MailHost.meta_type != 'Secure Maildrop Host'):
        plone.manage_delObjects('MailHost')
    if not shasattr(plone, 'MailHost'):
        plone.manage_addProduct[
            'SecureMaildropHost'].manage_addSecureMaildropHost('MailHost')

    return out.getvalue()
Exemplo n.º 14
0
 def testActiveWFStates(self):
     cat_set = generateCategorySetIdForType(DEFAULT_MEMBER_TYPE)
     cat_map = ICategoryMapper(self.mbtool)
     states = cat_map.listCategoryValues(cat_set,
                                         ACTIVE_STATUS_CATEGORY)
     self.failUnless('private' in states and 'public' in states)
Exemplo n.º 15
0
 def activeStatesForType(self, portal_type):
     cat_set = generateCategorySetIdForType(portal_type)
     return self.cat_map.listCategoryValues(cat_set,
                                            ACTIVE_STATUS_CATEGORY)