LDN10
This commit is contained in:
parent
d7d1a45e78
commit
885ce73d7e
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.DS_Store
|
8
LDN10/.idea/.gitignore
vendored
Normal file
8
LDN10/.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
10
LDN10/.idea/LDN10.iml
Normal file
10
LDN10/.idea/LDN10.iml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
6
LDN10/.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
LDN10/.idea/inspectionProfiles/profiles_settings.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
7
LDN10/.idea/misc.xml
Normal file
7
LDN10/.idea/misc.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.12 (LDN10)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (LDN10)" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
LDN10/.idea/modules.xml
Normal file
8
LDN10/.idea/modules.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/LDN10.iml" filepath="$PROJECT_DIR$/.idea/LDN10.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
LDN10/.idea/vcs.xml
Normal file
6
LDN10/.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
21
LDN10/certs/clients.pem
Normal file
21
LDN10/certs/clients.pem
Normal file
|
@ -0,0 +1,21 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDizCCAnOgAwIBAgIUVPHhcVC0FfI3dsbcMAd0AEifmPMwDQYJKoZIhvcNAQEL
|
||||
BQAwVTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
|
||||
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEOMAwGA1UEAwwFamFuZXowHhcNMjQw
|
||||
NTI2MTU1ODQ4WhcNMjUwNTI2MTU1ODQ4WjBVMQswCQYDVQQGEwJBVTETMBEGA1UE
|
||||
CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
|
||||
MQ4wDAYDVQQDDAVqYW5lejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||
AJd9GojC/SaEAUFopY1T6P/U2jZlBkYlGgLh4QWLOdwQr3O9SwbKovVaCANtFWBo
|
||||
vXFaduJ2d19RaEI8CbffjONlYIGecppoeKXoSe9z7qSjQPvqnijcOVLyuLNsTM1U
|
||||
mewsdDjVxa+ZjLNAkqU3QrKl28ms945nogYYvOYiyNelwb6VkCi+Sm+Gu7lDQytZ
|
||||
OteFA9o3OLXP5tbPJT3AjRbXReuARHFy3Q6rburszyUfeT9XatQQ9zLWAlnU3w3X
|
||||
a5vP7lJHLoF1NiVdbmE2H12LPR43Ima0zLfDOf8YpY2DQaENlNuMuJ4NRjUydI69
|
||||
kbonAaZNX196FmX03GHZUCUCAwEAAaNTMFEwHQYDVR0OBBYEFKE0+A+tQNYWGRff
|
||||
dPhuISf1W7qvMB8GA1UdIwQYMBaAFKE0+A+tQNYWGRffdPhuISf1W7qvMA8GA1Ud
|
||||
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAD0uiU+vjpLIRqshFBtzWJ7K
|
||||
zRXb6zR1EGhbs63HRoTmW4s/YCuwZqdvmggd4j5a9RtFCIRO/4MjswrXV6rG0IiN
|
||||
JXSb4ugz44oGUXsWboGHq3e8/pTJMq+cT4EO2t+irZ2qPe+jtZOJQwDU2NEJzkN6
|
||||
P+mcNR1I3pVfA+h1kLDspyv/6pbGQrfo0S8sJzetGYSFPBvEOagS6iHRlC7PwqrZ
|
||||
gCADDHeewNksX8wGqiselXYQbiIrcGrb42fDgoX0aovEqUuux8Ukifm+DU1P9Hzv
|
||||
FdMuT/pFNcwOXaETKN4oS4zMB/qGxqEnh3d7oItSBY3XjTgSORC25yf3irTWTww=
|
||||
-----END CERTIFICATE-----
|
21
LDN10/certs/janez_cert.crt
Normal file
21
LDN10/certs/janez_cert.crt
Normal file
|
@ -0,0 +1,21 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDizCCAnOgAwIBAgIUVPHhcVC0FfI3dsbcMAd0AEifmPMwDQYJKoZIhvcNAQEL
|
||||
BQAwVTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
|
||||
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEOMAwGA1UEAwwFamFuZXowHhcNMjQw
|
||||
NTI2MTU1ODQ4WhcNMjUwNTI2MTU1ODQ4WjBVMQswCQYDVQQGEwJBVTETMBEGA1UE
|
||||
CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
|
||||
MQ4wDAYDVQQDDAVqYW5lejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||
AJd9GojC/SaEAUFopY1T6P/U2jZlBkYlGgLh4QWLOdwQr3O9SwbKovVaCANtFWBo
|
||||
vXFaduJ2d19RaEI8CbffjONlYIGecppoeKXoSe9z7qSjQPvqnijcOVLyuLNsTM1U
|
||||
mewsdDjVxa+ZjLNAkqU3QrKl28ms945nogYYvOYiyNelwb6VkCi+Sm+Gu7lDQytZ
|
||||
OteFA9o3OLXP5tbPJT3AjRbXReuARHFy3Q6rburszyUfeT9XatQQ9zLWAlnU3w3X
|
||||
a5vP7lJHLoF1NiVdbmE2H12LPR43Ima0zLfDOf8YpY2DQaENlNuMuJ4NRjUydI69
|
||||
kbonAaZNX196FmX03GHZUCUCAwEAAaNTMFEwHQYDVR0OBBYEFKE0+A+tQNYWGRff
|
||||
dPhuISf1W7qvMB8GA1UdIwQYMBaAFKE0+A+tQNYWGRffdPhuISf1W7qvMA8GA1Ud
|
||||
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAD0uiU+vjpLIRqshFBtzWJ7K
|
||||
zRXb6zR1EGhbs63HRoTmW4s/YCuwZqdvmggd4j5a9RtFCIRO/4MjswrXV6rG0IiN
|
||||
JXSb4ugz44oGUXsWboGHq3e8/pTJMq+cT4EO2t+irZ2qPe+jtZOJQwDU2NEJzkN6
|
||||
P+mcNR1I3pVfA+h1kLDspyv/6pbGQrfo0S8sJzetGYSFPBvEOagS6iHRlC7PwqrZ
|
||||
gCADDHeewNksX8wGqiselXYQbiIrcGrb42fDgoX0aovEqUuux8Ukifm+DU1P9Hzv
|
||||
FdMuT/pFNcwOXaETKN4oS4zMB/qGxqEnh3d7oItSBY3XjTgSORC25yf3irTWTww=
|
||||
-----END CERTIFICATE-----
|
28
LDN10/certs/janez_private.key
Normal file
28
LDN10/certs/janez_private.key
Normal file
|
@ -0,0 +1,28 @@
|
|||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXfRqIwv0mhAFB
|
||||
aKWNU+j/1No2ZQZGJRoC4eEFizncEK9zvUsGyqL1WggDbRVgaL1xWnbidndfUWhC
|
||||
PAm334zjZWCBnnKaaHil6Envc+6ko0D76p4o3DlS8rizbEzNVJnsLHQ41cWvmYyz
|
||||
QJKlN0KypdvJrPeOZ6IGGLzmIsjXpcG+lZAovkpvhru5Q0MrWTrXhQPaNzi1z+bW
|
||||
zyU9wI0W10XrgERxct0Oq27q7M8lH3k/V2rUEPcy1gJZ1N8N12ubz+5SRy6BdTYl
|
||||
XW5hNh9diz0eNyJmtMy3wzn/GKWNg0GhDZTbjLieDUY1MnSOvZG6JwGmTV9fehZl
|
||||
9Nxh2VAlAgMBAAECggEADrICoHC16QYWLxetM6QHrsWhs3QiYyyXNN9fmk+Suc/e
|
||||
jU44GH0QyNdGfrqWv8b5VaUucjKGyvbVM9OqJ62md6qubXSG7oai6Yk6nuFyrYLu
|
||||
u2FbnWAbqXnFRBaF7sc9tUTss1S9fBbbqMnjT+an8DeZthsy2pwgAhJlRLfsHssd
|
||||
2nbXhF2Ko9lMHECzqPggD0LKN7UfDTOqdJHiSm1svMiY026ec1VUe0UepC7F1o2V
|
||||
mG39RPqFjTnsXJ2ajzFDVMvWM75J8DfTvsdAyaxjvoWamMrZap8ibWpnm0UxSWIh
|
||||
A46O5y4/CSxUVl3Bp/Oxnu+Agdo5fHA8yqlilC5a8wKBgQDPDajNhaC3YnvBiftg
|
||||
ImKqbjbprPppbjs6IQfNw4tMoKgQ6zPOCAm4fZCBs1ag4VwXmd6HH12f7dsgYIIV
|
||||
cbz98MoH7RUwGAPV33QxbImp00LhhjHNE70ZeGz399+XXuRnER5MDoII1jcQCGTQ
|
||||
qf15RgtjHMNC8S6kPhQLTNktMwKBgQC7TM/t+gfE94CZme/D4ZxDZ488UtVppt1k
|
||||
KKsE6qqLSkyy0MPmf3xwOakS+cy+AZY8Votx2eAyk2wCq2MhCdvz21ZQZWB5pmWj
|
||||
vKO74a4xpyPuX2gzlMhX/9y1usNfIvyUjMVTzfEWhrCFWlywctcGXkcruHthM3R9
|
||||
QOWzFIUdRwKBgGfEs73U47gkrltP2ODUOtiphfHU1Gc0bJB0b2HLR6vutGxORFdU
|
||||
pfKFU3/9LkRQzYOyhNj5ekWlwnVWiLtQlmQ6YjZYto606m8snyIKAHBRRaqbQ6hA
|
||||
5Tu3o/0eiDtnvlZ9OM7rUnY1TcFGQ6hkGXnHBfv1NVL+Zt6/kfIb4JgLAoGBAIZs
|
||||
M1LNPmQ7aX1TwINp2Rd7LI6TuHyx+HRYx5youqtrMK6pK9+yoWF90H1A8JNxWhyF
|
||||
1GBqiQBjU4J69JMSm1xhj4n1qA7GwG2KBkziRH14Qk5jBMr4Pe0CQanflzYhSvtm
|
||||
KHzj8eJD2k5qstkkInR8l0Gmjk4Nes4mFHS5BmwjAoGAaHU+iAIKKZwIl4ta6ih7
|
||||
NpKH/oC+dGI8I7EoCwt7uk1y6+k7v3uTWZHS6TimVRaiRnRp21EjhC4WdJ4uKoia
|
||||
wynq8v3palgKbMPvocp/Ni4XYjqFL9UG7OFY1Bl7N90XyuxGNJNzL3ZCe4L5Cip7
|
||||
+cuWKDY8V09Jml8wMEyu1FQ=
|
||||
-----END PRIVATE KEY-----
|
22
LDN10/certs/server_cert.crt
Normal file
22
LDN10/certs/server_cert.crt
Normal file
|
@ -0,0 +1,22 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDkzCCAnugAwIBAgIUEZiP8qpFxBwq/1urH/vY8xLPa30wDQYJKoZIhvcNAQEL
|
||||
BQAwWTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
|
||||
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MB4X
|
||||
DTI0MDUyNjE1NTcxOFoXDTI1MDUyNjE1NTcxOFowWTELMAkGA1UEBhMCQVUxEzAR
|
||||
BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
|
||||
IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
||||
MIIBCgKCAQEAxoKRGOyYRuDCMyd/Q3IHEQXRdJPg/hE5C1yzJGrLyoMjPhLLLFww
|
||||
GobQE4xCXA/7bzUpVyOHy+1t80YlD4GIiWz+x04U6thsTTh9oMCIK2Uo3lSzyS2W
|
||||
JINzbT1dQuvt4icgEzcyDYUA6P7rFe+iMFKPxw0h7kPHPtnnpuFsq0SLk7Aopj6a
|
||||
7TpvxtjSpvcc/D7MLAqAA6u1Ws/JOmdN+4ZD2W4P/t4yiUCzyESxjPYy1DbgLpEr
|
||||
w82wVcXjBgV82MmtmXZTgcPVNHM1FFXURPCkwOmwjatyRu+S8feBCXJnEfMYrmJB
|
||||
Kk5AKXkb3viAxAoYokx388tv2YgpknDtCwIDAQABo1MwUTAdBgNVHQ4EFgQUMem3
|
||||
SX7Wo2R9gX+BzVQ5rznFsZ0wHwYDVR0jBBgwFoAUMem3SX7Wo2R9gX+BzVQ5rznF
|
||||
sZ0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEARAsNxVNw5Tsz
|
||||
6Kh5nm3DhCVbaXjy2jdnFK/Arleay2VXQQaVHf8+9USz6hxmo2qKbf6noY5sXIrO
|
||||
TAb/Eig2XXEYJth5qIHpNHBY7ccRhrAsMokbSQSlUUz7Ip10AoVDVqwp9P6GWdei
|
||||
Er2Hgw9JyzaKcbo2rMR/r5TGYnJ4Yg2f0Z5aO9uBCUdqTZvJfHulVEgn+YsCRV90
|
||||
Tz4TVleel3vS6Jljqtj6Rie8DnIX9q1bQQjEten6wHKy2eglpp2uJTPSVThxDTrA
|
||||
7PQBuizGsvPohjBgNx92oOSXIeeJHHPViKb4wTDrTnNPdkK7pKk7uJMGkh6SwhSf
|
||||
bYnwL9cS+A==
|
||||
-----END CERTIFICATE-----
|
28
LDN10/certs/server_private.key
Normal file
28
LDN10/certs/server_private.key
Normal file
|
@ -0,0 +1,28 @@
|
|||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDGgpEY7JhG4MIz
|
||||
J39DcgcRBdF0k+D+ETkLXLMkasvKgyM+EsssXDAahtATjEJcD/tvNSlXI4fL7W3z
|
||||
RiUPgYiJbP7HThTq2GxNOH2gwIgrZSjeVLPJLZYkg3NtPV1C6+3iJyATNzINhQDo
|
||||
/usV76IwUo/HDSHuQ8c+2eem4WyrRIuTsCimPprtOm/G2NKm9xz8PswsCoADq7Va
|
||||
z8k6Z037hkPZbg/+3jKJQLPIRLGM9jLUNuAukSvDzbBVxeMGBXzYya2ZdlOBw9U0
|
||||
czUUVdRE8KTA6bCNq3JG75Lx94EJcmcR8xiuYkEqTkApeRve+IDEChiiTHfzy2/Z
|
||||
iCmScO0LAgMBAAECggEABdfH/4zPOp7Y+Hp8I3cSwCyEqsLDh5boL+5tk2/VScOs
|
||||
YOJaupaID+/R5hFlzqHly7Mr4VW5ZIY7i0KQSrGMXEcqBKHGudbe8TLtd7LTDzvu
|
||||
BQVHOW+vEKoR1rBMs3CQUuzF4+rm/UDh8vm137Jq+rMjaj93tTSng7EUQXQ3J59S
|
||||
mgCm48GIuZmTOKd14KrsmKjBUbB15XNqoKsIqIrIBJ3CUvPnmpneztD8jxAd0zm4
|
||||
wk9XJ63MZduZmjpNsJ82m1VXPSKHPt2euKYEQTZlNs2dsnrcSYATJKMCgY8ImDpb
|
||||
LpjnUM1wiIO33b5YsinLFO0Vlxk3ph/VaWa29fK7MQKBgQDnRZTL3fxa8exMIDSK
|
||||
Jil+BszzikCPdEvNfHtUyC/dR2Jn4MPE3hwGB2rcWmSrj3wPfIoU9gYj8n2rt+gu
|
||||
HJ3+p6saRE36n1ejZ43hRgbdb+9aVTZT616lFKz3F7PHyASa8pMIZ9O2924Mq+jt
|
||||
S9HqZvySCE50FORuZvSNYzdk2QKBgQDbvDk8nKxa533Oa36nxdbgLN8SCXcu0Dqa
|
||||
fJEPgllXCaK9OHgOA3/Dkvt7Ui54eX1TPz4vBGTMrI1FASWDr44U4Rn8xmQmROmH
|
||||
XQ4VIsJdyiUwZYWbfcGigGglqgTMVM+vEKIIWhkLuyMJfhDagD2lh6GQIeoCXZPb
|
||||
dgKkMR+igwKBgQCyIICbiQ2uSnkSpRdydDQvEjPXPFu/YfZkfYVMZqefCjU8Bv0h
|
||||
62SwLBRdRe4VyXznPKfpvxg5pbKviQV2RqpWEnQR1hwtdX79p2u638G32lgDPnCK
|
||||
sFWEVmlmI0ZgEKmjYkRnC/kgCnEjp2DPLD+xB8NvAqDSfaj3c6rWH13x+QKBgQCW
|
||||
nqfxR0fRrBqNcxvHbxKCad+iooBiw3NYUAizQ9tvkPhPkjShDn72lXrypnuaM1TX
|
||||
ymMaoX1i2uifI1EOuji/USmaHnepz9Tv57ZugHwRBC6HxR9XXVVsyW4aWzecxInz
|
||||
64fWB8RhSS6UJCjzTbJ0E8uIW+bnJjPi3DqlR9LydwKBgQDNKAJeYBuiMQaBpLcj
|
||||
YA44tTmqtydZbnjxhZ4bnn7/4N9uCKTSmLCDo/J+CbPT9HGImlmx+s72CREZBSAP
|
||||
doUYM1LT9Iwj8elEmACTaLkcrkM4+qF4wLeUicYxXRcMmyhc38re85PYqfWCdqXs
|
||||
dKydz9baCWldimI7/soS/fGUVw==
|
||||
-----END PRIVATE KEY-----
|
107
LDN10/client.py
Normal file
107
LDN10/client.py
Normal file
|
@ -0,0 +1,107 @@
|
|||
import json
|
||||
import socket
|
||||
import struct
|
||||
import sys
|
||||
import ssl
|
||||
import threading
|
||||
from datetime import datetime
|
||||
|
||||
PORT = 1234
|
||||
HEADER_LENGTH = 2
|
||||
|
||||
|
||||
def setup_SSL_context():
|
||||
#uporabi samo TLS, ne SSL
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
|
||||
# certifikat je obvezen
|
||||
context.verify_mode = ssl.CERT_REQUIRED
|
||||
#nalozi svoje certifikate
|
||||
context.load_cert_chain(certfile="certs/janez_cert.crt", keyfile="certs/janez_private.key")
|
||||
# nalozi certifikate CAjev (samopodp. cert.= svoja CA!)
|
||||
context.load_verify_locations('certs/server_cert.crt')
|
||||
# nastavi SSL CipherSuites (nacin kriptiranja)
|
||||
context.set_ciphers('ECDHE-RSA-AES128-GCM-SHA256')
|
||||
return context
|
||||
|
||||
|
||||
def receive_fixed_length_msg(sock, msglen):
|
||||
message = b''
|
||||
while len(message) < msglen:
|
||||
chunk = sock.recv(msglen - len(message)) # preberi nekaj bajtov
|
||||
if chunk == b'':
|
||||
raise RuntimeError("socket connection broken")
|
||||
message = message + chunk # pripni prebrane bajte sporocilu
|
||||
|
||||
return message
|
||||
|
||||
|
||||
def receive_json(sock):
|
||||
# preberi glavo sporocila (v prvih 2 bytih je dolzina sporocila)
|
||||
header = receive_fixed_length_msg(sock, HEADER_LENGTH)
|
||||
message_length = struct.unpack("!H", header)[0] # pretvori dolzino sporocila v int
|
||||
|
||||
message = None
|
||||
if message_length > 0: # ce je vse OK
|
||||
message = receive_fixed_length_msg(sock, message_length) # preberi sporocilo
|
||||
message = message.decode("utf-8")
|
||||
message = json.loads(message)
|
||||
|
||||
return message
|
||||
|
||||
|
||||
def send_json(sock, data):
|
||||
data["time"] = datetime.now().strftime("%c")
|
||||
|
||||
# pretvori sporocilo v niz bajtov, uporabi UTF-8 kodno tabelo
|
||||
encoded_data = json.dumps(data).encode("utf-8")
|
||||
|
||||
# ustvari glavo v prvih 2 bytih je dolzina sporocila (HEADER_LENGTH)
|
||||
# metoda pack "!H" : !=network byte order, H=unsigned short
|
||||
header = struct.pack("!H", len(encoded_data))
|
||||
|
||||
data = header + encoded_data # najprj posljemo dolzino sporocilo, sele nato sporocilo samo
|
||||
sock.sendall(data)
|
||||
|
||||
|
||||
def send_message(sock, message):
|
||||
send_json(sock, {
|
||||
"type": "message",
|
||||
"data": message,
|
||||
})
|
||||
|
||||
|
||||
# message_receiver funkcija tece v loceni niti
|
||||
def message_receiver():
|
||||
while True:
|
||||
msg_received = receive_json(sock)
|
||||
|
||||
msg_type = msg_received["type"]
|
||||
data = msg_received["data"]
|
||||
time = msg_received["time"]
|
||||
match msg_type:
|
||||
case "message":
|
||||
username = msg_received["username"]
|
||||
print(f'[{time}] [{username}] : {data}')
|
||||
case "error":
|
||||
print(f'Error: {data}')
|
||||
|
||||
|
||||
# povezi se na streznik
|
||||
print("[system] connecting to chat server ...")
|
||||
my_ssl_ctx = setup_SSL_context()
|
||||
sock = my_ssl_ctx.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
|
||||
sock.connect(("localhost", PORT))
|
||||
print("[system] connected!")
|
||||
|
||||
# zazeni message_receiver funkcijo v loceni niti
|
||||
thread = threading.Thread(target=message_receiver)
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
|
||||
# pocakaj da uporabnik nekaj natipka in poslji na streznik
|
||||
while True:
|
||||
try:
|
||||
msg_send = input("")
|
||||
send_message(sock, msg_send)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit()
|
165
LDN10/server.py
Normal file
165
LDN10/server.py
Normal file
|
@ -0,0 +1,165 @@
|
|||
import json
|
||||
import signal
|
||||
import socket
|
||||
import struct
|
||||
import ssl
|
||||
import threading
|
||||
from datetime import datetime
|
||||
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
|
||||
PORT = 1234
|
||||
HEADER_LENGTH = 2
|
||||
|
||||
def setup_SSL_context():
|
||||
#uporabi samo TLS, ne SSL
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
|
||||
# certifikat je obvezen
|
||||
context.verify_mode = ssl.CERT_REQUIRED
|
||||
#nalozi svoje certifikate
|
||||
context.load_cert_chain(certfile="certs/server_cert.crt", keyfile="certs/server_private.key")
|
||||
# nalozi certifikate CAjev, ki jim zaupas
|
||||
# (samopodp. cert. = svoja CA!)
|
||||
context.load_verify_locations('certs/clients.pem')
|
||||
# nastavi SSL CipherSuites (nacin kriptiranja)
|
||||
context.set_ciphers('ECDHE-RSA-AES128-GCM-SHA256')
|
||||
return context
|
||||
|
||||
def receive_fixed_length_msg(sock, msglen):
|
||||
message = b''
|
||||
while len(message) < msglen:
|
||||
chunk = sock.recv(msglen - len(message)) # preberi nekaj bajtov
|
||||
if chunk == b'':
|
||||
raise RuntimeError("socket connection broken")
|
||||
message = message + chunk # pripni prebrane bajte sporocilu
|
||||
|
||||
return message
|
||||
|
||||
|
||||
def receive_json(sock) -> dict:
|
||||
# preberi glavo sporocila (v prvih 2 bytih je dolzina sporocila)
|
||||
header = receive_fixed_length_msg(sock, HEADER_LENGTH)
|
||||
message_length = struct.unpack("!H", header)[0] # pretvori dolzino sporocila v int
|
||||
|
||||
message = None
|
||||
if message_length > 0: # ce je vse OK
|
||||
message = receive_fixed_length_msg(sock, message_length) # preberi sporocilo
|
||||
message = message.decode("utf-8")
|
||||
message = json.loads(message)
|
||||
|
||||
return message
|
||||
|
||||
|
||||
def send_json(sock, message):
|
||||
message["time"] = datetime.now().strftime("%c")
|
||||
encoded_message = json.dumps(message).encode("utf-8") # pretvori sporocilo v niz bajtov, uporabi UTF-8 kodno tabelo
|
||||
|
||||
# ustvari glavo v prvih 2 bytih je dolzina sporocila (HEADER_LENGTH)
|
||||
# metoda pack "!H" : !=network byte order, H=unsigned short
|
||||
header = struct.pack("!H", len(encoded_message))
|
||||
|
||||
message = header + encoded_message # najprj posljemo dolzino sporocilo, slee nato sporocilo samo
|
||||
sock.sendall(message)
|
||||
|
||||
|
||||
def send_error(sock, message):
|
||||
send_json(sock, {
|
||||
"type": "error",
|
||||
"data": message,
|
||||
})
|
||||
|
||||
|
||||
# funkcija za komunikacijo z odjemalcem (tece v loceni niti za vsakega odjemalca)
|
||||
def client_thread(client_sock, client_addr):
|
||||
global clients
|
||||
global usernames
|
||||
|
||||
cert = client_sock.getpeercert()
|
||||
for sub in cert['subject']:
|
||||
for key, value in sub:
|
||||
if key == 'commonName':
|
||||
usernames[client_sock] = value
|
||||
|
||||
print("[system] connected with " + client_addr[0] + ":" + str(client_addr[1]))
|
||||
print("[system] we now have " + str(len(clients)) + " clients")
|
||||
|
||||
try:
|
||||
|
||||
while True: # neskoncna zanka
|
||||
msg_received = receive_json(client_sock)
|
||||
msg_type = str(msg_received["type"])
|
||||
data = str(msg_received["data"])
|
||||
time = str(msg_received["time"])
|
||||
|
||||
if not msg_received: # ce obstaja sporocilo
|
||||
break
|
||||
|
||||
match msg_type:
|
||||
case "message":
|
||||
username = usernames[client_sock]
|
||||
if username is None:
|
||||
username = client_addr[0] + ":" + str(client_addr[1])
|
||||
msg_received["username"] = username
|
||||
|
||||
print(f'[{time}] [{username}] : {data}')
|
||||
|
||||
if data.startswith("@"):
|
||||
[username, *data] = data.split()
|
||||
username = str(username).replace("@", "")
|
||||
|
||||
cl = [c for c, u in usernames.items() if u == username]
|
||||
if len(cl) == 0:
|
||||
send_error(client_sock, "Client with this username does not exist.")
|
||||
continue
|
||||
client = cl[0]
|
||||
|
||||
msg_received["data"] = "".join(data)
|
||||
send_json(client, msg_received)
|
||||
continue
|
||||
|
||||
for client in clients:
|
||||
if client == client_sock:
|
||||
continue
|
||||
send_json(client, msg_received)
|
||||
|
||||
except:
|
||||
# tule bi lahko bolj elegantno reagirali, npr. na posamezne izjeme. Trenutno kar pozremo izjemo
|
||||
pass
|
||||
|
||||
# prisli smo iz neskoncne zanke
|
||||
with clients_lock:
|
||||
clients.remove(client_sock)
|
||||
if client_sock in usernames:
|
||||
usernames.pop(client_sock)
|
||||
|
||||
print("[system] we now have " + str(len(clients)) + " clients")
|
||||
client_sock.close()
|
||||
|
||||
|
||||
# kreiraj socket
|
||||
my_ssl_ctx = setup_SSL_context()
|
||||
server_socket = my_ssl_ctx.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
|
||||
server_socket.bind(("localhost", PORT))
|
||||
server_socket.listen(1)
|
||||
|
||||
# cakaj na nove odjemalce
|
||||
print("[system] listening ...")
|
||||
clients = set()
|
||||
usernames = dict()
|
||||
clients_lock = threading.Lock()
|
||||
while True:
|
||||
try:
|
||||
# pocakaj na novo povezavo - blokirajoc klic
|
||||
client_sock, client_addr = server_socket.accept()
|
||||
with clients_lock:
|
||||
clients.add(client_sock)
|
||||
|
||||
thread = threading.Thread(target=client_thread, args=(client_sock, client_addr))
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
|
||||
print("[system] closing server socket ...")
|
||||
server_socket.close()
|
BIN
LDN9/dns-transfer.pcapng
Normal file
BIN
LDN9/dns-transfer.pcapng
Normal file
Binary file not shown.
BIN
LDN9/screenshot.png
Normal file
BIN
LDN9/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
Loading…
Reference in New Issue
Block a user