Beispiel #1
0
    def add_user(self, name, public_key=None, override=True):
        if (name in self.users) and (not override):
            return

        validations.validate_username(name)

        if public_key:
            validations.validate_public_key(public_key)

        self.users[name] = {'public_key': public_key}
Beispiel #2
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 #3
0
 def clean_username(self):
     value = self.cleaned_data['username']
     try:
         validations.validate_username(value)
     except ValidationError, err:
         raise forms.ValidationError, str(err)
Beispiel #4
0
 def clean_username(self):
   value = self.cleaned_data['username']
   try:
     validations.validate_username(value)
   except ValidationError, err:
     raise forms.ValidationError, str(err)
Beispiel #5
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