Пример #1
0
    def test_create_and_oauth():
        ''' test create user '''
        _mail = '*****@*****.**'
        with pytest.raises(Exception) as error:
            User.create(mail=_mail)

        assert str(error.value) == f'mail: `{_mail}` not in the oauth dbs'

        OAuthDB().add_data(mail=_mail, data={})

        OAuthDB().find_one_and_update({'_id': _mail},
                                      {'$set': {
                                          'owner': '00000000'
                                      }})

        with pytest.raises(Exception) as error:
            User.create(mail=_mail)

        assert str(error.value) == f'mail:`{_mail}` already bind'
Пример #2
0
    def test_update_profile():
        ''' Test update profile '''
        _mail = '*****@*****.**'
        OAuthDB().add_data(mail=_mail, data={})
        created_user = User.create(mail=_mail)

        data = {'nickname': 'nick coscup'}
        updated_user = User(uid=created_user['_id']).update_profile(data=data)

        assert updated_user['profile']['nickname'] == 'nick coscup'

        real_data = {'name': 'COSCUP'}
        updated_user = User(uid=created_user['_id']).update_profile_real(
            data=real_data)

        assert updated_user['profile_real']['name'] == 'COSCUP'

        suspend_user = User(uid=created_user['_id']).property_suspend()

        assert suspend_user['property']['suspend']
Пример #3
0
def user_add() -> None:
    ''' Create an dev user '''
    user_info = {
        'id': '000000000000000000000',
        'email': '*****@*****.**',
        'verified_email': True,
        'name': 'Volunteer Dev (testing)',
        'given_name': 'Volunteer',
        'family_name': 'Dev',
        'picture': '',
        'locale': 'en',
    }

    # ----- save oauth info ----- #
    OAuth.add(mail=user_info['email'], data=user_info, token=Token())

    # ----- Check account or create ----- #
    owner = OAuth.owner(mail=user_info['email'])
    if owner:
        user = User(uid=owner).get()
    else:
        user = User.create(mail=user_info['email'])

    user_session = USession.make_new(uid=user['_id'], header={})

    click.echo(click.style('\n[!] Next step', bold=True))
    click.echo(
        click.style(' | Please visit these link to setup the cookie/session:',
                    fg='yellow',
                    bold=True))
    click.echo(
        click.style(
            f'   -> http://127.0.0.1/dev/cookie?sid={user_session.inserted_id}',
            fg='green',
            bold=True))
    click.echo('')
    click.echo(
        click.style('Thank you for your contribution!', fg='cyan', bold=True))
    click.echo('')
Пример #4
0
 def test_create_success():
     ''' Test create user success '''
     _mail = '*****@*****.**'
     OAuthDB().add_data(mail=_mail, data={})
     created_user = User.create(mail=_mail)
     assert created_user['mail'] == _mail
Пример #5
0
def oauth2callback():
    ''' oauth2callback '''
    if 'r' in request.args and request.args['r'].startswith('/'):
        session['r'] = request.args['r']

    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        './client_secret.json',
        scopes=(
            'openid',
            'https://www.googleapis.com/auth/userinfo.email',
            'https://www.googleapis.com/auth/userinfo.profile',
        ),
        redirect_uri=f'https://{setting.DOMAIN}/oauth2callback',
    )

    if 'code' not in request.args:
        authorization_url, state = flow.authorization_url(
            access_type='offline',
            include_granted_scopes='true',
            state=hashlib.sha256(os.urandom(2048)).hexdigest(),
        )

        session['state'] = state
        return redirect(authorization_url)

    url = request.url.replace('http://', 'https://')
    url_query = parse_qs(urlparse(url).query)

    if 'state' in url_query and url_query['state'] and \
            url_query['state'][0] == session.get('state'):
        flow.fetch_token(authorization_response=url)

        auth_client = discovery.build('oauth2',
                                      'v2',
                                      credentials=flow.credentials,
                                      cache_discovery=False)
        user_info = auth_client.userinfo().get().execute()

        # ----- save oauth info ----- #
        OAuth.add(mail=user_info['email'],
                  data=user_info,
                  token=flow.credentials)

        # ----- Check account or create ----- #
        owner = OAuth.owner(mail=user_info['email'])
        if owner:
            user = User(uid=owner).get()
        else:
            user = User.create(mail=user_info['email'])
            MailLetterDB().create(uid=user['_id'])

        user_session = USession.make_new(uid=user['_id'],
                                         header=dict(request.headers))
        session['sid'] = user_session.inserted_id

        if 'r' in session:
            redirect_path = session['r']
            logging.info('login r: %s', redirect_path)
            session.pop('r', None)
            session.pop('state', None)
            return redirect(redirect_path)

        return redirect(url_for('index', _scheme='https', _external=True))

    session.pop('state', None)
    return redirect(url_for('oauth2callback', _scheme='https', _external=True))