Example #1
0
def create_user(arguments, request, response):
    """Create a new user."""
    # We can't pass the 'password' argument to the user creation method, so
    # strip that out (if it exists), then create the user, adding the password
    # after the fact if successful.
    password = arguments.pop('password', None)
    is_server_owner = arguments.pop('is_server_owner', False)
    user_manager = getUtility(IUserManager)
    try:
        user = user_manager.create_user(**arguments)
    except ExistingAddressError as error:
        # The address already exists.  If the address already has a user
        # linked to it, raise an error, otherwise create a new user and link
        # it to this address.
        email = arguments.pop('email')
        user = user_manager.get_user(email)
        if user is None:
            address = user_manager.get_address(email)
            user = user_manager.create_user(**arguments)
            user.link(address)
        else:
            bad_request(
                response, 'User already exists: {}'.format(error.address))
            return None
    if password is None:
        # This will have to be reset since it cannot be retrieved.
        password = generate(int(config.passwords.password_length))
    user.password = config.password_context.encrypt(password)
    user.is_server_owner = is_server_owner
    location = path_to('users/{}'.format(user.user_id.int),
                       request.context['api_version'])
    created(response, location)
    return user
Example #2
0
def create_user(api, arguments, response):
    """Create a new user."""
    # We can't pass the 'password' argument to the user creation method, so
    # strip that out (if it exists), then create the user, adding the password
    # after the fact if successful.
    password = arguments.pop('password', None)
    is_server_owner = arguments.pop('is_server_owner', False)
    user_manager = getUtility(IUserManager)
    try:
        user = user_manager.create_user(**arguments)
    except ExistingAddressError as error:
        # The address already exists.  If the address already has a user
        # linked to it, raise an error, otherwise create a new user and link
        # it to this address.
        email = arguments.pop('email')
        user = user_manager.get_user(email)
        if user is None:
            address = user_manager.get_address(email)
            user = user_manager.create_user(**arguments)
            user.link(address)
        else:
            bad_request(
                response, 'User already exists: {}'.format(error.address))
            return None
    if password is None:
        # This will have to be reset since it cannot be retrieved.
        password = generate(int(config.passwords.password_length))
    user.password = config.password_context.encrypt(password)
    user.is_server_owner = is_server_owner
    user_id = api.from_uuid(user.user_id)
    location = api.path_to('users/{}'.format(user_id))
    created(response, location)
    return user
Example #3
0
 def create(self, request):
     """Create a new user."""
     try:
         validator = Validator(email=unicode,
                               display_name=unicode,
                               password=unicode,
                               _optional=('display_name', 'password'))
         arguments = validator(request)
     except ValueError as error:
         return http.bad_request([], str(error))
     # We can't pass the 'password' argument to the user creation method,
     # so strip that out (if it exists), then create the user, adding the
     # password after the fact if successful.
     password = arguments.pop('password', None)
     try:
         user = getUtility(IUserManager).create_user(**arguments)
     except ExistingAddressError as error:
         return http.bad_request([], b'Address already exists {0}'.format(
             error.email))
     if password is None:
         # This will have to be reset since it cannot be retrieved.
         password = generate(int(config.passwords.password_length))
     user.password = config.password_context.encrypt(password)
     location = path_to('users/{0}'.format(user.user_id.int))
     return http.created(location, [], None)
Example #4
0
 def join(self, list_id, subscriber,
          display_name=None,
          delivery_mode=DeliveryMode.regular,
          role=MemberRole.member):
     """See `ISubscriptionService`."""
     mlist = getUtility(IListManager).get_by_list_id(list_id)
     if mlist is None:
         raise NoSuchListError(list_id)
     # Is the subscriber an email address or user id?
     if isinstance(subscriber, str):
         if display_name is None:
             display_name, at, domain = subscriber.partition('@')
         # Because we want to keep the REST API simple, there is no
         # password or language given to us.  We'll use the system's
         # default language for the user's default language.  We'll set the
         # password to a system default.  This will have to get reset since
         # it can't be retrieved.  Note that none of these are used unless
         # the address is completely new to us.
         password = generate(int(config.passwords.password_length))
         return add_member(mlist, subscriber, display_name, password,
                           delivery_mode,
                           system_preferences.preferred_language, role)
     else:
         # We have to assume it's a UUID.
         assert isinstance(subscriber, UUID), 'Not a UUID'
         user = getUtility(IUserManager).get_user_by_id(subscriber)
         if user is None:
             raise MissingUserError(subscriber)
         return mlist.subscribe(user, role)
Example #5
0
 def join(self, list_id, subscriber,
          display_name=None,
          delivery_mode=DeliveryMode.regular,
          role=MemberRole.member):
     """See `ISubscriptionService`."""
     mlist = getUtility(IListManager).get_by_list_id(list_id)
     if mlist is None:
         raise NoSuchListError(list_id)
     # Is the subscriber an email address or user id?
     if isinstance(subscriber, basestring):
         if display_name is None:
             display_name, at, domain = subscriber.partition('@')
         # Because we want to keep the REST API simple, there is no
         # password or language given to us.  We'll use the system's
         # default language for the user's default language.  We'll set the
         # password to a system default.  This will have to get reset since
         # it can't be retrieved.  Note that none of these are used unless
         # the address is completely new to us.
         password = generate(int(config.passwords.password_length))
         return add_member(mlist, subscriber, display_name, password,
                           delivery_mode,
                           system_preferences.preferred_language, role)
     else:
         # We have to assume it's a UUID.
         assert isinstance(subscriber, UUID), 'Not a UUID'
         user = getUtility(IUserManager).get_user_by_id(subscriber)
         if user is None:
             raise MissingUserError(subscriber)
         return mlist.subscribe(user, role)
Example #6
0
    def add_members(self, mlist, args):
        """Add the members in a file to a mailing list.

        :param mlist: The mailing list to operate on.
        :type mlist: `IMailingList`
        :param args: The command line arguments.
        :type args: `argparse.Namespace`
        """
        if args.input_filename == '-':
            fp = sys.stdin
        else:
            fp = codecs.open(args.input_filename, 'r', 'utf-8')
        try:
            for line in fp:
                # Ignore blank lines and lines that start with a '#'.
                if line.startswith('#') or len(line.strip()) == 0:
                    continue
                # Parse the line and ensure that the values are unicodes.
                display_name, email = parseaddr(line)
                display_name = display_name.decode(fp.encoding)
                email = email.decode(fp.encoding)
                # Give the user a default, user-friendly password.
                password = generate(int(config.passwords.password_length))
                try:
                    add_member(mlist, email, display_name, password,
                               DeliveryMode.regular,
                               mlist.preferred_language.code)
                except AlreadySubscribedError:
                    # It's okay if the address is already subscribed, just
                    # print a warning and continue.
                    print('Already subscribed (skipping):',
                          email, display_name)
        finally:
            if fp is not sys.stdin:
                fp.close()
Example #7
0
    def add_members(self, mlist, args):
        """Add the members in a file to a mailing list.

        :param mlist: The mailing list to operate on.
        :type mlist: `IMailingList`
        :param args: The command line arguments.
        :type args: `argparse.Namespace`
        """
        if args.input_filename == '-':
            fp = sys.stdin
        else:
            fp = codecs.open(args.input_filename, 'r', 'utf-8')
        try:
            for line in fp:
                # Ignore blank lines and lines that start with a '#'.
                if line.startswith('#') or len(line.strip()) == 0:
                    continue
                # Parse the line and ensure that the values are unicodes.
                display_name, email = parseaddr(line)
                # Give the user a default, user-friendly password.
                password = generate(int(config.passwords.password_length))
                try:
                    add_member(mlist, email, display_name, password,
                               DeliveryMode.regular,
                               mlist.preferred_language.code)
                except AlreadySubscribedError:
                    # It's okay if the address is already subscribed, just
                    # print a warning and continue.
                    print('Already subscribed (skipping):',
                          email, display_name)
        finally:
            if fp is not sys.stdin:
                fp.close()
Example #8
0
def create_user(arguments, response):
    """Create a new user."""
    # We can't pass the 'password' argument to the user creation method, so
    # strip that out (if it exists), then create the user, adding the password
    # after the fact if successful.
    password = arguments.pop('password', None)
    try:
        user = getUtility(IUserManager).create_user(**arguments)
    except ExistingAddressError as error:
        bad_request(
            response, 'Address already exists: {}'.format(error.address))
        return None
    if password is None:
        # This will have to be reset since it cannot be retrieved.
        password = generate(int(config.passwords.password_length))
    user.password = config.password_context.encrypt(password)
    location = path_to('users/{}'.format(user.user_id.int))
    created(response, location)
    return user
Example #9
0
def create_user(arguments, response):
    """Create a new user."""
    # We can't pass the 'password' argument to the user creation method, so
    # strip that out (if it exists), then create the user, adding the password
    # after the fact if successful.
    password = arguments.pop('password', None)
    is_server_owner = arguments.pop('is_server_owner', False)
    try:
        user = getUtility(IUserManager).create_user(**arguments)
    except ExistingAddressError as error:
        bad_request(
            response, 'Address already exists: {}'.format(error.address))
        return None
    if password is None:
        # This will have to be reset since it cannot be retrieved.
        password = generate(int(config.passwords.password_length))
    user.password = config.password_context.encrypt(password)
    user.is_server_owner = is_server_owner
    location = path_to('users/{}'.format(user.user_id.int))
    created(response, location)
    return user