implement signature algorithm
This commit is contained in:
		@@ -7,14 +7,18 @@ class Controller(object):
 | 
				
			|||||||
        self.request = request
 | 
					        self.request = request
 | 
				
			||||||
        self.options = options
 | 
					        self.options = options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def send_response(self, content, code=200, content_type="text/html", last_modified: datetime = None, max_age=None):
 | 
					    def send_response(self, content, code=200, content_type="text/html", last_modified: datetime = None, max_age=None, headers=None):
 | 
				
			||||||
        self.handler.send_response(code)
 | 
					        self.handler.send_response(code)
 | 
				
			||||||
 | 
					        if headers is None:
 | 
				
			||||||
 | 
					            headers = {}
 | 
				
			||||||
        if content_type is not None:
 | 
					        if content_type is not None:
 | 
				
			||||||
            self.handler.send_header("Content-Type", content_type)
 | 
					            headers["Content-Type"] = content_type
 | 
				
			||||||
        if last_modified is not None:
 | 
					        if last_modified is not None:
 | 
				
			||||||
            self.handler.send_header("Last-Modified", last_modified.strftime("%a, %d %b %Y %H:%M:%S GMT"))
 | 
					            headers["Last-Modified"] = last_modified.strftime("%a, %d %b %Y %H:%M:%S GMT")
 | 
				
			||||||
        if max_age is not None:
 | 
					        if max_age is not None:
 | 
				
			||||||
            self.handler.send_header("Cache-Control", "max-age: {0}".format(max_age))
 | 
					            headers["Cache-Control"] = "max-age: {0}".format(max_age)
 | 
				
			||||||
 | 
					        for key, value in headers.items():
 | 
				
			||||||
 | 
					            self.handler.send_header(key, value)
 | 
				
			||||||
        self.handler.end_headers()
 | 
					        self.handler.end_headers()
 | 
				
			||||||
        if type(content) == str:
 | 
					        if type(content) == str:
 | 
				
			||||||
            content = content.encode()
 | 
					            content = content.encode()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,9 +29,10 @@ class StatusController(Controller):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def indexAction(self):
 | 
					    def indexAction(self):
 | 
				
			||||||
        pm = Config.get()
 | 
					        pm = Config.get()
 | 
				
			||||||
 | 
					        headers = None
 | 
				
			||||||
        if "Authorization" in self.request.headers:
 | 
					        if "Authorization" in self.request.headers:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                ReceiverId.getResponseHeader(self.request.headers["Authorization"])
 | 
					                headers = ReceiverId.getResponseHeader(self.request.headers["Authorization"])
 | 
				
			||||||
            except KeyException:
 | 
					            except KeyException:
 | 
				
			||||||
                logger.exception("error processing authorization header")
 | 
					                logger.exception("error processing authorization header")
 | 
				
			||||||
        status = {
 | 
					        status = {
 | 
				
			||||||
@@ -46,4 +47,4 @@ class StatusController(Controller):
 | 
				
			|||||||
            "version": openwebrx_version,
 | 
					            "version": openwebrx_version,
 | 
				
			||||||
            "sdrs": [self.getReceiverStats(r) for r in SdrService.getSources().values()]
 | 
					            "sdrs": [self.getReceiverStats(r) for r in SdrService.getSources().values()]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        self.send_response(json.dumps(status), content_type="application/json")
 | 
					        self.send_response(json.dumps(status), content_type="application/json", headers=headers)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
import re
 | 
					import re
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					import hashlib
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
from owrx.config import Config
 | 
					from owrx.config import Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logger = logging.getLogger(__name__)
 | 
					logger = logging.getLogger(__name__)
 | 
				
			||||||
@@ -47,7 +49,11 @@ class ReceiverId(object):
 | 
				
			|||||||
            raise KeyException("invalid authorization header")
 | 
					            raise KeyException("invalid authorization header")
 | 
				
			||||||
        challenge = KeyChallenge(matches.group(1))
 | 
					        challenge = KeyChallenge(matches.group(1))
 | 
				
			||||||
        key = ReceiverId.findKey(challenge)
 | 
					        key = ReceiverId.findKey(challenge)
 | 
				
			||||||
        # TODO sign challenge and respond
 | 
					        time, signature = ReceiverId.signChallenge(challenge, key)
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            "Signature": signature,
 | 
				
			||||||
 | 
					            "Time": time,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def findKey(challenge):
 | 
					    def findKey(challenge):
 | 
				
			||||||
@@ -61,3 +67,11 @@ class ReceiverId(object):
 | 
				
			|||||||
        if matching_keys:
 | 
					        if matching_keys:
 | 
				
			||||||
            return matching_keys[0]
 | 
					            return matching_keys[0]
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def signChallenge(challenge, key):
 | 
				
			||||||
 | 
					        now = datetime.utcnow().isoformat()
 | 
				
			||||||
 | 
					        signString = "{challenge}:{time}".format(challenge=challenge.challenge, time=now)
 | 
				
			||||||
 | 
					        m = hashlib.sha256()
 | 
				
			||||||
 | 
					        m.update(signString.encode())
 | 
				
			||||||
 | 
					        return now, m.hexdigest()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user