@@ -17,17 +17,17 @@ def __get__(self, obj, obj_type):
1717 return functools .partial (self .__call__ , obj )
1818
1919 def error (self , data ):
20- return JSONResponse .response ({" error" : " permission-denied" , " data" : data })
20+ return JSONResponse .response ({' error' : ' permission-denied' , ' data' : data })
2121
2222 def __call__ (self , * args , ** kwargs ):
2323 self .request = args [1 ]
2424
2525 if self .check_permission ():
2626 if self .request .user .is_disabled :
27- return self .error (" Your account is disabled" )
27+ return self .error (' Your account is disabled' )
2828 return self .func (* args , ** kwargs )
2929 else :
30- return self .error (" Please login first" )
30+ return self .error (' Please login first' )
3131
3232 def check_permission (self ):
3333 raise NotImplementedError ()
@@ -67,13 +67,18 @@ def check_contest_password(password, contest_password):
6767 else :
6868 # sig#timestamp 这种形式的密码也可以,但是在界面上没提供支持
6969 # sig = sha256(contest_password + timestamp)[:8]
70- if "#" in password :
71- s = password .split ("#" )
70+ if '#' in password :
71+ s = password .split ('#' )
7272 if len (s ) != 2 :
7373 return False
7474 sig , ts = s [0 ], s [1 ]
7575
76- if sig == hashlib .sha256 ((contest_password + ts ).encode ("utf-8" )).hexdigest ()[:8 ]:
76+ if (
77+ sig
78+ == hashlib .sha256 ((contest_password + ts ).encode ('utf-8' )).hexdigest ()[
79+ :8
80+ ]
81+ ):
7782 try :
7883 ts = int (ts )
7984 except Exception :
@@ -85,7 +90,7 @@ def check_contest_password(password, contest_password):
8590 return False
8691
8792
88- def check_contest_permission (check_type = " details" ):
93+ def check_contest_permission (check_type = ' details' ):
8994 """
9095 只供Class based view 使用,检查用户是否有权进入该contest, check_type 可选 details, problems, ranks, submissions
9196 若通过验证,在view中可通过self.contest获得该contest
@@ -96,48 +101,65 @@ def _check_permission(*args, **kwargs):
96101 self = args [0 ]
97102 request = args [1 ]
98103 user = request .user
99- if request .data .get (" contest_id" ):
100- contest_id = request .data [" contest_id" ]
104+ if request .data .get (' contest_id' ):
105+ contest_id = request .data [' contest_id' ]
101106 else :
102- contest_id = request .GET .get (" contest_id" )
107+ contest_id = request .GET .get (' contest_id' )
103108 if not contest_id :
104- return self .error (" Parameter error, contest_id is required" )
109+ return self .error (' Parameter error, contest_id is required' )
105110
106111 try :
107112 # use self.contest to avoid query contest again in view.
108- self .contest = Contest .objects .select_related ("created_by" ).get (id = contest_id , visible = True )
113+ self .contest = Contest .objects .select_related ('created_by' ).get (
114+ id = contest_id , visible = True
115+ )
109116 except Contest .DoesNotExist :
110117 return self .error ("Contest %s doesn't exist" % contest_id )
111118
112119 # Anonymous
113120 if not user .is_authenticated :
114- return self .error (" Please login first." )
121+ return self .error (' Please login first.' )
115122
116123 # creator or owner
117124 if user .is_contest_admin (self .contest ):
118125 return func (* args , ** kwargs )
119126
120127 if self .contest .contest_type == ContestType .PASSWORD_PROTECTED_CONTEST :
121128 # password error
122- if not check_contest_password (request .session .get (CONTEST_PASSWORD_SESSION_KEY , {}).get (self .contest .id ), self .contest .password ):
123- return self .error ("Wrong password or password expired" )
129+ if not check_contest_password (
130+ request .session .get (CONTEST_PASSWORD_SESSION_KEY , {}).get (
131+ self .contest .id
132+ ),
133+ self .contest .password ,
134+ ):
135+ return self .error ('Wrong password or password expired' )
124136
125137 # regular user get contest problems, ranks etc. before contest started
126- if self .contest .status == ContestStatus .CONTEST_NOT_START and check_type != "details" :
127- return self .error ("Contest has not started yet." )
138+ if (
139+ self .contest .status == ContestStatus .CONTEST_NOT_START
140+ and check_type != 'details'
141+ ):
142+ return self .error ('Contest has not started yet.' )
128143
129144 # check does user have permission to get ranks, submissions in OI Contest
130- if self .contest .status == ContestStatus .CONTEST_UNDERWAY and self .contest .rule_type == ContestRuleType .OI :
131- if not self .contest .real_time_rank and (check_type == "ranks" or check_type == "submissions" ):
132- return self .error (f"No permission to get { check_type } " )
145+ if (
146+ self .contest .status == ContestStatus .CONTEST_UNDERWAY
147+ and self .contest .rule_type == ContestRuleType .OI
148+ ):
149+ if not self .contest .real_time_rank and (
150+ check_type == 'ranks' or check_type == 'submissions'
151+ ):
152+ return self .error (f'No permission to get { check_type } ' )
133153
134154 return func (* args , ** kwargs )
155+
135156 return _check_permission
157+
136158 return decorator
137159
138160
139161def ensure_created_by (obj , user ):
140- e = APIError (msg = f" { obj .__class__ .__name__ } does not exist" )
162+ e = APIError (msg = f' { obj .__class__ .__name__ } does not exist' )
141163 if not user .is_admin_role ():
142164 raise e
143165 if user .is_super_admin ():
0 commit comments