Пример #1
0
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()
Пример #2
0
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/")
Пример #3
0
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("")
Пример #4
0
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)
Пример #5
0
    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...')
Пример #6
0
        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:
Пример #7
0
 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
Пример #8
0
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())
Пример #9
0
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
Пример #10
0
def clear_sessions():
    SessionStore.clear_expired()
Пример #11
0
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