Beispiel #1
0
 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')
Beispiel #2
0
 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))
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
    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'))