def delete_expired_sessions_and_workflows_sync() -> None: """ Delete expired browser sessions and their anonymous Workflows. Rationale: nobody can access these Workflows. Implementation note: currently (2018-06-18), we use django.contrib.sessions.db to determine whether or not the session has expired. Call ``SessionStore.clear_expired()`` before calling this function. In the future, should Workbench switch to cookie-based sessions, we won't be able to tell which sessions are expired. In that case we should switch this function's logic to simply delete old workflows. """ SessionStore.clear_expired() active_session_keys = Session.objects.all().values_list("session_key", flat=True) # TODO fix race here: new workflows created right now will be deleted # immediately. (DB Transactions don't prevent this race.) workflows = list( Workflow.objects.filter(owner__isnull=True).exclude( anonymous_owner_session_key__in=active_session_keys)) for workflow in workflows: with workflow.cooperative_lock(): logger.info('Deleting workflow %d ("%s")', workflow.id, workflow.name) workflow.delete()
def Classic(request): if request.method == "POST": # 禁止短時間內多次創建同主機下的Table SessionStore.clear_expired() start = timezone.now() - timedelta(minutes=10) end = timezone.now() if not table.objects.filter(MachineID=request.session['BMBC'], time__range=[start, end]): #設置主機狀態表 Ses = SessionStore() Ses['bmbc'] = request.session['BMBC'] ##閒置過久session可能過期 ROUND = rounds.objects.get(pk=request.POST['Game']) Ses['from'] = request.POST['Game'] Ses['round'] = model_to_dict(ROUND, fields=['N', 'E', 'W', 'S']) #print(Ses['round']) Ses['state'] = '2' Ses.set_expiry(300) #創建牌桌及座位 t = table.objects.create(MachineID=request.session['BMBC'], NS_TotalPoint=0, EW_TotalPoint=0, RoundNum=0) t.save() Ses['T_id'] = t.pk Nplayer = User.objects.get_by_natural_key( request.POST['N']) #若輸入錯誤,將找不到該用戶 s = seat.objects.create(position='N', PlayerID=Nplayer, TableID=t) s.save() Eplayer = User.objects.get_by_natural_key( request.POST['E']) # 若輸入錯誤,將找不到該用戶 s = seat.objects.create(position='E', PlayerID=Eplayer, TableID=t) s.save() Splayer = User.objects.get_by_natural_key( request.POST['S']) # 若輸入錯誤,將找不到該用戶 s = seat.objects.create(position='S', PlayerID=Splayer, TableID=t) s.save() Wplayer = User.objects.get_by_natural_key( request.POST['W']) # 若輸入錯誤,將找不到該用戶 s = seat.objects.create(position='W', PlayerID=Wplayer, TableID=t) s.save() Ses.create() print(Ses) return redirect("/Member/index/") Err = "禁止短時間內多次開局" return render(request, "Member/index.html/", locals()) message = "錯誤方式訪問該頁面" return redirect("/Member/login/")
def login(request): assert isinstance(request, HttpRequest) try: data = json.loads(request.body.decode()) if int(data["type"]) == 3: p = Student.objects.filter(sid=int(data["ID"]), spassword=data["Password"]) print(p) name = p[0].sname elif int(data["type"]) == 2: p = Teacher.objects.filter(tid=int(data["ID"]), tpassword=data["Password"]) name = p[0].tname if len(p): s = SessionStore() s.set_expiry(globe_time) s["ID"] = data["ID"] s["type"] = data["type"] s.save() s.clear_expired() return HttpResponse(json.dumps({"name": name, "key": s.session_key})) except Exception as er: print("login", er.__class__, er) return HttpResponse("")
def data_fresh(request): Users = [] SessionStore.clear_expired() sessions = Session.objects.all() #bmbc = request.session['BMBC'] #print(bmbc) try: for session in sessions: s = session.get_decoded() #print(s) if 'BMBC' in s and s['BMBC'] == request.session[ 'BMBC']: #取出所有BMBC相同的玩家 Users.append(s['_auth_user_id']) except: return render(request, "Member/General.html", locals()) Usernames = [] for user in Users: un = User.objects.get(id=user).username Usernames.append(un) if len(Usernames) == 4: Usernames.append("遊戲開始") return JsonResponse(Usernames, safe=False)
print('''Starting OmniDB websocket...''') logger.info('''Starting OmniDB websocket...''') print('''Checking port availability...''') logger.info('''Checking port availability...''') while not check_port(port) or num_attempts_port >= 20: print("Port {0} is busy, trying another port...".format(port)) logger.info("Port {0} is busy, trying another port...".format(port)) port = random.randint(1025, 32676) num_attempts_port = num_attempts_port + 1 if num_attempts_port < 20: OmniDB.settings.OMNIDB_WEBSOCKET_PORT = port OmniDB.settings.OMNIDB_EXTERNAL_WEBSOCKET_PORT = port OmniDB.settings.OMNIDB_ADDRESS = '127.0.0.1' print("Starting websocket server at port {0}.".format(str(port))) logger.info("Starting websocket server at port {0}.".format(str(port))) #Removing Expired Sessions SessionStore.clear_expired() #Websocket Core ws_core.start_wsserver_thread() DjangoApplication().run() else: print('Tried 20 different ports without success, closing...') logger.info('Tried 20 different ports without success, closing...')
if ews_port==None: OmniDB.settings.OMNIDB_EXTERNAL_WEBSOCKET_PORT = port else: OmniDB.settings.OMNIDB_EXTERNAL_WEBSOCKET_PORT = ews_port OmniDB.settings.OMNIDB_ADDRESS = listening_address OmniDB.settings.IS_SSL = is_ssl OmniDB.settings.SSL_CERTIFICATE = ssl_certificate_file OmniDB.settings.SSL_KEY = ssl_key_file OmniDB.settings.SESSION_COOKIE_SECURE = True OmniDB.settings.CSRF_COOKIE_SECURE = True print ("Starting websocket server at port {0}.".format(str(port)),flush=True) logger.info("Starting websocket server at port {0}.".format(str(port))) #Removing Expired Sessions SessionStore.clear_expired() #Websocket Core ws_core.start_wsserver_thread() DjangoApplication().run( { 'listening_address' : listening_address, 'listening_port' : listening_port, 'is_ssl' : is_ssl, 'ssl_certificate_file': ssl_certificate_file, 'ssl_key_file' : ssl_key_file } ) else:
def clear_expired(cls): # clear_expired is no-op and is done by redis if USE_FALLBACK: logger.info('clearing expired DB sessions') DataBaseStore.clear_expired() return True
def playmode(request, pm='x'): name = Name(request) if pm != 'x': if (pm == 0): #Classic ClassicGames = rounds.objects.filter(T_id=None, Rnum=0) if request.method == "POST" and request.POST['event']: ClassicGames = ClassicGames.filter( Event__contains=request.POST['event']) return render(request, "Member/Classic.html", locals()) elif (pm == 1): #General Users = [] SessionStore.clear_expired() sessions = Session.objects.all() try: for session in sessions: s = session.get_decoded() if 'BMBC' in s and s['BMBC'] == request.session[ 'BMBC']: #取出所有BMBC相同的玩家 Users.append(s['_auth_user_id']) except: return render(request, "Member/General.html", locals()) Usernames = [] for user in Users: username = User.objects.filter(id=user) for us in username: Usernames.append(us) if len(Usernames) > 4: message = "該房間已客滿!!!" return render(request, "Member/index,html", locals()) elif len(Usernames) == 4: # 禁止短時間內多次創建同主機下的Table if not table.objects.filter( MachineID=request.session['BMBC'], time__range=[ timezone.now() - timedelta(minutes=10), timezone.now() ]): t = table.objects.create(MachineID=request.session['BMBC'], NS_TotalPoint=0, EW_TotalPoint=0, RoundNum=0) t.save() N = User.objects.get_by_natural_key(Usernames[0]) s = seat.objects.create(position='N', PlayerID=N, TableID=t) s.save() E = User.objects.get_by_natural_key(Usernames[1]) s = seat.objects.create(position='E', PlayerID=E, TableID=t) s.save() S = User.objects.get_by_natural_key(Usernames[2]) s = seat.objects.create(position='W', PlayerID=S, TableID=t) s.save() W = User.objects.get_by_natural_key(Usernames[3]) s = seat.objects.create(position='S', PlayerID=W, TableID=t) s.save() S = SessionStore() S['bmbc'] = request.session['BMBC'] S['state'] = '1' ## 線上隨機模式 S['T_id'] = t.pk S.create() print(S) else: message = "短時間內創建過多次牌局" return render(request, "Member/General.html", locals()) #if request.POST['BridgeMasterBaseCode'] =="1": BMBC = request.POST['BridgeMasterBaseCode'] request.session['BMBC'] = BMBC return render(request, "Member/playmode.html", locals())
def websocket_app(environ, start_response): if not 'wsgi.websocket' in environ: print "Not a websocket" return ws = environ["wsgi.websocket"] print ws # Important to call, otherwise we may get stale user sessions SessionStore.clear_expired() # Get the session object and implicitly check if the session is valid cookie = parse_cookie(environ['HTTP_COOKIE']) if not 'sessionid' in cookie: print "No session cookie" return s = SessionStore(session_key=cookie['sessionid']) if not '_auth_user_id' in s: print "Invalid session" return user = User.objects.get(pk=s['_auth_user_id']) if not user: print "Invalid user" return path = environ['PATH_INFO'].split('/') if len(path) < 3 or path[1] != 'websocket' or path[2] != 'conference' or not path[3].isdigit(): print "Invalid path" return conference_id = int(path[3]) conference = Reservation.objects.get(pk=conference_id) if conference.user != user: print "User not owner of this conference" return #if conference.end_time < timezone.now() or conference.begin_time > timezone.now(): # print "Conference not currently in progress" # return # FIXME Hardcoded backend_info = { 'mcu': '127.0.0.1', 'room': 'room101', } socket_info = copy(global_sockets) socket_info.subscribe(ws, conference) interface = Handler(backend_info=backend_info, conference=conference, sockets=socket_info) while True: try: data = ws.receive() if data is None: socket_info.close(socket_info.local) return try: message = json.loads(data) except Exception as e: print repr(e), data return handlers = { 'LIST_MOSAIC': 'list_mosaic', 'LIST_PARTICIPANTS': 'list_participants', 'MOVE_PARTICIPANT': 'move_participant', 'REMOVE_PARTICIPANT': 'remove_participant', 'OFFER_SDP': 'offer_sdp', 'SDP_OK': 'sdp_ok', } if not 'message_type' in message: print "Message has no message type" return if not message['message_type'] in handlers: print "No handler for message type", message['message_type'] return print message['message_type'], "received" # Find and call the method in the MCUInterface class instance func = getattr(interface, handlers[message['message_type']]) func(message['data']) except: socket_info.close(socket_info.local) ws.close() raise
def clear_sessions(): SessionStore.clear_expired()
def websocket_app(environ, start_response): if not 'wsgi.websocket' in environ: print "Not a websocket" return ws = environ["wsgi.websocket"] print ws # Important to call, otherwise we may get stale user sessions SessionStore.clear_expired() # Get the session object and implicitly check if the session is valid cookie = parse_cookie(environ['HTTP_COOKIE']) if not 'sessionid' in cookie: print "No session cookie" return s = SessionStore(session_key=cookie['sessionid']) if not '_auth_user_id' in s: print "Invalid session" return user = User.objects.get(pk=s['_auth_user_id']) if not user: print "Invalid user" return path = environ['PATH_INFO'].split('/') if len(path) < 3 or path[1] != 'websocket' or path[ 2] != 'conference' or not path[3].isdigit(): print "Invalid path" return conference_id = int(path[3]) conference = Reservation.objects.get(pk=conference_id) if conference.user != user: print "User not owner of this conference" return #if conference.end_time < timezone.now() or conference.begin_time > timezone.now(): # print "Conference not currently in progress" # return # FIXME Hardcoded backend_info = { 'mcu': '127.0.0.1', 'room': 'room101', } socket_info = copy(global_sockets) socket_info.subscribe(ws, conference) interface = Handler(backend_info=backend_info, conference=conference, sockets=socket_info) while True: try: data = ws.receive() if data is None: socket_info.close(socket_info.local) return try: message = json.loads(data) except Exception as e: print repr(e), data return handlers = { 'LIST_MOSAIC': 'list_mosaic', 'LIST_PARTICIPANTS': 'list_participants', 'MOVE_PARTICIPANT': 'move_participant', 'REMOVE_PARTICIPANT': 'remove_participant', 'OFFER_SDP': 'offer_sdp', 'SDP_OK': 'sdp_ok', } if not 'message_type' in message: print "Message has no message type" return if not message['message_type'] in handlers: print "No handler for message type", message['message_type'] return print message['message_type'], "received" # Find and call the method in the MCUInterface class instance func = getattr(interface, handlers[message['message_type']]) func(message['data']) except: socket_info.close(socket_info.local) ws.close() raise