Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import random
- import threading
- import json
- import os
- import string
- """
- users, odnosno oni koji imaju nalog ce takodje imati opciju da uploaduju
- fajlove. Oni koji nemaju nalog mogu samo da downloaduju.
- Svi users ce se cuvati u vidu recnika ciji primer imamo dole
- """
- # users = {
- # "user1":{
- # "password":"fon123",
- # "files":[
- # "Gq37zTq432",
- # "mX6A1njGxZ",
- # ]
- # },
- """
- Ucitavanje baze podataka svih korisnika radi koriscenja
- recnika users
- """
- def database_load(path):
- if os.path.isfile(path):
- with open(path, 'r') as database:
- data = database.read()
- return json.loads(data)
- else:
- return {}
- users = database_load('database/users.json')
- active_users = []
- """ Upisivanje recnika "users" u JSON fajl """
- def database_save(recnik):
- with open("database/users.json", 'w') as f:
- f.write(json.dumps(recnik, indent=2))
- """ Funkcije za logovanje i registraciju, kao i cuvanje baze korisnika """
- """ Funkcija omogucava log in za klijente """
- def login(sock):
- username = sock.recv(1024).decode()
- while username not in users.keys():
- sock.send("ERR".encode())
- username = sock.recv(1024).decode()
- sock.send("OK".encode())
- password = sock.recv(1024).decode()
- while password != users[username]['password']:
- sock.send("ERR".encode())
- password = sock.recv(1024).decode()
- sock.send("OK".encode())
- active_users.append(username)
- print('Upravo se ulogovao ' + username)
- """Registracija novih korisnika"""
- def register(sock):
- username = sock.recv(1024)
- while username.decode() in users.keys():
- sock.send("ERR".encode())
- username = sock.recv(1024)
- sock.send("OK".encode())
- p = sock.recv(1024)
- while p.decode() == "":
- sock.send("ERR".encode())
- p = sock.recv(1024)
- sock.send("OK".encode())
- username = username.decode()
- password = p.decode()
- new_dic = {'password': password, 'files': []}
- users[username] = new_dic
- active_users.append(username)
- database_save(users)
- """Generator jedinstvenog kljuca od 10 karaktera"""
- def unique_key_generator():
- chars = string.ascii_letters + string.digits
- check = 0
- key = ''
- while check == 0:
- check = 1
- for i in range(10):
- key += random.choice(chars)
- for x in os.listdir('database/files/'):
- if x == key:
- check = 0
- key = ''
- break
- return key
- """Upisivanje recnika "users" u JSON fajl"""
- def database_save(recnik):
- with open("database/users.json", 'w') as f:
- f.write(json.dumps(recnik, indent=2))
- """Download fajlova"""
- def download(sock):
- code = sock.recv(1024).decode()
- print(code)
- if code == 'q':
- print('izasao iz downloada')
- return
- status = False
- for file in os.listdir('database/files'):
- if os.path.basename(file) == code:
- with open('database/files/' + code,'rb') as f:
- text = f.read()
- sock.send(text)
- status = True
- break
- if not status:
- sock.send("ERR".encode())
- """Funkcija za upload novog fajla"""
- def upload(sock):
- text = sock.recv(1024).decode()
- while not text:
- sock.send("ERR".encode())
- text = sock.recv(1024).decode()
- sock.send("OK".encode())
- code = unique_key_generator()
- sock.send(code.encode())
- with open('database/files/' + code,'wb') as f:
- f.write(text.encode())
- username = sock.recv(1024).decode()
- users[username]['files'].append(code)
- database_save(users)
- """Funkcija koja vrsi navigaciju kroz aplikaciju za ne ulogovane korisnike{navigator_main}"""
- def navigator_main(sock,address):
- try:
- while True:
- userInput = sock.recv(1024)
- if userInput.decode() == '1':
- login(sock)
- navigator_logged_in(sock)
- elif userInput.decode() == '2':
- register(sock)
- navigator_logged_in(sock)
- elif userInput.decode() == '3':
- download(sock)
- elif userInput.decode() == 'q':
- print("zatvorio konekciju")
- sock.close()
- return
- except:
- print('Izgubila se veza sa {} klijentom'.format(address))
- """Funkcija koja vrsi navigaciju kroz aplikaciju za ulogovane korisnike{navigator_logged_in}"""
- def navigator_logged_in(sock):
- while True:
- userInput = sock.recv(1024)
- if userInput.decode() == '1':
- username = sock.recv(1024).decode()
- if not users[username]['files']:
- sock.send('Niste uploadovali ni jedan fajl'.encode())
- else:
- poruka = "Vasi uploadovani fajlovi su: " + ", ".join(users[username]['files'])
- sock.send(poruka.encode())
- elif userInput.decode() == '2':
- upload(sock)
- elif userInput.decode() == '3':
- download(sock)
- elif userInput.decode() == 'q':
- return
- def main():
- host = socket.gethostname()
- port = 9000
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- try:
- sock.bind((host, port))
- except:
- print("Port je zauzet!")
- sock.close()
- main()
- sock.listen(10)
- print("Server ceka konekciju")
- while True:
- c, address = sock.accept()
- print("{} se konektovao".format(address))
- t = threading.Thread(target=navigator_main, args=(c,address))
- t.start()
- sock.close()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement