async def get(self): if self.has_priv(builtin.PRIV_USER_PROFILE): self.redirect(self.reverse_url('domain_main')) else: if len(self.request.query_string) > 0: if self.request.query_string.startswith("ticket="): ticket = self.request.query_string[7:] uinfo = await casclient.get_user_info(ticket) uname = uinfo['sid'][0] udoc = await user.get_by_uname(uname) if udoc is not None: uid = udoc['_id'] await asyncio.gather( user.set_by_uid(uid, loginat=datetime.datetime.utcnow(), loginip=self.remote_ip), self.update_session(new_saved=True, uid=uid)) self.json_or_redirect(self.referer_or_main) else: uid = await system.inc_user_counter() password = uuid.uuid4().hex if 'email' in uinfo: email = uinfo['email'][0] else: email = f'{uname}@mail.sustech.edu.cn' await user.add(uid, uname, password, email, self.remote_ip) await self.update_session(new_saved=False, uid=uid) self.json_or_redirect(self.reverse_url('domain_main')) else: raise error.NotFoundError(self.url) else: self.redirect('https://cas.sustech.edu.cn/cas/login?service=' + options.url_prefix + '/auth/login')
async def get(self, *, code: str = None, state: str = None): self.check_oauth('jaccount') redirect_url = misc.generate_url( self.reverse_url('user_login_jaccount')) if self.has_priv(builtin.PRIV_USER_PROFILE): self.redirect(self.reverse_url('domain_main')) elif code: # redirected from jaccount oauth server # print(code) data = await oauth.get_profile(code, redirect_url) if not data: raise error.LoginError('') uid = int(data['code']) udoc = await user.get_by_uid(uid) if not udoc: mail = data['account'] + '@sjtu.edu.cn' await user.add(uid=uid, uname=data['account'], password=data['id'], mail=mail, regip=self.remote_ip, realname=data['name']) udoc = await user.get_by_uid(uid) if not udoc: raise error.LoginError(data['account']) await asyncio.gather( user.set_by_uid(udoc['_id'], loginat=datetime.datetime.utcnow(), loginip=self.remote_ip), self.update_session(new_saved=True, uid=udoc['_id'])) self.redirect(self.reverse_url('domain_main')) else: self.redirect(oauth.get_authorize_url(redirect_url))
async def post(self, *, uname: str, password: str, rememberme: bool = False): udoc = await user.check_password_by_uname(uname, password) if not udoc: raise error.LoginError(uname) await asyncio.gather(user.set_by_uid(udoc['_id'], loginat=datetime.datetime.utcnow(), loginip=self.remote_ip), self.update_session(new_saved=rememberme, uid=udoc['_id'])) self.json_or_redirect(self.referer_or_main)
async def post(self, *, uname: str, password: str, rememberme: bool=False): udoc = await user.check_password_by_uname(uname, password) if not udoc: raise error.LoginError(uname) await asyncio.gather(user.set_by_uid(udoc['_id'], loginat=datetime.datetime.utcnow(), loginip=self.remote_ip), self.update_session(new_saved=rememberme, uid=udoc['_id'])) self.json_or_redirect(self.referer_or_main)
async def get(self): client = OujiangCollegeUnifiedAuthClient() if client.shared_key not in self.request.query: client.params['state'] = random_string(8) await self.update_session(oauth_ojc_state=client.params['state']) self.redirect(client.get_authorize_url()) return if self.session.get('oauth_ojc_state') != self.request.query.get( 'state'): raise error.ThirdPartyConnectError( client.name, 'state {} doesn\'t match {}'.format( self.request.query.get('state'), self.session.get('oauth_ojc_state'))) try: await client.get_access_token(self.request.query) _, uniAuthUserReturn = await client.user_info() ojcUser = uniAuthUserReturn['data'] except aiohttp.web_exceptions.HTTPBadRequest as e: raise error.ThirdPartyConnectError(client.name, e) udoc = await user.get_by_ojcId(ojcUser['schoolId']) if udoc: await asyncio.gather( user.set_by_uid(udoc['_id'], loginat=datetime.datetime.utcnow(), loginip=self.remote_ip), self.update_session(uid=udoc['_id'])) else: uid = int(ojcUser['schoolId']) if ojcUser['schoolId'].isnumeric( ) else await system.inc_user_counter() password = random_string(16) await user.add(uid, ojcUser['username'], password, '{}@me.iojc.cn'.format(ojcUser['schoolId']), self.remote_ip) await user.set_by_uid(uid, ojcId=ojcUser['schoolId']) await self.update_session(new_saved=False, uid=uid) self.json_or_redirect(self.reverse_url('domain_main'))