Commit 1ecfefbf9b618852df816dc6c7a9c0d4d8a9b8bb

Authored by Miguel Barão
1 parent a203d3cc
Exists in master and in 1 other branch dev

- removed commented code.

- added option --port to select the HTTPS port.
Showing 2 changed files with 18 additions and 43 deletions   Show diff stats
@@ -29,12 +29,16 @@ class LearnAppException(Exception): @@ -29,12 +29,16 @@ class LearnAppException(Exception):
29 # ============================================================================ 29 # ============================================================================
30 # helper functions 30 # helper functions
31 # ============================================================================ 31 # ============================================================================
32 -async def check_password(try_pw, pw): 32 +async def _bcrypt_hash(a, b):
33 loop = asyncio.get_running_loop() 33 loop = asyncio.get_running_loop()
34 - return pw == await loop.run_in_executor(None, bcrypt.hashpw, try_pw.encode('utf-8'), pw) 34 + return await loop.run_in_executor(None, bcrypt.hashpw, a.encode('utf-8'), b)
  35 +
  36 +async def check_password(try_pw, pw):
  37 + return pw == await _bcrypt_hash(try_pw, pw)
  38 +
  39 +async def bcrypt_hash_gen(new_pw):
  40 + return await _bcrypt_hash(new_pw, bcrypt.gensalt())
35 41
36 -def bcrypt_hash_gen(pw):  
37 - return bcrypt.hashpw(pw.encode('utf-8'), bcrypt.gensalt())  
38 42
39 # ============================================================================ 43 # ============================================================================
40 # LearnApp - application logic 44 # LearnApp - application logic
@@ -115,14 +119,13 @@ class LearnApp(object): @@ -115,14 +119,13 @@ class LearnApp(object):
115 logger.info(f'User "{uid}" logged out') 119 logger.info(f'User "{uid}" logged out')
116 120
117 # ------------------------------------------------------------------------ 121 # ------------------------------------------------------------------------
118 - # change_password 122 + # change_password. returns True if password is successfully changed.
119 # ------------------------------------------------------------------------ 123 # ------------------------------------------------------------------------
120 async def change_password(self, uid, pw): 124 async def change_password(self, uid, pw):
121 if not pw: 125 if not pw:
122 return False 126 return False
123 127
124 - loop = asyncio.get_running_loop()  
125 - pw = await loop.run_in_executor(None, bcrypt_hash_gen, pw) 128 + pw = await bcrypt_hash_gen(pw)
126 129
127 with self.db_session() as s: 130 with self.db_session() as s:
128 u = s.query(Student).get(uid) 131 u = s.query(Student).get(uid)
@@ -16,7 +16,6 @@ import functools @@ -16,7 +16,6 @@ import functools
16 import tornado.ioloop 16 import tornado.ioloop
17 import tornado.web 17 import tornado.web
18 import tornado.httpserver 18 import tornado.httpserver
19 -# from tornado import iostream  
20 19
21 # this project 20 # this project
22 from learnapp import LearnApp 21 from learnapp import LearnApp
@@ -34,6 +33,7 @@ def admin_only(func): @@ -34,6 +33,7 @@ def admin_only(func):
34 func(self, *args, **kwargs) 33 func(self, *args, **kwargs)
35 return wrapper 34 return wrapper
36 35
  36 +
37 # ============================================================================ 37 # ============================================================================
38 # WebApplication - Tornado Web Server 38 # WebApplication - Tornado Web Server
39 # ============================================================================ 39 # ============================================================================
@@ -45,7 +45,6 @@ class WebApplication(tornado.web.Application): @@ -45,7 +45,6 @@ class WebApplication(tornado.web.Application):
45 (r'/change_password', ChangePasswordHandler), 45 (r'/change_password', ChangePasswordHandler),
46 (r'/question', QuestionHandler), # renders each question 46 (r'/question', QuestionHandler), # renders each question
47 (r'/topic/(.+)', TopicHandler), # page for exercising a topic 47 (r'/topic/(.+)', TopicHandler), # page for exercising a topic
48 - # (r'/learn/(.+)', LearnHandler), # page for learning a topic  
49 (r'/file/(.+)', FileHandler), # serve files, images, etc 48 (r'/file/(.+)', FileHandler), # serve files, images, etc
50 (r'/', RootHandler), # show list of topics 49 (r'/', RootHandler), # show list of topics
51 ] 50 ]
@@ -159,24 +158,6 @@ class TopicHandler(BaseHandler): @@ -159,24 +158,6 @@ class TopicHandler(BaseHandler):
159 name=self.learn.get_student_name(uid), 158 name=self.learn.get_student_name(uid),
160 ) 159 )
161 160
162 -# class LearnHandler(BaseHandler):  
163 -# @tornado.web.authenticated  
164 -# def get(self, topic):  
165 -# uid = self.current_user  
166 -  
167 -# try:  
168 -# ok = self.learn.start_learning(uid, topic)  
169 -# except KeyError:  
170 -# self.redirect('/')  
171 -# else:  
172 -# if ok:  
173 -# self.render('learn.html',  
174 -# uid=uid,  
175 -# name=self.learn.get_student_name(uid),  
176 -# )  
177 -# else:  
178 -# self.redirect('/')  
179 -  
180 161
181 # ---------------------------------------------------------------------------- 162 # ----------------------------------------------------------------------------
182 # Serves files from the /public subdir of the topics. 163 # Serves files from the /public subdir of the topics.
@@ -185,8 +166,6 @@ class TopicHandler(BaseHandler): @@ -185,8 +166,6 @@ class TopicHandler(BaseHandler):
185 class FileHandler(BaseHandler): 166 class FileHandler(BaseHandler):
186 SUPPORTED_METHODS = ['GET'] 167 SUPPORTED_METHODS = ['GET']
187 168
188 - # chunk_size = 4 * 1024 * 1024 # serve up to 4 MiB multiple times  
189 -  
190 @tornado.web.authenticated 169 @tornado.web.authenticated
191 async def get(self, filename): 170 async def get(self, filename):
192 uid = self.current_user 171 uid = self.current_user
@@ -209,18 +188,6 @@ class FileHandler(BaseHandler): @@ -209,18 +188,6 @@ class FileHandler(BaseHandler):
209 self.write(f.read()) 188 self.write(f.read())
210 await self.flush() 189 await self.flush()
211 190
212 - # chunk = f.read(self.chunk_size)  
213 - # while chunk:  
214 - # try:  
215 - # self.write(chunk) # write the chunk to response  
216 - # await self.flush() # flush the current chunk to socket  
217 - # except iostream.StreamClosedError:  
218 - # break # client closed the connection  
219 - # finally:  
220 - # del chunk  
221 - # await asyncio.sleep(0) # 1 nanosecond (hack)  
222 - # chunk = f.read(self.chunk_size)  
223 -  
224 191
225 # ---------------------------------------------------------------------------- 192 # ----------------------------------------------------------------------------
226 # respond to AJAX to get a JSON question 193 # respond to AJAX to get a JSON question
@@ -326,6 +293,8 @@ def signal_handler(signal, frame): @@ -326,6 +293,8 @@ def signal_handler(signal, frame):
326 tornado.ioloop.IOLoop.current().stop() 293 tornado.ioloop.IOLoop.current().stop()
327 logging.critical('Webserver stopped.') 294 logging.critical('Webserver stopped.')
328 sys.exit(0) 295 sys.exit(0)
  296 + else:
  297 + logging.info('Abort canceled...')
329 298
330 299
331 # ------------------------------------------------------------------------- 300 # -------------------------------------------------------------------------
@@ -336,8 +305,10 @@ def main(): @@ -336,8 +305,10 @@ def main():
336 argparser = argparse.ArgumentParser(description='Server for online learning. Enrolled students and topics have to be previously configured. Please read the documentation included with this software before running the server.') 305 argparser = argparse.ArgumentParser(description='Server for online learning. Enrolled students and topics have to be previously configured. Please read the documentation included with this software before running the server.')
337 argparser.add_argument('conffile', type=str, nargs='+', 306 argparser.add_argument('conffile', type=str, nargs='+',
338 help='Topics configuration file in YAML format.') # FIXME only one 307 help='Topics configuration file in YAML format.') # FIXME only one
  308 + argparser.add_argument('--port', type=int, default=8443,
  309 + help='Port to be used by the HTTPS server')
339 argparser.add_argument('--debug', action='store_true', 310 argparser.add_argument('--debug', action='store_true',
340 - help='Enable debug messages.') 311 + help='Enable debug messages')
341 arg = argparser.parse_args() 312 arg = argparser.parse_args()
342 313
343 # --- Setup logging 314 # --- Setup logging
@@ -380,7 +351,8 @@ def main(): @@ -380,7 +351,8 @@ def main():
380 logging.critical('Certificates cert.pem and privkey.pem not found') 351 logging.critical('Certificates cert.pem and privkey.pem not found')
381 sys.exit(1) 352 sys.exit(1)
382 else: 353 else:
383 - http_server.listen(8443) 354 + http_server.listen(arg.port)
  355 + logging.info(f'Listening on port {arg.port}.')
384 356
385 # --- run webserver 357 # --- run webserver
386 logging.info('Webserver running... (Ctrl-C to stop)') 358 logging.info('Webserver running... (Ctrl-C to stop)')