def handle_request(req, filename = None): if req == '': log.alert('Empty body received. Filename: %s' % filename) return False keys = gpg.get_keys(req) (em, body) = gpg.verify_sig(req) if not em: log.alert("Invalid signature, missing/untrusted key. Keys in gpg batch: '%s'" % keys) return False user = acl.user_by_email(em) if user == None: # FIXME: security email here log.alert("'%s' not in acl. Keys in gpg batch: '%s'" % (em, keys)) return False acl.set_current_user(user) status.push("request from %s" % user.login) r = request.parse_request(body) if r.kind == 'group': handle_group(r, user) elif r.kind == 'notification': handle_notification(r, user) else: msg = "%s: don't know how to handle requests of this kind '%s'" \ % (user.get_login(), r.kind) log.alert(msg) m = user.message_to() m.set_headers(subject = "unknown request") m.write_line(msg) m.send() status.pop() return True
def handle_request(req, filename=None): if req == '': log.alert('Empty body received. Filename: %s' % filename) return False keys = gpg.get_keys(req) (em, body) = gpg.verify_sig(req) if not em: log.alert( "Invalid signature, missing/untrusted key. Keys in gpg batch: '%s'" % keys) return False user = acl.user_by_email(em) if user == None: # FIXME: security email here log.alert("'%s' not in acl. Keys in gpg batch: '%s'" % (em, keys)) return False acl.set_current_user(user) status.push("request from %s" % user.login) r = request.parse_request(body) if r.kind == 'group': handle_group(r, user) elif r.kind == 'notification': handle_notification(r, user) else: msg = "%s: don't know how to handle requests of this kind '%s'" \ % (user.get_login(), r.kind) log.alert(msg) m = user.message_to() m.set_headers(subject="unknown request") m.write_line(msg) m.send() status.pop() return True
def handle_request(self): BASE_DIR = config['HOME_DIR'] # If it's static, we can just route it, otherwise load that onto the framework request = parse_request(self.request) if 'Accept' in request: mime = request['Accept'].split(',')[0] else: mime = "*/*" if '400' in request: self.send(Response(400, "Bad Request")) status_code = 400 return l = Loader(request) response = Response(l.status, l.data, content_type=mime) status_code = l.status self._log_data += f" {status_code}" self.send(response)
def wait_connections(self): # Main loop awaiting connections self.socket.listen(1) # maximum number of queued connections refresh30 = '<meta http-equiv="refresh" content="300">\n' error404 = '404 - Error' counting = 0 while True: counting += 1 print ("Wait ", counting) try: self.conn, self.addr = self.socket.accept() except KeyboardInterrupt: return except: # Timeout continue req = self.conn.readline() # conn - socket to client // addr - clients address while True: h = self.conn.readline() if not h or h == b'\r\n': break # determine request method (GET / POST are supported) r = parse_request(req) if r == None: header = httpheader(404, self.title) content = error404 self.http_send(header, content, self.footer) elif r['uri'] == b'/index' : header = httpheader(200, self.title, refresh=refresh30) self.http_send(header, cb_index(), self.footer) elif r['uri'] == b'/temperature' or r['uri'] == b'/' : content = cb_temperature() header = httpheader(200, self.title, refresh=refresh30) self.http_send(header, content, self.footer) elif r['uri'] == b'/j' : content = cb_temperature_json() header = httpheader(200, self.title, extension='j') self.http_send(header, content, []) elif r['uri'] == b'/help': content = cb_help() header = httpheader(200, self.title) self.http_send(header, content, self.footer) elif r['uri'] == b'/status': header = httpheader(200, self.title) self.http_send(header, cb_status(), self.footer) elif b'/conf' in r['uri']: if 'key' in r['args'] and 'value' in r['args']: header = httpheader(302, self.title) content = cb_setparam(r['args']['key'], r['args']['value']) elif 'key' in r['args'] : header = httpheader(200, self.title) content = cb_setparam(r['args']['key'], None) else: header = httpheader(200, self.title) content = cb_setparam(None, None) self.title = config.get_config('place') # just in case self.http_send(header, content, self.footer) elif r['uri'] == b'/ssid' : header = httpheader(200, self.title) content = cb_listssid() self.http_send(header, content, self.footer) elif r['uri'] == b'/setconf' : header = httpheader(200, self.title) content = cb_setconf() self.http_send(header, content, self.footer) elif r['uri'] == b'/reboot' : header = httpheader(200, self.title) content = '<h2><a href="/">Reboot in 2\"</a></h2></div>' self.http_send(header, content, self.footer) time.sleep(2) import machine machine.reset() elif r['file'] != b'': myfile = r['file'] try: if myfile == b'port_config.py': raise Exception with open(myfile, 'r') as f: content = f.readlines() header = httpheader(200, self.title) except: header = httpheader(404, self.title) content = 'No such file %s' % myfile self.http_send(header, content, self.footer) else: header = httpheader(404, self.title) content = error404 self.http_send(header, content, self.footer) # At end of loop just close socket and collect garbage self.conn.close() gc.collect()
def wait_connections(self, interface): # Main loop awaiting connections refresh30 = '<meta http-equiv="refresh" content="300">\r\n' redirect2 = '<meta http-equiv="refresh" content="2; url=/"/>\r\n' error404 = '404 - Error' while True: if not interface.isconnected(): raise OSError('Lost connection') print('Wait') try: self.conn, self.addr = self.socket.accept() req = self.conn.readline() except KeyboardInterrupt: raise OSError('Interrupt') except: return l = 0 while True: h = self.conn.readline() if not h or h == b'\r\n': break if 'Content-Length: ' in h: try: l = int(h[16:-2]) except: continue if l: fullreq = self.conn.read(l) print(fullreq) # Some defaults that can be changed in progress code = 200 extension = 'h' refresh = '' # determine request method (GET / POST are supported) r = parse_request(req) if r == None: code = 404 content = error404 elif r['method'] == 'POST' or r['method'] == 'post': print(h) content = cb_setconf(None, None) elif r['uri'] == b'/temperature' or r['uri'] == b'/': refresh = refresh30 content = cb_temperature() elif r['uri'] == b'/j': extension = 'j' content = cb_temperature_json() elif r['uri'] == b'/getconf': content = cb_getconf() elif b'/setconf' in r['uri']: if 'key' in r['args'] and 'value' in r['args']: content = cb_setconf(r['args']['key'], r['args']['value']) elif 'key' in r['args']: content = cb_setconf(r['args']['key'], None) else: content = cb_setconf(None, None) elif r['uri'] == b'/status': content = cb_status() elif r['uri'] == b'/webrepl': import webrepl webrepl.start() refresh = redirect2 code = 302 content = '<h2>Webrepl +5min</h2></div>' elif r['uri'] == b'/5min': self.socket.settimeout(60) refresh = redirect2 code = 302 content = '<h2>+5min</h2></div>' elif r['uri'] == b'/reboot': content = '<h2>Reboot</h2></div>' self.http_send(code, content, extension, redirect2) self.conn.close() machine.reset() elif r['file'] != b'': myfile = r['file'] code = 200 content = cb_open(myfile) else: code = 404 content = error404 # At end of loop just close socket and collect garbage self.http_send(code, content, extension, refresh) self.conn.close() gc.collect()
def wait_connections(self, interface, sleeptime): # Main loop awaiting connections refresh30 = '<meta http-equiv="refresh" content="300">\r\n' redirect2 = '<meta http-equiv="refresh" content="2; url=/"/>\r\n' error404 = '404 - Error' while True: try: self.conn, self.addr = self.socket.accept() except KeyboardInterrupt: return except: continue try: req = self.conn.readline() except: continue # conn - socket to client // addr - clients address while True: h = self.conn.readline() if not h or h == b'\r\n': break # Some defaults that can be changed in progress code = 200 extension = 'h' refresh = '' # determine request method (GET / POST are supported) r = parse_request(req) if r == None: code = 404 content = error404 elif r['uri'] == b'/' or r['uri'] == b'/index': content = '<h2>%s %s</h2>' % (self.title, control.status()) elif r['uri'] == b'/on': content = '<h2>Switch %s</h2>' % control.switch_on() elif r['uri'] == b'/off': content = '<h2>Switch %s</h2>' % control.switch_off() elif r['uri'] == b'/temperature': content = cb_temperature() content = '' elif r['uri'] == b'/j': extension = 'j' content = cb_temperature_json() content = '' elif r['uri'] == b'/getconf': content = cb_getconf() elif b'/setconf' in r['uri']: if 'key' in r['args'] and 'value' in r['args']: content = cb_setconf(r['args']['key'], r['args']['value']) elif 'key' in r['args']: content = cb_setconf(r['args']['key'], None) else: content = cb_setconf(None, None) self.title = config.get_config('place') # just in case elif r['uri'] == b'/status': content = cb_status() elif r['uri'] == b'/webrepl': import webrepl webrepl.start() sleeptime = 299 # almost 5 minutes refresh = redirect2 code = 302 content = '<h2>Webrepl +5min</h2></div>' elif r['uri'] == b'/5min': sleeptime = 299 # almost 5 minutes refresh = redirect2 code = 302 content = '<h2>+5min</h2></div>' elif r['uri'] == b'/reboot': content = '<h2>Reboot</h2></div>' self.http_send(code, content, extension, redirect2) self.conn.close() machine.reset() elif r['file'] != b'': myfile = r['file'] code = 200 content = cb_open(myfile) else: code = 404 content = error404 # At end of loop just close socket and collect garbage self.http_send(code, content, extension, refresh) self.conn.close() gc.collect()