def generate_authorization_request(configuration, registration, redirect_url,
                                   key: jwk.JWK):
    auth_url = configuration["authorization_endpoint"]
    client_id = registration["client_id"]

    pubkey = key.export_public(as_dict=True)
    pubkey.update({"alg": "RS256", "ext": True, "key_ops": ["verify"]})

    nonce = secrets.token_urlsafe(24)
    request = {
        "redirect_uri": redirect_url,
        "display": "page",
        "nonce": nonce,
        "key": pubkey
    }
    print(request)
    # I can't seem to use jwcrypto to encode a jwt and sign it with the key, so let's just
    # install pyjwt and use that instead
    privatekey = key.export_to_pem(private_key=True, password=None)
    request_jwt = jwt.encode(request, key=None, algorithm=None)

    state = secrets.token_urlsafe(24)
    params = {
        "scope": "openid",
        "client_id": client_id,
        # TODO: This should be the values we added when registering
        "response_type": "id_token token",
        "request": request_jwt,
        "state": state,
    }

    p = Request('GET', auth_url, params=params).prepare()

    return p.url
Example #2
0
  def get_challenge(self, public_key: jwk.JWK):
    key_id = public_key.thumbprint(self._hasher_name)

    if not key_id in self._keys:
      self._keys[key_id] = public_key.export_public(as_dict=True)

    challenge = self._get_sts(key_id, expires_on=time.time() + self._ttl)
    challenge_hash = self._hashfn(challenge).digest()
    # if algorithm == 'rsa-sha256-pss':
    #   signature = self._keypair.sign(
    #       challenge_hash,
    #       padding=PSS(mgf=MGF1(self._hasher_name),
    #                   salt_length=self._hasher_name.digest_size),
    #       algorithm=self._hasher_name
    #   )
    if algorithm == 'rsa-sha256':
      signature = self._keypair.sign(
          challenge_hash,
          padding=PKCS1v15(),
          algorithm=self._hasher_name
      )
    else:
      raise NotImplementedError('Cannot sign data: invalid algorithm')

    return ':'.join([_bytes_to_base64str(obj) for obj in [challenge_hash, signature, challenge]])
Example #3
0
def encrypt(payload, key: jwk.JWK, namespace: str, path: Path = None):
    """Encrypt and assemble a payload.

    https://jwcrypto.readthedocs.io/en/stable/jwe.html
    """
    public_key = jwk.JWK.from_json(key.export_public())
    protected_header = {
        "alg": "ECDH-ES",
        "enc": "A256GCM",
        "typ": "JWE",
        "kid": public_key.thumbprint(),
    }
    compressed = gzip.compress(json.dumps(payload).encode())
    jwetoken = jwe.JWE(compressed,
                       recipient=public_key,
                       protected=protected_header)

    # load the envelope
    with (pioneer /
          "telemetry.pioneer-study.4.sample.pass.json").open("r") as fp:
        envelope = json.load(fp)

    # by convention, the encryption key is the document namespace since each
    # study is contained within a dataset
    envelope["payload"] = {
        **envelope["payload"],
        **dict(
            encryptedData=jwetoken.serialize(compact=True),
            encryptionKeyId=namespace,
            schemaNamespace=namespace,
            schemaName="test",
            schemaVersion=1,
        ),
    }

    if path:
        with path.open("w") as fp:
            write_serialized(json.dumps(envelope), fp)
    return envelope
Example #4
0
def ServerMain(q,tport):
    filu = 'serverdaemon.ini'
    HOST = '0.0.0.0'    #change to None if wanted listen from IPv6 address
    try:
        fp = open(filu, 'r+')
        Config.readfp(fp)
        url = Config.get('REST','url')
        header = Config.get('REST','header')
        if tport==0:
            tport = int(Config.get('DAEMON','port'))
        PORT = int(Config.get('DAEMON','port'))
        fp.close()
    except:
        url = input('anna url:')
        header = input('anna header:')
        port = input('anna port:')
        cfgfile = open(filu,'w')
        try:
            Config.add_section('REST')
            Config.add_section('DAEMON')
            print("*** Created sections")
        except:
            print('*** sections already exists')
        Config.set('REST','url',url)
        Config.set('REST','header', header)
        Config.set('DAEMON','port',port)
        Config.write(cfgfile)
        cfgfile.close()
        tport = int(Config.get('DAEMON','port'))
        url = Config.get('REST','url')
        header =  Config.get('REST','header')
        PORT = int(Config.get('DAEMON','port'))
        print("*** Created information.")
    header = ast.literal_eval(header)
    try:
        conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        while True:
            print("*** Main ***")
            #print("*" * 60)
            conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            try:
                conn.bind((HOST, PORT))
            except:
                print("Main *** Ei onnistunut")
                ServerMain(q,tport)
            info = conn.recvfrom(1024)
            #print(info)
            data = info[0].decode("utf-8")
            #print (data)
            addr = info[1]
            #print (addr)
            
            #datan tarkistus ja säikeen aloitus
            if data=="I am Client":
                #print("Main *** Right start message")

                #lähetetään julkinen avain
                key = JWK(generate="RSA",public_exponent=29,size=1000)
                public_key = key.export_public()
                conn.sendto(public_key.encode("utf-8"),addr)

                #otetaan viesti vastaan ja avataan
                encrypted_signed_token = conn.recv(1024).decode("utf-8")
                #print(encrypted_signed_token)

                E = JWE()
                E.deserialize(encrypted_signed_token, key)
                raw_payload = E.payload
                #print("*** raw payload:",raw_payload)
                string = raw_payload.decode("utf-8")
                #print("*** received str:", string)
                Payload = json.loads(string)
                #print("*** JSON:",Payload)
                #print("*** received payload:", Payload['exp'])

                #käydään REST app kysymässä Kumokselta
                mac = str(Payload['exp'])
                myResponse = requests.get(url + mac,header)
                #print(url + mac,header)
                #print("REST:", myResponse.status_code)
                if(myResponse.ok):
                    print("main *** Found!")
                    jData = json.loads(myResponse.content.decode("utf-8"))
                    #print("The response contains {0} properties".format(len(jData)))
                    
                    # Konrollerille yhteys
                    
                    
                    #Haetaan "listalta"
                    if not q.empty():
                        tport = q.get()
                        conn.sendto(tport.encode("utf-8"),addr)
                    else:
                        tport = str(int(tport)+1)
                        conn.sendto(tport.encode("utf-8"),addr)

                    #Aloitetaan stringissä uusi yhteys
                    thread.start_new_thread(Listen_Client,(url,data,tport,q,header,))
                else:
                    print("Main *** Not found")
                    answer="Good try <3"
                    conn.sendto(answer.encode("utf-8"),addr)
            else:
                conn.close()
                print("*" * 60)
        conn.close()
        print("*" * 60)
    except:
        conn.close()
        print("Main *** Frong message. Start again")
        ServerMain(q,tport)
Example #5
0
def Listen_Client(url,data,tport,q,header):
    try:
        while True:
            #print("---Thread---")
            HOST = '0.0.0.0'
            PORT = int(tport)
            conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            try:
                conn.bind((HOST, PORT))
                print("Thread *** Bind is ready", PORT)
            except:
                print("Thread *** Connection bind failed")
                Listen_Client(url,data,PORT,q,header)
            info = conn.recvfrom(1024)
            #print(info)
            data = info[0].decode("utf-8")
            #print (data)
            addr = info[1]
            #print (addr)
            #print("-" * 60)
            #print('Thread *** connected by', addr)
            key = JWK(generate="RSA",public_exponent=29,size=1000)
            public_key = key.export_public()
            #print('Thread *** public key',public_key)
            conn.sendto(public_key.encode("utf-8"),addr)
            #otetaan viesti vastaan ja avataan
            try:
                conn.settimeout(60)
                encrypted_signed_token_info = conn.recvfrom(1024)
                encrypted_signed_token = encrypted_signed_token_info[0].decode("utf-8")
                #print(encrypted_signed_token)
            except:
                print('Thread *** time out')
                break
            E = JWE()
            E.deserialize(encrypted_signed_token, key)
            raw_payload = E.payload
            string = raw_payload.decode("utf-8")
            Payload = json.loads(string)
            #print("Thread *** received payload:", Payload['exp'])
            #käydään REST app kysymässä Kumokselta
            mac = str(Payload['exp'])
            myResponse = requests.get(url + mac,header)
            #print(url + mac,header)
            #print("Thread *** REST:", myResponse.status_code)
            #tarkistus
            if(myResponse.ok):
                print("Thread *** Found!")
                jData = json.loads(myResponse.content.decode("utf-8"))
                #print("The response contains {0} properties".format(len(jData)))
                conn.close()
            else:
                print("Thread *** Not found")
                answer="Good try <3"
                conn.send(answer.encode("utf-8"))
                #SDN irrottaa kyseisen laitteen verkosta
                break
            conn.close()
        #conn.close()
        print("Thread *** end")
        q.put(tport)
    except:
        #conn.close()
        q.put(tport)
        print("Thread *** Forced end")
def Listen_Client(url,data,tport,q,header):
    try:
        while True:
            HOST = '0.0.0.0'
            PORT = tport
            s = None
            for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
                af, socktype, proto, canonname, sa = res
                try:
                    s = socket.socket(af, socktype, proto)
                    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
                except socket.error as msg:
                    print("Thread *** error message:",msg)
                    s = None
                    sys.exit(1)
                    continue
                try:
                    print("Thread",sa)
                    s.bind(sa)
                    s.listen(1)
                except socket.error as msg:
                    print("Thread *** error message:",msg)
                    s.close()
                    s = None
                    sys.exit(1)
                    continue
                break
            if s is None:
                print("Thread *** could not open socket")
                break
            conn, addr = s.accept()
            while True:
                print("-" * 60)
                print('Thread *** connected by', addr)
                key = JWK(generate="RSA",public_exponent=29,size=1000)
                public_key = key.export_public()
                print('Thread *** public key',public_key)
                conn.send(public_key.encode("utf-8"))
                #otetaan viesti vastaan ja avataan
                try:
                    conn.settimeout(20)
                    encrypted_signed_token = conn.recv(1024).decode("utf-8")
                    print(encrypted_signed_token)
                except:
                    print('Thread *** time out')
                    q.put(tport)
                    break
                E = JWE()
                E.deserialize(encrypted_signed_token, key)
                raw_payload = E.payload
                string = raw_payload.decode("utf-8")
                Payload = json.loads(string)
                #print("Thread *** received payload:", Payload['exp'])
                while True:
                    try:
                        #käydään REST app kysymässä Kumokselta
                        mac = str(Payload['exp'])
                        myResponse = requests.get(url + mac,header)
                        break
                    except:
                        print("Thread *** REST failed")
                print(url + mac,header)
                print("Thread *** REST:", myResponse.status_code)
                        
                #tarkistus
                if(myResponse.ok):
                    print("Thread *** Found!")
                    jData = json.loads(myResponse.content.decode("utf-8"))
                    print("The response contains {0} properties".format(len(jData)))
                elif myResponse.status_code==400:
                    print("Baasbox is down or configuration file is wrong")
                    break
                else:
                    print("Thread *** Not found")
                    answer="Good try <3"
                    conn.send(answer.encode("utf-8"))
                    q.put(tport)
                    #SDN irrottaa kyseisen laitteen verkosta   
                    break
            conn.close()
            #break
        print("Thread *** end")
        print("-" * 60)
    except Exception as msg:
        print("Thread *** Forced end")
        print(msg)
        print("-" * 60)
def mainServer(q):
    filu = 'serverdaemon.ini'
    HOST = '0.0.0.0'    #change to None if wanted listen from IPv6 address
    try:
        fp = open(filu, 'r+')
        Config.readfp(fp)
        url = Config.get('REST','url')
        header = Config.get('REST','header')
        tport = int(Config.get('DAEMON','port'))
        PORT = int(Config.get('DAEMON','port'))
        fp.close()
    except:
        filu = input('anna kansion nimi:')
        url = input('anna url:')
        header = input('anna header:')
        port = input('anna port:')
        cfgfile = open(filu,'w')
        try:
            Config.add_section('REST')
            Config.add_section('DAEMON')
            print("*** Created sections")
        except:
            print('*** sections already exists')
        Config.set('REST','url',url)
        Config.set('REST','header', header)
        Config.set('DAEMON','port',port)
        Config.write(cfgfile)
        cfgfile.close()
        tport = int(Config.get('DAEMON','port'))
        url = Config.get('REST','url')
        header =  Config.get('REST','header')
        PORT = int(Config.get('DAEMON','port'))
        print("*** Created information.")
    header = ast.literal_eval(header)

    while True:
        s = None
        for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
            af, socktype, proto, canonname, sa = res
            try:
                s = socket.socket(af, socktype, proto)
                s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
            except socket.error as msg:
                s = None
                continue
            try:
                #print('Main ***',sa)
                s.bind(sa)
                s.listen(1)
            except socket.error as msg:
                s.close()
                s = None
                continue
            break
        if s is None:
            print('Main *** Could not open socket')
            mainServer(q)
            #sys.exit(1)
        conn, addr = s.accept()

        print("*" * 60)
        print('Main *** Connected by', addr)
        try:
            conn.settimeout(5)
            data = conn.recv(1024).decode("utf-8")
            conn.settimeout(None)
        except:
            print("Main *** timeout")
            mainServer(q)
        print(data)
        
        #datan tarkistus ja säikeen aloitus
        if data=="I am Client":
            print("Main*** Right start message")

            #lähetetään julkinen avain
            key = JWK(generate="RSA",public_exponent=29,size=1000)
            public_key = key.export_public()
            conn.send(public_key.encode("utf-8"))

            #otetaan viesti vastaan ja avataan
            encrypted_signed_token = conn.recv(1024).decode("utf-8")
            print(encrypted_signed_token)

            E = JWE()
            E.deserialize(encrypted_signed_token, key)
            raw_payload = E.payload
            print("*** raw payload:",raw_payload)
            string = raw_payload.decode("utf-8")
            print("*** received str:", string)
            Payload = json.loads(string)
            print("*** JSON:",Payload)
            print("*** received payload:", Payload['exp'])
            while True:
                try:
                    #käydään kysymässä onko listoilla
                    mac = str(Payload['exp'])
                    myResponse = requests.get(url + mac,header)
                    print(url + mac,header)
                    print("REST:", myResponse.status_code)
                    break
                except:
                    print("Main *** REST failed")
            if(myResponse.ok):
                print("Main *** Found!")
                jData = json.loads(myResponse.content.decode("utf-8"))
                print("The response contains {0} properties".format(len(jData)))
                    
                #Kontrollerille viestiä, id configuroitavissa
                #{
                #ip: string,
                #valid: bool
                #}
                #POST /iot-service/:id
                        
                #Haetaan "listalta"
                if not q.empty():
                    free_port = q.get()
                    conn.send(free_port.encode("utf-8"))
                else:
                    tport = str(int(tport)+1)
                    conn.send(tport.encode("utf-8"))

                #Aloitetaan stringissä uusi yhteys
                #conn.shutdown(socket.SHUT_RDWR)
                conn.close()
                thread.start_new_thread(Listen_Client,(url,data,tport,q,header,))
            elif myResponse.status_code==400:
                print("Baasbox is down or configuration file is wrong")
                break
            else:
                print("Not found")
                answer="Good try <3"
                conn.send(answer.encode("utf-8"))
                break    
        else:
            conn.close()
            print("*" * 60)
    conn.close()
    print("*" * 60)
Example #8
0
def Listen_Client(url, data, tport, q, header):
    try:
        while True:
            HOST = '0.0.0.0'
            PORT = tport
            s = None
            for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                          socket.SOCK_STREAM, 0,
                                          socket.AI_PASSIVE):
                af, socktype, proto, canonname, sa = res
                try:
                    s = socket.socket(af, socktype, proto)
                    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                except socket.error as msg:
                    #print(PORT,"Thread *** error message:",msg)
                    s = None
                    sys.exit(1)
                    continue
                try:
                    #print("Thread",sa)
                    s.bind(sa)
                    s.listen(1)
                except socket.error as msg:
                    print(PORT, "Thread *** error message:", msg)
                    s.close()
                    s = None
                    sys.exit(1)
                    continue
                break
            if s is None:
                print(PORT, "Thread *** could not open socket")
                break
            conn, addr = s.accept()
            while True:
                #print("-" * 60)
                #print('Thread *** connected by', addr)
                key = JWK(generate="RSA", public_exponent=29, size=1000)
                public_key = key.export_public()
                #print('Thread *** public key',public_key)
                conn.send(public_key.encode("utf-8"))
                #otetaan viesti vastaan ja avataan
                try:
                    conn.settimeout(20)
                    encrypted_signed_token = conn.recv(1024).decode("utf-8")
                    #print(encrypted_signed_token)
                except:
                    print(PORT, 'Thread *** time out')
                    q.put(tport)
                    break
                try:
                    E = JWE()
                    E.deserialize(encrypted_signed_token, key)
                except Exception as msg:
                    print(PORT, 'Thread *** Wrong key', encrypted_signed_token)
                    print(PORT, 'Thread *** Wrong key', public_key)
                    print(PORT, 'Thread *** Wrong key', msg)
                    break
                raw_payload = E.payload
                string = raw_payload.decode("utf-8")
                Payload = json.loads(string)
                #print("Thread *** received payload:", Payload['exp'])
                while True:
                    try:
                        #käydään REST app kysymässä Kumokselta
                        mac = str(Payload['exp'])
                        #myResponse = requests.get(url + mac,header)
                        myResponse = Check_rest(url, mac, header)
                        break
                    except Exception as msg:
                        print(PORT, "Thread *** REST failed", msg)
                #print(url + mac,header)
                #print("Thread *** REST:", myResponse.status_code)

                #tarkistus
                if (myResponse == 200):
                    #if(mac=='mac=00-00-00-00-00-01'):
                    #print("Thread *** Found!")
                    jData = "mac=00-00-00-00-00-01"
                    #jData = json.loads(myResponse.content.decode("utf-8"))
                    #print("The response contains {0} properties".format(len(jData)))
                else:
                    print("Thread *** Not found")
                    answer = "Good try <3"
                    conn.send(answer.encode("utf-8"))
                    q.put(tport)
                    #SDN irrottaa kyseisen laitteen verkosta
                    break
            conn.close()
            #break
        print(PORT, "Thread *** end")
        print("-" * 60)
    except Exception as msg:
        print(PORT, "Thread *** Forced end", msg)
        print("-" * 60)
Example #9
0
def mainServer(kierros, PORT, q):
    if (kierros == 0):
        info = filu_checker()
        print(info)
        info = dict(info)
        url = info['url']
        header = info['header']
        PORT = int(info['port'])
        tport = int(info['port'])
        kierros = 1
    HOST = '0.0.0.0'  #change to None if wanted listen from IPv6 address
    while True:
        s = None
        for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                      socket.SOCK_STREAM, 0,
                                      socket.AI_PASSIVE):
            af, socktype, proto, canonname, sa = res
            try:
                s = socket.socket(af, socktype, proto)
                s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            except socket.error as msg:
                print("Main ***", msg)
                s = None
                continue
            try:
                #print('Main ***',sa)
                s.bind(sa)
                s.listen(1)
            except socket.error as msg:
                print("Main ***", msg)
                s.close()
                s = None
                continue
            break
        if s is None:
            print('Main *** Could not open socket')
            time.sleep(10)
            PORT = PORT + 1
            mainServer(kierros, PORT, q)
            #sys.exit(1)
        conn, addr = s.accept()

        #print("*" * 60)
        #print('Main *** Connected by', addr)
        try:
            #conn.settimeout(5)
            data = conn.recv(1024).decode("utf-8")
            #conn.settimeout(None)
        except:
            print("Main *** timeout")
            mainServer(kierros, PORT, q)
        #print(data)

        #datan tarkistus ja säikeen aloitus
        if data == "I am Client":
            #print("Main*** Right start message")

            #lähetetään julkinen avain
            key = JWK(generate="RSA", public_exponent=29, size=1000)
            public_key = key.export_public()
            conn.send(public_key.encode("utf-8"))

            #otetaan viesti vastaan ja avataan
            encrypted_signed_token = conn.recv(1024).decode("utf-8")
            #print(encrypted_signed_token)
            try:
                E = JWE()
                E.deserialize(encrypted_signed_token, key)
                raw_payload = E.payload
                #print("*** raw payload:",raw_payload)
                string = raw_payload.decode("utf-8")
            except Exception as msg:
                print('Main *** Wrong key', encrypted_signed_token)
                print('Main *** Wrong key', public_key)
                print('Main *** Wrong key', msg)
                break
            #print("*** received str:", string)
            Payload = json.loads(string)
            #print("*** JSON:",Payload)
            #print("*** received payload:", Payload['exp'])
            while True:
                try:
                    #käydään kysymässä onko listoilla
                    mac = str(Payload['exp'])

                    #Tähän kohti kysymys lähetetään request session ohjelmalle
                    myResponse = Check_rest(url, mac, header)
                    #myResponse = requests.get(url + mac,header)
                    #print(url + mac,header)
                    #print("REST:", myResponse.status_code)

                    break
                except Exception as msg:
                    print("Main *** REST failed", msg)
                    sys.exit(1)
            if (myResponse == 200):
                #if(mac=='mac=00-00-00-00-00-01'):
                #print("Main *** Found!")
                #jData = json.loads(myResponse.content.decode("utf-8"))
                #print("The response contains {0} properties".format(len(jData)))
                jData = 'mac=00-00-00-00-00-01'
                #Kontrollerille viestiä, id configuroitavissa
                #{
                #ip: string,
                #valid: bool
                #}
                #POST /iot-service/:id

                #Haetaan "listalta"
                if not q.empty():
                    free_port = q.get()
                    conn.send(free_port.encode("utf-8"))
                else:
                    tport = str(int(tport) + 1)
                    conn.send(tport.encode("utf-8"))

                #Aloitetaan stringissä uusi yhteys
                #conn.shutdown(socket.SHUT_RDWR)
                conn.close()
                thread.start_new_thread(Listen_Client, (
                    url,
                    data,
                    tport,
                    q,
                    header,
                ))
            else:
                print("Not found", myResponse.status_code)
                answer = "Good try <3"
                conn.send(answer.encode("utf-8"))
                break
        else:
            conn.close()
            print("*" * 60)
    conn.close()
    print("*" * 60)
Example #10
0
def mainServer(q):
    filu = 'serverdaemon.ini'
    HOST = '0.0.0.0'  #change to None if wanted listen from IPv6 address
    try:
        fp = open(filu, 'r+')
        Config.readfp(fp)
        url = Config.get('REST', 'url')
        header = Config.get('REST', 'header')
        tport = int(Config.get('DAEMON', 'port'))
        PORT = int(Config.get('DAEMON', 'port'))
        fp.close()
    except:
        filu = input('anna kansion nimi:')
        url = input('anna url:')
        header = input('anna header:')
        port = input('anna port:')
        cfgfile = open(filu, 'w')
        try:
            Config.add_section('REST')
            Config.add_section('DAEMON')
            print("*** Created sections")
        except:
            print('*** sections already exists')
        Config.set('REST', 'url', url)
        Config.set('REST', 'header', header)
        Config.set('DAEMON', 'port', port)
        Config.write(cfgfile)
        cfgfile.close()
        tport = int(Config.get('DAEMON', 'port'))
        url = Config.get('REST', 'url')
        header = Config.get('REST', 'header')
        PORT = int(Config.get('DAEMON', 'port'))
        print("*** Created information.")
    header = ast.literal_eval(header)

    while True:
        s = None
        for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                      socket.SOCK_STREAM, 0,
                                      socket.AI_PASSIVE):
            af, socktype, proto, canonname, sa = res
            try:
                s = socket.socket(af, socktype, proto)
                s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            except socket.error as msg:
                s = None
                continue
            try:
                #print('Main ***',sa)
                s.bind(sa)
                s.listen(1)
            except socket.error as msg:
                s.close()
                s = None
                continue
            break
        if s is None:
            print('Main *** Could not open socket')
            mainServer(q)
            #sys.exit(1)
        conn, addr = s.accept()

        print("*" * 60)
        print('Main *** Connected by', addr)
        try:
            conn.settimeout(5)
            data = conn.recv(1024).decode("utf-8")
            conn.settimeout(None)
        except:
            print("Main *** timeout")
            mainServer(q)
        print(data)

        #datan tarkistus ja säikeen aloitus
        if data == "I am Client":
            print("Main*** Right start message")

            #lähetetään julkinen avain
            key = JWK(generate="RSA", public_exponent=29, size=1000)
            public_key = key.export_public()
            conn.send(public_key.encode("utf-8"))

            #otetaan viesti vastaan ja avataan
            encrypted_signed_token = conn.recv(1024).decode("utf-8")
            print(encrypted_signed_token)

            E = JWE()
            E.deserialize(encrypted_signed_token, key)
            raw_payload = E.payload
            print("*** raw payload:", raw_payload)
            string = raw_payload.decode("utf-8")
            print("*** received str:", string)
            Payload = json.loads(string)
            print("*** JSON:", Payload)
            print("*** received payload:", Payload['exp'])
            while True:
                try:
                    #käydään kysymässä onko listoilla
                    mac = str(Payload['exp'])
                    myResponse = requests.get(url + mac, header)
                    print(url + mac, header)
                    print("REST:", myResponse.status_code)
                    break
                except:
                    print("Main *** REST failed")
            if (myResponse.ok):
                print("Main *** Found!")
                jData = json.loads(myResponse.content.decode("utf-8"))
                print("The response contains {0} properties".format(
                    len(jData)))

                #Kontrollerille viestiä, id configuroitavissa
                #{
                #ip: string,
                #valid: bool
                #}
                #POST /iot-service/:id

                #Haetaan "listalta"
                if not q.empty():
                    free_port = q.get()
                    conn.send(free_port.encode("utf-8"))
                else:
                    tport = str(int(tport) + 1)
                    conn.send(tport.encode("utf-8"))

                #Aloitetaan stringissä uusi yhteys
                #conn.shutdown(socket.SHUT_RDWR)
                conn.close()
                thread.start_new_thread(Listen_Client, (
                    url,
                    data,
                    tport,
                    q,
                    header,
                ))
            elif myResponse.status_code == 400:
                print("Baasbox is down or configuration file is wrong")
                break
            else:
                print("Not found")
                answer = "Good try <3"
                conn.send(answer.encode("utf-8"))
                break
        else:
            conn.close()
            print("*" * 60)
    conn.close()
    print("*" * 60)
Example #11
0
def mainServer(kierros,PORT,q):
    if(kierros==0):
        info = filu_checker()
        print(info)
        info = dict(info)
        url = info['url']
        header = info['header']
        PORT = int(info['port'])
        tport = int(info['port'])
        kierros = 1
    HOST = '0.0.0.0'    #change to None if wanted listen from IPv6 address
    while True:
        s = None
        for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
            af, socktype, proto, canonname, sa = res
            try:
                s = socket.socket(af, socktype, proto)
                s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
            except socket.error as msg:
                print("Main ***",msg)
                s = None
                continue
            try:
                #print('Main ***',sa)
                s.bind(sa)
                s.listen(1)
            except socket.error as msg:
                print("Main ***",msg)
                s.close()
                s = None
                continue
            break
        if s is None:
            print('Main *** Could not open socket')
            time.sleep(10)
            PORT = PORT+1
            mainServer(kierros,PORT,q)
            #sys.exit(1)
        conn, addr = s.accept()

        #print("*" * 60)
        #print('Main *** Connected by', addr)
        try:
            #conn.settimeout(5)
            data = conn.recv(1024).decode("utf-8")
            #conn.settimeout(None)
        except:
            print("Main *** timeout")
            mainServer(kierros,PORT,q)
        #print(data)
        
        #datan tarkistus ja säikeen aloitus
        if data=="I am Client":
            #print("Main*** Right start message")

            #lähetetään julkinen avain
            key = JWK(generate="RSA",public_exponent=29,size=1000)
            public_key = key.export_public()
            conn.send(public_key.encode("utf-8"))

            #otetaan viesti vastaan ja avataan
            encrypted_signed_token = conn.recv(1024).decode("utf-8")
            #print(encrypted_signed_token)
            try:
                E = JWE()
                E.deserialize(encrypted_signed_token, key)
                raw_payload = E.payload
                #print("*** raw payload:",raw_payload)
                string = raw_payload.decode("utf-8")
            except Exception as msg:
                print('Main *** Wrong key',encrypted_signed_token)
                print('Main *** Wrong key',public_key)
                print('Main *** Wrong key',msg)
                break
            #print("*** received str:", string)
            Payload = json.loads(string)
            #print("*** JSON:",Payload)
            #print("*** received payload:", Payload['exp'])
            while True:
                try:
                    #käydään kysymässä onko listoilla
                    mac = str(Payload['exp'])


                    #Tähän kohti kysymys lähetetään request session ohjelmalle
                    myResponse = Check_rest(url,mac,header)
                    #myResponse = requests.get(url + mac,header)
                    #print(url + mac,header)
                    #print("REST:", myResponse.status_code)


                    break
                except Exception as msg:
                    print("Main *** REST failed",msg)
                    sys.exit(1)
            if(myResponse == 200):
            #if(mac=='mac=00-00-00-00-00-01'):
                #print("Main *** Found!")
                #jData = json.loads(myResponse.content.decode("utf-8"))
                #print("The response contains {0} properties".format(len(jData)))
                jData = 'mac=00-00-00-00-00-01'
                #Kontrollerille viestiä, id configuroitavissa
                #{
                #ip: string,
                #valid: bool
                #}
                #POST /iot-service/:id

                #Haetaan "listalta"
                if not q.empty():
                    free_port = q.get()
                    conn.send(free_port.encode("utf-8"))
                else:
                    tport = str(int(tport)+1)
                    conn.send(tport.encode("utf-8"))

                #Aloitetaan stringissä uusi yhteys
                #conn.shutdown(socket.SHUT_RDWR)
                conn.close()
                thread.start_new_thread(Listen_Client,(url,data,tport,q,header,))
            else:
                print("Not found",myResponse.status_code)
                answer="Good try <3"
                conn.send(answer.encode("utf-8"))
                break
        else:
            conn.close()
            print("*" * 60)
    conn.close()
    print("*" * 60)