Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 8745)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 8746)
@@ -312,5 +312,5 @@
     """
 
-    def loggerInfo(ob_class, comment):
+    def writeLogMessage(view, comment):
         """Adds an INFO message to the log file
         """
Index: /main/waeup.aaue/trunk/src/waeup/aaue/etranzact/browser.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/etranzact/browser.py	(revision 8745)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/etranzact/browser.py	(revision 8746)
@@ -33,4 +33,6 @@
 from waeup.aaue.applicants.interfaces import ICustomApplicantOnlinePayment
 
+ACCEPTED_IP = None
+
 # Kofa's webservice
 
@@ -41,37 +43,53 @@
 
     def update(self, PAYEE_ID=None):
+        # It seems eTranzact sends a POST request with an empty body but the URL
+        # contains a query string. So it's actually a GET request pretended
+        # to be a POST request. Although this does not comply with the
+        # RFC 2616 HTTP guidelines we try to fetch the id from the QUERY_STRING
+        # value of the request.
+        real_ip = self.request.get('HTTP_X_FORWARDED_FOR', None)
+        if real_ip  and ACCEPTED_IP:
+            if real_ip != ACCEPTED_IP:
+                self.output = '-4'
+                return
+        if PAYEE_ID is None:
+            try:
+                PAYEE_ID = self.request['QUERY_STRING'].split('=')[1]
+            except:
+                self.output = '-2'
+                return
         cat = getUtility(ICatalog, name='payments_catalog')
         results = list(cat.searchResults(p_id=(PAYEE_ID, PAYEE_ID)))
         if len(results) != 1:
             self.output = '-1'
-        else:
-            try:
-                owner = IPaymentWebservice(results[0])
-                full_name = owner.display_fullname
-                matric_no = owner.id
-                faculty = owner.faculty
-                department = owner.department
-            except (TypeError, AttributeError):
-                self.output = '-1'
-                return
-            amount = results[0].amount_auth
-            payment_type = results[0].category
-            programme_type = results[0].p_item
-            academic_session = academic_sessions_vocab.getTerm(
-                results[0].p_session).title
-            status = results[0].p_state
-            self.output = (
-                'FULL_NAME=%s&' +
-                'FACULTY=%s&' +
-                'DEPARTMENT=%s&' +
-                'RETURN_TYPE=%s&' +
-                'PROGRAMME_TYPE=%s&' +
-                'PAYMENT_TYPE=%s&' +
-                'ACADEMIC_SESSION=%s&' +
-                'MATRIC_NO=%s&' +
-                'FEE_AMOUNT=%s&' +
-                'TRANSACTION_STATUS=%s') % (full_name, faculty,
-                department, PAYEE_ID, programme_type, payment_type,
-                academic_session, matric_no, amount, status)
+            return
+        try:
+            owner = IPaymentWebservice(results[0])
+            full_name = owner.display_fullname
+            matric_no = owner.id
+            faculty = owner.faculty
+            department = owner.department
+        except (TypeError, AttributeError):
+            self.output = '-3'
+            return
+        amount = results[0].amount_auth
+        payment_type = results[0].category
+        programme_type = results[0].p_item
+        academic_session = academic_sessions_vocab.getTerm(
+            results[0].p_session).title
+        status = results[0].p_state
+        self.output = (
+            'FULL_NAME=%s&' +
+            'FACULTY=%s&' +
+            'DEPARTMENT=%s&' +
+            'RETURN_TYPE=%s&' +
+            'PROGRAMME_TYPE=%s&' +
+            'PAYMENT_TYPE=%s&' +
+            'ACADEMIC_SESSION=%s&' +
+            'MATRIC_NO=%s&' +
+            'FEE_AMOUNT=%s&' +
+            'TRANSACTION_STATUS=%s') % (full_name, faculty,
+            department, PAYEE_ID, programme_type, payment_type,
+            academic_session, matric_no, amount, status)
         return
 
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/payments.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/payments.py	(revision 8745)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/payments.py	(revision 8746)
@@ -43,5 +43,6 @@
         return
 
-    def getStudent(self):
+    @property
+    def student(self):
         return self.__parent__.__parent__
 
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/studycourse.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/studycourse.py	(revision 8745)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/studycourse.py	(revision 8746)
@@ -38,5 +38,5 @@
     @property
     def next_session_allowed(self):
-        state = self.getStudent().state
+        state = self.student.state
         certificate = getattr(self, 'certificate', None)
         if certificate == None:
