Advertisement
Guest User

Untitled

a guest
Dec 21st, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.82 KB | None | 0 0
  1. import socket
  2. import random
  3. import threading
  4. import json
  5. import os
  6. import string
  7.  
  8.  
  9.  
  10. """
  11. users, odnosno oni koji imaju nalog ce takodje imati opciju da uploaduju
  12. fajlove. Oni koji nemaju nalog mogu samo da downloaduju.
  13. Svi users ce se cuvati u vidu recnika ciji primer imamo dole
  14. """
  15. # users = {
  16. # "user1":{
  17. # "password":"fon123",
  18. # "files":[
  19. # "Gq37zTq432",
  20. # "mX6A1njGxZ",
  21. # ]
  22. # },
  23.  
  24.  
  25. """
  26. Ucitavanje baze podataka svih korisnika radi koriscenja
  27. recnika users
  28. """
  29. def database_load(path):
  30. if os.path.isfile(path):
  31. with open(path, 'r') as database:
  32. data = database.read()
  33. return json.loads(data)
  34. else:
  35. return {}
  36.  
  37. users = database_load('database/users.json')
  38. active_users = []
  39.  
  40. """ Upisivanje recnika "users" u JSON fajl """
  41.  
  42. def database_save(recnik):
  43. with open("database/users.json", 'w') as f:
  44. f.write(json.dumps(recnik, indent=2))
  45.  
  46. """ Funkcije za logovanje i registraciju, kao i cuvanje baze korisnika """
  47.  
  48.  
  49. """ Funkcija omogucava log in za klijente """
  50.  
  51. def login(sock):
  52. username = sock.recv(1024).decode()
  53.  
  54. while username not in users.keys():
  55. sock.send("ERR".encode())
  56. username = sock.recv(1024).decode()
  57. sock.send("OK".encode())
  58.  
  59. password = sock.recv(1024).decode()
  60. while password != users[username]['password']:
  61. sock.send("ERR".encode())
  62. password = sock.recv(1024).decode()
  63. sock.send("OK".encode())
  64. active_users.append(username)
  65. print('Upravo se ulogovao ' + username)
  66.  
  67. """Registracija novih korisnika"""
  68.  
  69. def register(sock):
  70. username = sock.recv(1024)
  71.  
  72. while username.decode() in users.keys():
  73. sock.send("ERR".encode())
  74. username = sock.recv(1024)
  75. sock.send("OK".encode())
  76.  
  77. p = sock.recv(1024)
  78.  
  79. while p.decode() == "":
  80. sock.send("ERR".encode())
  81. p = sock.recv(1024)
  82.  
  83. sock.send("OK".encode())
  84. username = username.decode()
  85. password = p.decode()
  86. new_dic = {'password': password, 'files': []}
  87. users[username] = new_dic
  88. active_users.append(username)
  89. database_save(users)
  90.  
  91. """Generator jedinstvenog kljuca od 10 karaktera"""
  92.  
  93. def unique_key_generator():
  94. chars = string.ascii_letters + string.digits
  95. check = 0
  96. key = ''
  97. while check == 0:
  98. check = 1
  99. for i in range(10):
  100. key += random.choice(chars)
  101.  
  102. for x in os.listdir('database/files/'):
  103. if x == key:
  104. check = 0
  105. key = ''
  106. break
  107. return key
  108.  
  109. """Upisivanje recnika "users" u JSON fajl"""
  110.  
  111. def database_save(recnik):
  112. with open("database/users.json", 'w') as f:
  113. f.write(json.dumps(recnik, indent=2))
  114.  
  115. """Download fajlova"""
  116.  
  117. def download(sock):
  118. code = sock.recv(1024).decode()
  119. print(code)
  120. if code == 'q':
  121. print('izasao iz downloada')
  122. return
  123. status = False
  124. for file in os.listdir('database/files'):
  125. if os.path.basename(file) == code:
  126. with open('database/files/' + code,'rb') as f:
  127. text = f.read()
  128. sock.send(text)
  129. status = True
  130. break
  131. if not status:
  132. sock.send("ERR".encode())
  133.  
  134.  
  135. """Funkcija za upload novog fajla"""
  136.  
  137. def upload(sock):
  138. text = sock.recv(1024).decode()
  139. while not text:
  140. sock.send("ERR".encode())
  141. text = sock.recv(1024).decode()
  142. sock.send("OK".encode())
  143. code = unique_key_generator()
  144.  
  145. sock.send(code.encode())
  146. with open('database/files/' + code,'wb') as f:
  147. f.write(text.encode())
  148. username = sock.recv(1024).decode()
  149. users[username]['files'].append(code)
  150. database_save(users)
  151.  
  152. """Funkcija koja vrsi navigaciju kroz aplikaciju za ne ulogovane korisnike{navigator_main}"""
  153.  
  154. def navigator_main(sock,address):
  155. try:
  156. while True:
  157. userInput = sock.recv(1024)
  158. if userInput.decode() == '1':
  159. login(sock)
  160. navigator_logged_in(sock)
  161. elif userInput.decode() == '2':
  162. register(sock)
  163. navigator_logged_in(sock)
  164. elif userInput.decode() == '3':
  165. download(sock)
  166. elif userInput.decode() == 'q':
  167. print("zatvorio konekciju")
  168. sock.close()
  169. return
  170. except:
  171. print('Izgubila se veza sa {} klijentom'.format(address))
  172.  
  173. """Funkcija koja vrsi navigaciju kroz aplikaciju za ulogovane korisnike{navigator_logged_in}"""
  174.  
  175. def navigator_logged_in(sock):
  176. while True:
  177. userInput = sock.recv(1024)
  178. if userInput.decode() == '1':
  179. username = sock.recv(1024).decode()
  180. if not users[username]['files']:
  181. sock.send('Niste uploadovali ni jedan fajl'.encode())
  182. else:
  183. poruka = "Vasi uploadovani fajlovi su: " + ", ".join(users[username]['files'])
  184. sock.send(poruka.encode())
  185. elif userInput.decode() == '2':
  186. upload(sock)
  187. elif userInput.decode() == '3':
  188. download(sock)
  189. elif userInput.decode() == 'q':
  190. return
  191.  
  192. def main():
  193. host = socket.gethostname()
  194. port = 9000
  195.  
  196. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  197. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  198. try:
  199. sock.bind((host, port))
  200. except:
  201. print("Port je zauzet!")
  202. sock.close()
  203. main()
  204.  
  205. sock.listen(10)
  206. print("Server ceka konekciju")
  207. while True:
  208. c, address = sock.accept()
  209. print("{} se konektovao".format(address))
  210. t = threading.Thread(target=navigator_main, args=(c,address))
  211. t.start()
  212.  
  213. sock.close()
  214.  
  215. if __name__ == '__main__':
  216. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement