Beispiel #1
0
def update_authenticated_user():
    """Update one or multiple fields of the authenticated user."""
    # Load update request data
    user_info = AuthenticatedUserSchema(
        strict=True,
    ).load(request.json, partial=False).data

    if any(k in user_info for k in USER_READ_ONLY_FIELDS):
        abort(httplib.FORBIDDEN,
              "These fields are read-only: " + ', '.join(USER_READ_ONLY_FIELDS))

    # Patch in user_id manually (do not allow requests to change id)
    user_info['user_id'] = request.user.user_id

    # Ensure that user name is not taken
    if (user_info.get('user_name', request.user.user_name) != request.user.user_name and
        local.model.user_exists(user_info['user_name'], None)):
        abort(httplib.BAD_REQUEST, "User name %s is already taken." % user_info['user_name'])

    # Validate user name
    if not NAME_REGEX.match(user_info.get('user_name', request.user.user_name)):
        abort(httplib.BAD_REQUEST, "User name characters must be alphanumeric, underscores, periods, or dashes.")

    # Update user
    local.model.update_user_info(user_info)

    # Return updated user
    return AuthenticatedUserSchema().dump(local.model.get_user(request.user.user_id)).data
def update_authenticated_user():
    """Update one or multiple fields of the authenticated user."""
    # Load update request data
    user_info = AuthenticatedUserSchema(strict=True).load(request.json, partial=False).data

    if any(k in user_info for k in USER_READ_ONLY_FIELDS):
        abort(
            http.client.FORBIDDEN, "These fields are read-only: " + ', '.join(USER_READ_ONLY_FIELDS)
        )

    # Patch in user_id manually (do not allow requests to change id)
    user_info['user_id'] = request.user.user_id

    # Ensure that user name is not taken
    if user_info.get(
        'user_name', request.user.user_name
    ) != request.user.user_name and local.model.user_exists(user_info['user_name'], None):
        abort(http.client.BAD_REQUEST, "User name %s is already taken." % user_info['user_name'])

    # Validate user name
    if not NAME_REGEX.match(user_info.get('user_name', request.user.user_name)):
        abort(
            http.client.BAD_REQUEST,
            "User name characters must be alphanumeric, underscores, periods, or dashes.",
        )

    # Update user
    local.model.update_user_info(user_info)

    # Return updated user
    return AuthenticatedUserSchema().dump(local.model.get_user(request.user.user_id)).data
Beispiel #3
0
def update_authenticated_user():
    """Update one or multiple fields of the authenticated user."""
    # Load update request data
    try:
        user_info, errors = UserSchema(strict=True).load(request.json, partial=True)
    except ValidationError as err:
        message = ' '.join([e['detail'] for e in err.messages['errors']])
        abort(httplib.BAD_REQUEST, message)

    # Patch in user_id manually (do not allow requests to change id)
    user_info['user_id'] = request.user.user_id

    # Ensure that user name is not taken
    if (user_info.get('user_name', request.user.user_name) != request.user.user_name and
        local.model.user_exists(user_info['user_name'], None)):
        abort(httplib.BAD_REQUEST, "User name %s is already taken." % user_info['user_name'])

    # Validate user name
    if not NAME_REGEX.match(user_info.get('user_name', request.user.user_name)):
        abort(httplib.BAD_REQUEST, "User name characters must be alphanumeric, underscores, periods, or dashes.")

    # Update user
    local.model.update_user_info(user_info)

    # Return updated user
    return UserSchema().dump(local.model.get_user(request.user.user_id)).data
Beispiel #4
0
def do_signup():
    if request.user:
        return redirect(default_app().get_url(
            'success', message="You are already logged into your account."))

    success_uri = request.forms.get('success_uri')
    error_uri = request.forms.get('error_uri')
    username = request.forms.get('username')
    password = request.forms.get('password')
    email = request.forms.get('email')

    errors = []
    if request.forms.get('confirm_password') != password:
        errors.append("Passwords do not match.")

    if not spec_util.NAME_REGEX.match(username):
        errors.append(
            "Username must only contain letter, digits, hyphens, underscores, and periods."
        )

    try:
        User.validate_password(password)
    except UsageError as e:
        errors.append(e.message)

    # Only do a basic validation of email -- the only guaranteed way to check
    # whether an email address is valid is by sending an actual email.
    if not spec_util.BASIC_EMAIL_REGEX.match(email):
        errors.append("Email address is invalid.")

    if local.model.user_exists(username, email):
        errors.append("User with this username or email already exists.")

    if not NAME_REGEX.match(username):
        errors.append(
            "Username characters must be alphanumeric, underscores, periods, or dashes."
        )

    if errors:
        return redirect_with_query(
            error_uri, {
                'error': ' '.join(errors),
                'next': success_uri,
                'email': email,
                'username': username,
            })

    # Create unverified user
    _, verification_key = local.model.add_user(username, email, password)

    # Send key
    send_verification_key(username, email, verification_key)

    # Redirect to success page
    return redirect_with_query(success_uri, {'email': email})
Beispiel #5
0
def do_signup():
    if request.user:
        return redirect(default_app().get_url('success', message="You are already logged into your account."))

    success_uri = request.forms.get('success_uri')
    error_uri = request.forms.get('error_uri')
    username = request.forms.get('username')
    password = request.forms.get('password')
    email = request.forms.get('email')

    errors = []
    if request.forms.get('confirm_password') != password:
        errors.append("Passwords do not match.")

    if not spec_util.NAME_REGEX.match(username):
        errors.append("Username must only contain letter, digits, hyphens, underscores, and periods.")

    try:
        User.validate_password(password)
    except UsageError as e:
        errors.append(e.message)

    # Only do a basic validation of email -- the only guaranteed way to check
    # whether an email address is valid is by sending an actual email.
    if not spec_util.BASIC_EMAIL_REGEX.match(email):
        errors.append("Email address is invalid.")

    if local.model.user_exists(username, email):
        errors.append("User with this username or email already exists.")

    if not NAME_REGEX.match(username):
        errors.append("Username characters must be alphanumeric, underscores, periods, or dashes.")

    if errors:
        return redirect_with_query(error_uri, {
            'error': ' '.join(errors),
            'next': success_uri,
            'email': email,
            'username': username,
        })

    # Create unverified user
    _, verification_key = local.model.add_user(username, email, password)

    # Send key
    send_verification_key(username, email, verification_key)

    # Redirect to success page
    return redirect_with_query(success_uri, {
        'email': email
    })
Beispiel #6
0
def do_signup():
    if request.user.is_authenticated:
        return redirect(default_app().get_url(
            'success', message="You are already logged into your account."))

    success_uri = request.forms.get('success_uri')
    error_uri = request.forms.get('error_uri')
    username = request.forms.get('username')
    email = request.forms.get('email')
    first_name = request.forms.get('first_name')
    last_name = request.forms.get('last_name')
    password = request.forms.get('password')
    affiliation = request.forms.get('affiliation')

    errors = []
    if request.user.is_authenticated:
        errors.append("You are already logged in as %s, please log out before "
                      "creating a new account." % request.user.user_name)

    if request.forms.get('confirm_password') != password:
        errors.append("Passwords do not match.")

    if not spec_util.NAME_REGEX.match(username):
        errors.append(
            "Username must only contain letter, digits, hyphens, underscores, and periods."
        )

    try:
        User.validate_password(password)
    except UsageError as e:
        errors.append(str(e))

    # Only do a basic validation of email -- the only guaranteed way to check
    # whether an email address is valid is by sending an actual email.
    if not spec_util.BASIC_EMAIL_REGEX.match(email):
        errors.append("Email address is invalid.")

    if local.model.user_exists(username, email):
        errors.append("User with this username or email already exists.")

    if not NAME_REGEX.match(username):
        errors.append(
            "Username characters must be alphanumeric, underscores, periods, or dashes."
        )

    if errors:
        return redirect_with_query(
            error_uri,
            {
                'error': ' '.join(errors),
                'next': success_uri,
                'email': email,
                'username': username,
                'first_name': first_name,
                'last_name': last_name,
                'affiliation': affiliation,
            },
        )

    # If user leaves it blank, empty string is obtained - make it of NoneType.
    if not affiliation:
        affiliation = None

    # Create unverified user
    _, verification_key = local.model.add_user(username, email, first_name,
                                               last_name, password,
                                               affiliation)

    # Send key
    send_verification_key(username, email, verification_key)

    # Redirect to success page
    return redirect_with_query(success_uri, {'email': email})
Beispiel #7
0
def validate_name(name):
    if not NAME_REGEX.match(name):
        raise ValidationError('Names must match %s, was %s' %
                              (NAME_REGEX.pattern, name))
Beispiel #8
0
def do_signup():
    success_uri = request.forms.get('success_uri')
    error_uri = request.forms.get('error_uri')
    username = request.forms.get('username')
    email = request.forms.get('email')
    first_name = request.forms.get('first_name')
    last_name = request.forms.get('last_name')
    password = request.forms.get('password')
    affiliation = request.forms.get('affiliation')
    token = request.forms.get('token')

    errors = []

    if not token:
        errors.append('Google reCAPTCHA token is missing.')
    else:
        url = 'https://www.google.com/recaptcha/api/siteverify'
        data = {
            'secret': os.environ['CODALAB_RECAPTCHA_SECRET_KEY'],
            'response': token,
        }
        res = requests.post(url, data)

        try:
            data = res.json()
            if not data.get('success'):
                errors.append('Google reCAPTCHA failed.')

        except UsageError as e:
            errors.append(str(e))

    if request.user.is_authenticated:
        errors.append("You are already logged in as %s, please log out before "
                      "creating a new account." % request.user.user_name)

    if request.forms.get('confirm_password') != password:
        errors.append("Passwords do not match.")

    if not spec_util.NAME_REGEX.match(username):
        errors.append(
            "Username must only contain letter, digits, hyphens, underscores, and periods."
        )

    try:
        User.validate_password(password)
    except UsageError as e:
        errors.append(str(e))

    # Only do a basic validation of email -- the only guaranteed way to check
    # whether an email address is valid is by sending an actual email.
    if not spec_util.BASIC_EMAIL_REGEX.match(email):
        errors.append("Email address is invalid.")

    if local.model.user_exists(username, email):
        errors.append("User with this username or email already exists.")

    if not NAME_REGEX.match(username):
        errors.append(
            "Username characters must be alphanumeric, underscores, periods, or dashes."
        )

    if errors:
        return redirect_with_query(
            error_uri,
            {
                'error': ' '.join(errors),
                'next': success_uri,
                'email': email,
                'username': username,
                'first_name': first_name,
                'last_name': last_name,
                'affiliation': affiliation,
            },
        )

    # If user leaves it blank, empty string is obtained - make it of NoneType.
    if not affiliation:
        affiliation = None

    # Create unverified user
    _, verification_key = local.model.add_user(username, email, first_name,
                                               last_name, password,
                                               affiliation)

    # Send key
    send_verification_key(username, email, verification_key)

    # Redirect to success page
    return redirect_with_query(success_uri, {'email': email})
Beispiel #9
0
def do_signup():
    if request.user.is_authenticated:
        return redirect(
            default_app().get_url('success', message="You are already logged into your account.")
        )

    success_uri = request.forms.get('success_uri')
    error_uri = request.forms.get('error_uri')
    username = request.forms.get('username')
    email = request.forms.get('email')
    first_name = request.forms.get('first_name')
    last_name = request.forms.get('last_name')
    password = request.forms.get('password')
    affiliation = request.forms.get('affiliation')

    errors = []
    if request.user.is_authenticated:
        errors.append(
            "You are already logged in as %s, please log out before "
            "creating a new account." % request.user.user_name
        )

    if request.forms.get('confirm_password') != password:
        errors.append("Passwords do not match.")

    if not spec_util.NAME_REGEX.match(username):
        errors.append(
            "Username must only contain letter, digits, hyphens, underscores, and periods."
        )

    try:
        User.validate_password(password)
    except UsageError as e:
        errors.append(e.message)

    # Only do a basic validation of email -- the only guaranteed way to check
    # whether an email address is valid is by sending an actual email.
    if not spec_util.BASIC_EMAIL_REGEX.match(email):
        errors.append("Email address is invalid.")

    if local.model.user_exists(username, email):
        errors.append("User with this username or email already exists.")

    if not NAME_REGEX.match(username):
        errors.append("Username characters must be alphanumeric, underscores, periods, or dashes.")

    if errors:
        return redirect_with_query(
            error_uri,
            {
                'error': ' '.join(errors),
                'next': success_uri,
                'email': email,
                'username': username,
                'first_name': first_name,
                'last_name': last_name,
                'affiliation': affiliation,
            },
        )

    # If user leaves it blank, empty string is obtained - make it of NoneType.
    if not affiliation:
        affiliation = None

    # Create unverified user
    _, verification_key = local.model.add_user(
        username, email, first_name, last_name, password, affiliation
    )

    # Send key
    send_verification_key(username, email, verification_key)

    # Redirect to success page
    return redirect_with_query(success_uri, {'email': email})
Beispiel #10
0
def validate_name(name):
    if not NAME_REGEX.match(name):
        raise ValidationError('Names must match %s, was %s' % (NAME_REGEX.pattern, name))