Beispiel #1
0
def change_user_affiliation(geniuser, new_affiliation):
  """
  <Purpose>
     Sets a new affiliation for the user 
  <Arguments>
    geniuser
      A GeniUser object of the user whose affiliation is to be updated.
    new_affiliation
      the new affiliation value
  <Exceptions>
    ValidationError
      If the affiliation is provided and is invalid.
  <Side Effects>
    The geniuser affiliation gets changed to the new value(in the db).
  <Returns>
    None
  """
  assert_geniuser(geniuser)
  #Determines if the new affiliation is valid.  The frontend should already
  #checks for this but we validate again here just in case.
  validations.validate_affiliation(new_affiliation)
 
  
  # Lock the user.
  lockserver_handle = lockserver.create_lockserver_handle()
  lockserver.lock_user(lockserver_handle, geniuser.username)
  try:
    # Make sure the user still exists now that we hold the lock. Also makes
    # sure that we see any changes made to the user before we obtained the lock.
    # We don't use the user object we retrieve because we want the
    # object passed in to the function to reflect changes we make to the object.
    try:
      maindb.get_user(geniuser.username)
    except DoesNotExistError:
      raise InternalError(traceback.format_exc())

    maindb.set_user_affiliation(geniuser, new_affiliation)
  finally:
    # Unlock the user.
    lockserver.unlock_user(lockserver_handle, geniuser.username)
    lockserver.destroy_lockserver_handle(lockserver_handle)
Beispiel #2
0
def change_user_affiliation(geniuser, new_affiliation):
    """
  <Purpose>
     Sets a new affiliation for the user 
  <Arguments>
    geniuser
      A GeniUser object of the user whose affiliation is to be updated.
    new_affiliation
      the new affiliation value
  <Exceptions>
    ValidationError
      If the affiliation is provided and is invalid.
  <Side Effects>
    The geniuser affiliation gets changed to the new value(in the db).
  <Returns>
    None
  """
    assert_geniuser(geniuser)
    # Determines if the new affiliation is valid.  The frontend should already
    # checks for this but we validate again here just in case.
    validations.validate_affiliation(new_affiliation)

    # Lock the user.
    lockserver_handle = lockserver.create_lockserver_handle()
    lockserver.lock_user(lockserver_handle, geniuser.username)
    try:
        # Make sure the user still exists now that we hold the lock. Also makes
        # sure that we see any changes made to the user before we obtained the lock.
        # We don't use the user object we retrieve because we want the
        # object passed in to the function to reflect changes we make to the object.
        try:
            maindb.get_user(geniuser.username)
        except DoesNotExistError:
            raise InternalError(traceback.format_exc())

        maindb.set_user_affiliation(geniuser, new_affiliation)
    finally:
        # Unlock the user.
        lockserver.unlock_user(lockserver_handle, geniuser.username)
        lockserver.destroy_lockserver_handle(lockserver_handle)
Beispiel #3
0
def register_user(username, password, email, affiliation, pubkey=None):
    """
  <Purpose>
    Creates a user record with the specified information and sets any additional
    information necessary for the user record to be complete.
  <Arguments>
    username
    password
    email
    affiliation
    pubkey
      Optional. A string. If not provided, a key pair will be generated for this user.
  <Exceptions>
    UsernameAlreadyExistsError
      If there is already a user with the specified username.
    ValidationError
      If any of the arguments contains invalid values or if the username is the
      same as the password.
  <Side Effects>
    The user record in the django db is created as well as a user record in the
    corresponding user profile table that stores our custom information. A port
    will be assigned to the user and the user's donation keys will be set.
  <Returns>
    GeniUser instance (our GeniUser model, not the django User) corresponding to the
    newly registered user.
  """
    # If the frontend code that called this function wants to know which field
    # is invalid, it must call the validation functions itself before making the
    # call to register_user().
    # These will raise a ValidationError if any of the fields are invalid.
    # These ensure that the data is of the correct type (e.g. a string) as well as
    # that we like the content of the variable.
    validations.validate_username(username)
    validations.validate_password(password)
    validations.validate_username_and_password_different(username, password)
    validations.validate_email(email)
    validations.validate_affiliation(affiliation)
    if pubkey is not None:
        validations.validate_pubkey_string(pubkey)

    # Lock the user.
    lockserver_handle = lockserver.create_lockserver_handle()
    lockserver.lock_user(lockserver_handle, username)
    try:
        # Ensure there is not already a user with this username.
        try:
            # Raises a DoesNotExistError if the user doesn't exist.
            maindb.get_user(username)
            raise UsernameAlreadyExistsError
        except DoesNotExistError:
            # This is what we wanted: the username isn't already taken.
            pass

        # Get a key pair from the keygen api if the user didn't supply their own pubkey.
        if pubkey is None:
            (pubkey, privkey) = keygen.generate_keypair()
        else:
            privkey = None

        # Generate a donor key for this user. This is done through the backend
        # as the private key must be stored in the keydb, which the website cannot
        # directly access.
        keydescription = "donor:" + username
        donor_pubkey = backend.generate_key(keydescription)

        # Create the user record.
        geniuser = maindb.create_user(username, password, email, affiliation, pubkey, privkey, donor_pubkey)

    finally:
        # Unlock the user.
        lockserver.unlock_user(lockserver_handle, username)
        lockserver.destroy_lockserver_handle(lockserver_handle)

    return geniuser
Beispiel #4
0
 def clean_affiliation(self):
     value = self.cleaned_data['affiliation']
     try:
         validations.validate_affiliation(value)
     except ValidationError, err:
         raise forms.ValidationError, str(err)
Beispiel #5
0
 def clean_affiliation(self):
   value = self.cleaned_data['affiliation']
   try:
     validations.validate_affiliation(value)
   except ValidationError, err:
     raise forms.ValidationError, str(err)
Beispiel #6
0
def register_user(username, password, email, affiliation, pubkey=None):
  """
  <Purpose>
    Creates a user record with the specified information and sets any additional
    information necessary for the user record to be complete.
  <Arguments>
    username
    password
    email
    affiliation
    pubkey
      Optional. A string. If not provided, a key pair will be generated for this user.
  <Exceptions>
    UsernameAlreadyExistsError
      If there is already a user with the specified username.
    ValidationError
      If any of the arguments contains invalid values or if the username is the
      same as the password.
  <Side Effects>
    The user record in the django db is created as well as a user record in the
    corresponding user profile table that stores our custom information. A port
    will be assigned to the user and the user's donation keys will be set.
  <Returns>
    GeniUser instance (our GeniUser model, not the django User) corresponding to the
    newly registered user.
  """
  # If the frontend code that called this function wants to know which field
  # is invalid, it must call the validation functions itself before making the
  # call to register_user().
  # These will raise a ValidationError if any of the fields are invalid.
  # These ensure that the data is of the correct type (e.g. a string) as well as
  # that we like the content of the variable.
  validations.validate_username(username)
  validations.validate_password(password)
  validations.validate_username_and_password_different(username, password)
  validations.validate_email(email)
  validations.validate_affiliation(affiliation)
  if pubkey is not None:
    validations.validate_pubkey_string(pubkey)
  
  # Lock the user.
  lockserver_handle = lockserver.create_lockserver_handle()
  lockserver.lock_user(lockserver_handle, username)
  try:
    # Ensure there is not already a user with this username.
    try:
      # Raises a DoesNotExistError if the user doesn't exist.
      maindb.get_user(username)
      raise UsernameAlreadyExistsError
    except DoesNotExistError:
      # This is what we wanted: the username isn't already taken.
      pass
    
    # Get a key pair from the keygen api if the user didn't supply their own pubkey.
    if pubkey is None:
      (pubkey, privkey) = keygen.generate_keypair()
    else:
      privkey = None
    
    # Generate a donor key for this user. This is done through the backend
    # as the private key must be stored in the keydb, which the website cannot
    # directly access.
    keydescription = "donor:" + username
    donor_pubkey = backend.generate_key(keydescription)
    
    # Create the user record.
    geniuser = maindb.create_user(username, password, email, affiliation, pubkey, privkey, donor_pubkey)
    
  finally:
    # Unlock the user.
    lockserver.unlock_user(lockserver_handle, username)
    lockserver.destroy_lockserver_handle(lockserver_handle)
    
  return geniuser