trash our own brew of xmlrpc, that was all about supporting <nil/>
[plcapi.git] / PLC / Methods / VerifyPerson.py
index 652a081..b34506a 100644 (file)
@@ -3,7 +3,7 @@ import base64
 import time
 import urllib
 
-from PLC.Debug import log
+from PLC.Logger import logger
 from PLC.Faults import *
 from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
@@ -36,24 +36,24 @@ class VerifyPerson(Method):
         Auth(),
         Mixed(Person.fields['person_id'],
               Person.fields['email']),
-       Person.fields['verification_key'],
+        Person.fields['verification_key'],
         Person.fields['verification_expires']
         ]
 
     returns = Parameter(int, '1 if verification_key is valid')
 
     def call(self, auth, person_id_or_email, verification_key = None, verification_expires = None):
-       # Get account information
+        # Get account information
         persons = Persons(self.api, [person_id_or_email])
         if not persons:
-            raise PLCInvalidArgument, "No such account"
+            raise PLCInvalidArgument, "No such account %r"%person_id_or_email
         person = persons[0]
 
         if person['peer_id'] is not None:
-            raise PLCInvalidArgument, "Not a local account"
+            raise PLCInvalidArgument, "Not a local account %r"%person_id_or_email
 
         if person['enabled']:
-            raise PLCInvalidArgument, "Account must be new (disabled)"
+            raise PLCInvalidArgument, "Account %r must be new (disabled)"%person_id_or_email
 
         # Get the primary site name
         person_sites = Sites(self.api, person['site_ids'])
@@ -67,12 +67,32 @@ class VerifyPerson(Method):
         # Base64 encode their string representation
         random_key = base64.b64encode("".join(map(chr, bytes)))
 
-        if verification_key is not None:
+        if verification_key is None or \
+        (verification_key is not None and person['verification_expires'] and \
+        person['verification_expires'] < time.time()):
+            # Only allow one verification at a time
+            if person['verification_expires'] is not None and \
+               person['verification_expires'] > time.time():
+                raise PLCPermissionDenied, "Verification request already pending"
+
+            if verification_expires is None:
+                verification_expires = int(time.time() + (24 * 60 * 60))
+
+            person['verification_key'] = random_key
+            person['verification_expires'] = verification_expires
+            person.sync()
+
+            # Send e-mail to user
+            To = ("%s %s" % (person['first_name'], person['last_name']), person['email'])
+            Cc = None
+
+            message_id = 'Verify account'
+
+
+        elif verification_key is not None:
             if person['verification_key'] is None or \
-               person['verification_expires'] is None or \
-               person['verification_expires'] < time.time():
-                person.delete()
-                raise PLCPermissionDenied, "Verification key has expired. Please re-register."
+               person['verification_expires'] is None:
+                raise PLCPermissionDenied, "Invalid Verification key"
             elif person['verification_key'] != verification_key:
                 raise PLCPermissionDenied, "Verification key incorrect"
             else:
@@ -85,7 +105,7 @@ class VerifyPerson(Method):
                 for site in person_sites:
                     person_ids.update(site['person_ids'])
                 persons = Persons(self.api, person_ids)
-                pis = filter(lambda person: 'pi' in person['roles'], persons)
+                pis = filter(lambda person: 'pi' in person['roles'] and person['enabled'], persons)
 
                 # Send e-mail to PI(s) and copy the user
                 To = [("%s %s" % (pi['first_name'], pi['last_name']), pi['email']) for pi in pis]
@@ -98,24 +118,6 @@ class VerifyPerson(Method):
                     message_id = 'New PI account'
                 else:
                     message_id = 'New account'
-        else:
-            # Only allow one verification at a time
-            if person['verification_expires'] is not None and \
-               person['verification_expires'] > time.time():
-                raise PLCPermissionDenied, "Verification request already pending"
-
-            if verification_expires is None:
-                verification_expires = int(time.time() + (24 * 60 * 60))
-
-            person['verification_key'] = random_key
-            person['verification_expires'] = verification_expires
-            person.sync()
-
-            # Send e-mail to user
-            To = ("%s %s" % (person['first_name'], person['last_name']), person['email'])
-            Cc = None
-
-            message_id = 'Verify account'
 
         messages = Messages(self.api, [message_id])
         if messages:
@@ -141,10 +143,14 @@ class VerifyPerson(Method):
                      Subject = message['subject'] % params,
                      Body = message['template'] % params)
         else:
-            print >> log, "Warning: No message template '%s'" % message_id
+            logger.warning("No message template '%s'" % message_id)
 
-       # Logging variables
-        self.object_ids = [person['person_id']]
+        # Logging variables
+        self.event_objects = {'Person': [person['person_id']]}
         self.message = message_id
 
+        if verification_key is not None and person['verification_expires'] and \
+        person['verification_expires'] < time.time():
+            raise PLCPermissionDenied, "Verification key has expired. Another email has been sent."
+
         return 1