Changeset 182


Ignore:
Timestamp:
07/27/12 03:05:02 (12 years ago)
Author:
atzm
Message:
  • mix-in'ize basic auth handler
File:
1 edited

Legend:

Unmodified
Added
Removed
  • etherws/trunk/etherws.py

    r181 r182  
    5555import tornado.web 
    5656import tornado.ioloop 
    57 import tornado.websocket 
    5857import tornado.httpserver 
    5958 
     59from tornado.websocket import WebSocketHandler 
    6060from pytun import TunTapDevice, IFF_TAP, IFF_NO_PI 
    6161 
     
    237237 
    238238 
     239class BasicAuthMixIn(object): 
     240    def _execute(self, transforms, *args, **kwargs): 
     241        def do_execute(): 
     242            sp = super(BasicAuthMixIn, self) 
     243            return sp._execute(transforms, *args, **kwargs) 
     244 
     245        def auth_required(): 
     246            self.stream.write(tornado.escape.utf8( 
     247                'HTTP/1.1 401 Authorization Required\r\n' 
     248                'WWW-Authenticate: Basic realm=etherws\r\n\r\n' 
     249            )) 
     250            self.stream.close() 
     251 
     252        try: 
     253            if not self._htpasswd: 
     254                return do_execute() 
     255 
     256            creds = self.request.headers.get('Authorization') 
     257 
     258            if not creds or not creds.startswith('Basic '): 
     259                return auth_required() 
     260 
     261            name, passwd = base64.b64decode(creds[6:]).split(':', 1) 
     262 
     263            if self._htpasswd.load().auth(name, passwd): 
     264                return do_execute() 
     265        except: 
     266            traceback.print_exc() 
     267 
     268        return auth_required() 
     269 
     270 
    239271class TapHandler(DebugMixIn): 
    240272    READ_SIZE = 65535 
     
    296328 
    297329 
    298 class EtherWebSocketHandler(tornado.websocket.WebSocketHandler, DebugMixIn): 
     330class EtherWebSocketHandler(DebugMixIn, BasicAuthMixIn, WebSocketHandler): 
    299331    def __init__(self, app, req, switch, htpasswd=None, debug=False): 
    300332        super(EtherWebSocketHandler, self).__init__(app, req) 
     
    316348        self._switch.unregister_port(self) 
    317349        self.dprintf('disconnected: %s\n', lambda: self.request.remote_ip) 
    318  
    319     def _execute(self, transforms, *args, **kwargs): 
    320         def do_execute(): 
    321             sp = super(EtherWebSocketHandler, self) 
    322             return sp._execute(transforms, *args, **kwargs) 
    323  
    324         def auth_required(): 
    325             self.stream.write(tornado.escape.utf8( 
    326                 'HTTP/1.1 401 Authorization Required\r\n' 
    327                 'WWW-Authenticate: Basic realm=etherws\r\n\r\n' 
    328             )) 
    329             self.stream.close() 
    330  
    331         try: 
    332             if not self._htpasswd: 
    333                 return do_execute() 
    334  
    335             creds = self.request.headers.get('Authorization') 
    336  
    337             if not creds or not creds.startswith('Basic '): 
    338                 return auth_required() 
    339  
    340             name, passwd = base64.b64decode(creds[6:]).split(':', 1) 
    341  
    342             if self._htpasswd.load().auth(name, passwd): 
    343                 return do_execute() 
    344         except: 
    345             traceback.print_exc() 
    346  
    347         return auth_required() 
    348350 
    349351 
Note: See TracChangeset for help on using the changeset viewer.