Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 5757)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 5758)
@@ -25,6 +25,9 @@
 import waeup.sirp.browser
 from hurry.file import HurryFile
+from zc.sourcefactory.basic import BasicSourceFactory
 from zope import schema
-from zc.sourcefactory.basic import BasicSourceFactory
+from zope.interface import Interface, Attribute
+from zope.pluggableauth.interfaces import IPrincipalInfo
+from zope.security.interfaces import IGroupClosureAwarePrincipal as IPrincipal
 from waeup.sirp.image.schema import ImageFile
 from waeup.sirp.interfaces import IWAeUPObject, SimpleWAeUPVocabulary
@@ -688,2 +691,82 @@
         required = True,
         )
+
+class IApplicantPrincipalInfo(IPrincipalInfo):
+    """Infos about principals that are applicants.
+    """
+    reg_no = Attribute("The JAMB registration no. of the user")
+
+    access_code = Attribute("The Access Code the user purchased")
+
+class IApplicantPrincipal(IPrincipal):
+    """A principal that is an applicant.
+
+    This interface extends zope.security.interfaces.IPrincipal and
+    requires also an `id` and other attributes defined there.
+    """
+    reg_no = schema.TextLine(
+        title = u'Registration number',
+        description = u'The JAMB registration number',
+        required = True,
+        readonly = True)
+
+    access_code = schema.TextLine(
+        title = u'Access Code',
+        description = u'The access code purchased by the user.',
+        required = True,
+        readonly = True)
+
+class IApplicantsFormChallenger(Interface):
+    """A challenger that uses a browser form to collect applicant
+       credentials.
+    """
+    loginpagename = schema.TextLine(
+        title = u'Loginpagename',
+        description = u"""Name of the login form used by challenger.
+
+        The form must provide an ``access_code`` input field.
+        """)
+
+    accesscode_field = schema.TextLine(
+        title = u'Access code field',
+        description = u'''Field of the login page which is looked up for
+                          access_code''',
+        default = u'access_code',
+        )
+
+class IJAMBApplicantsFormChallenger(IApplicantsFormChallenger):
+    """A challenger that uses a browser form to collect applicant
+       credentials for applicants in JAMB process.
+
+       JAMB-screened applicants have to provide an extra registration
+       no. provided by JAMB.
+    """
+    jamb_reg_no_field = schema.TextLine(
+        title = u'JAMB registration no.',
+        description = u'''Field of the login page which is looked up for
+                          the JAMB registration number.''',
+        default = u'jamb_reg_no',
+        )
+
+class IApplicantSessionCredentials(Interface):
+    """Interface for storing and accessing applicant credentials in a
+       session.
+    """
+
+    def __init__(access_code):
+        """Create applicant session credentials."""
+
+    def getAccessCode():
+        """Return the access code."""
+
+
+class IJAMBApplicantSessionCredentials(IApplicantSessionCredentials):
+    """Interface for storing and accessing JAMB applicant credentials in a
+       session.
+    """
+
+    def __init__(access_code, jamb_reg_no):
+        """Create credentials for JAMB screened applicants."""
+
+    def getJAMBRegNo():
+        """Return the JAMB registration no."""
Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/browser.py	(revision 5757)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/browser.py	(revision 5758)
@@ -31,6 +31,6 @@
 from waeup.sirp.interfaces import IWAeUPObject
 from waeup.sirp.applicants.jambtables.util import get_applicant_data
-from waeup.sirp.applicants.jambtables.interfaces import (
-    IApplicant, IApplicantContainer, IApplicantPrincipal, IApplicantPDEEditData)
+from waeup.sirp.applicants.interfaces import (
+    IApplicant, IApplicantPrincipal, IApplicantPDEEditData)
 from waeup.sirp.widgets.passportwidget import (
     PassportWidget, PassportDisplayWidget
@@ -39,5 +39,5 @@
 from zope.formlib.sequencewidget import ListSequenceWidget, SequenceDisplayWidget
 from zope.formlib.widget import CustomWidgetFactory
-from waeup.sirp.applicants.jambtables.applicants import ResultEntry
+from waeup.sirp.applicants import ResultEntry
 from waeup.sirp.widgets.objectwidget import (
     WAeUPObjectWidget, WAeUPObjectDisplayWidget)
@@ -63,40 +63,40 @@
     MultiListDisplayWidget, subwidget=results_display_widget)
 
-class ApplicationsPage(WAeUPPage):
-    grok.context(IApplicantContainer)
-    grok.name('index')
-    title = 'Applications'
-    pnav = 1
-    
-    def getApplications(self):
-        """Get a list of all stored applications.
-        """
-        for key, val in self.context.items():
-            url = self.url(val)
-            yield(dict(url=url, name=key))
-
-class AddApplicant(WAeUPAddFormPage):
-    grok.context(IApplicantContainer)
-    grok.name('add')
-    form_fields = grok.AutoFields(IApplicant)
-    form_fields['fst_sit_results'].custom_widget = list_results_widget
-    form_fields['passport'].custom_widget = EncodingImageFileWidget
-    label = 'Add Applicant'
-    title = 'Add Applicant'
-    pnav = 1
-
-    @grok.action('Add applicant')
-    def addApplicant(self, **data):
-        from waeup.sirp.jambtables.applicants import Applicant
-        applicant = Applicant()
-        self.applyData(applicant, **data)
-        # XXX: temporarily disabled.
-        #self.context[applicant.reg_no] = applicant
-        try:
-            self.context[applicant.access_code] = applicant
-        except KeyError:
-            self.flash('The given access code is already in use!')
-            return
-        self.redirect(self.url(self.context))
+#class ApplicationsPage(WAeUPPage):
+#    grok.context(IApplicantContainer)
+#    grok.name('index')
+#    title = 'Applications'
+#    pnav = 1
+#    
+#    def getApplications(self):
+#        """Get a list of all stored applications.
+#        """
+#        for key, val in self.context.items():
+#            url = self.url(val)
+#            yield(dict(url=url, name=key))
+
+#class AddApplicant(WAeUPAddFormPage):
+#    grok.context(IApplicantContainer)
+#    grok.name('add')
+#    form_fields = grok.AutoFields(IApplicant)
+#    form_fields['fst_sit_results'].custom_widget = list_results_widget
+#    form_fields['passport'].custom_widget = EncodingImageFileWidget
+#    label = 'Add Applicant'
+#    title = 'Add Applicant'
+#    pnav = 1
+#
+#    @grok.action('Add applicant')
+#    def addApplicant(self, **data):
+#        from waeup.sirp.jambtables.applicants import Applicant
+#        applicant = Applicant()
+#        self.applyData(applicant, **data)
+#        # XXX: temporarily disabled.
+#        #self.context[applicant.reg_no] = applicant
+#        try:
+#            self.context[applicant.access_code] = applicant
+#        except KeyError:
+#            self.flash('The given access code is already in use!')
+#            return
+#        self.redirect(self.url(self.context))
 
 class DisplayApplicant(WAeUPDisplayFormPage):
Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/interfaces.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/interfaces.py	(revision 5757)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/jambtables/interfaces.py	(revision 5758)
@@ -39,5 +39,4 @@
     """A container that holds JAMB data tables.
     """
-        
 
 class IApplicantPDEImportData(IApplicantBaseData):
