Example #1
0
 def read_secure_cookie(self, cookie_name):
     """read_secure_cookie(str) -> return(str)
     Verifies whether the user cookie has not
     been tampered with. Returns the cookie
     else returns False
     """
     cookie_val = self.request.cookies.get(cookie_name)
     return cookie_val and Secure.check_secure_val(cookie_val)
Example #2
0
	def __init__(self, host, port, passwd, limit=0, buffer=1000*1000*100, repeat=1):
		
		"""# Explicacion rapida:
		# host: La direccion a la cual conectarse o usar (En el caso del servidor)
		# port: El puerto donde se enviaran o recibir los datos de la conexion
		# passwd: La contrasena que se usara para encriptar y desencriptar los datos
		# limit: El limite de conexiones permitidas en el caso de que se use el servidor
		# buffer: El limite de flujo de datos.
		# repeat: Las repeticiones de encriptacion de un dato. Mientras mas repeticiones mas lento sera el proceso."""
		
		self.host = str(host)
		self.port = int(port)
		self.limit = int(limit)
		self.buffer = int(buffer)
		self.event = socket.socket()
		self.serverSettingsConf = False
		self.crypter = Secure(passwd, repeat)
		self.list = []
		self.start = False
		self.server_data_decrypted = []
		self.client_data_decrypted = []
Example #3
0
    def login(self, user, password):

        # Takes a user and a password checks if it is correct.
        # If so stores it in google appengine db and uses the
        # obj id returned from the database as cookie val
        usr_obj = Secure.check_passwd(user.lower(), password, Users)  # takes str, str, obj (google appengine)
        if usr_obj:
            cookie_val = self.make_cookie(str(usr_obj.key().id()))  # get the int val for the val
            self.set_cookie("user_id", cookie_val)
            self.redirect("/blog/newpost")

        else:
            self.error("Invalid login")
Example #4
0
    def post(self):
        """retreive the responses from the user"""

        self.user_name = Secure.valid_username(self.request.get("username"))
        self.passwd = Secure.valid_passwd(self.request.get("password"))
        self.email = self.request.get("email")

        if not (self.user_name and self.passwd):
            msg = "username cannot be empty"
            msg2 = "password cannot be empty"
            self.errors(name_error=msg, passwd_error=msg2)
        else:
            if self.passwd.group() != self.request.get("verify"):
                msg = "Password do not match"
                self.errors(name=self.user_name.group(), passwd_error=msg, passwd2_error=msg)
            else:

                if self.email and not Secure.valid_email(self.request.get("email")):
                    self.errors(name=self.user_name.group(), email_error="email incorrect format")
                elif self.email:
                    self.done()
                else:
                    self.done()
Example #5
0
    def done(self):

        username = self.user_name.group().lower()

        # Check if user already exists.
        if Users.by_name(username):
            self.errors(name_error="User already exists")
        else:

            password = self.passwd.group()
            email = None

            if self.email:
                email = self.email

            # hash the password before storing in database
            passwd_hash = Secure.make_salt_password(username, password)

            # Add the user, hashed password or email to the database
            usr_obj = Users.add(username, passwd_hash, email)
            cookie_val = self.make_cookie(str(usr_obj.key().id()))
            self.set_cookie("user_id", cookie_val)
            self.redirect("/blog/newpost")
Example #6
0
 def make_cookie(self, val):
     """makes a secure hash cookie"""
     return Secure.make_secure_val(val)
Example #7
0
class Connection:

	def __init__(self, host, port, passwd, limit=0, buffer=1000*1000*100, repeat=1):
		
		"""# Explicacion rapida:
		# host: La direccion a la cual conectarse o usar (En el caso del servidor)
		# port: El puerto donde se enviaran o recibir los datos de la conexion
		# passwd: La contrasena que se usara para encriptar y desencriptar los datos
		# limit: El limite de conexiones permitidas en el caso de que se use el servidor
		# buffer: El limite de flujo de datos.
		# repeat: Las repeticiones de encriptacion de un dato. Mientras mas repeticiones mas lento sera el proceso."""
		
		self.host = str(host)
		self.port = int(port)
		self.limit = int(limit)
		self.buffer = int(buffer)
		self.event = socket.socket()
		self.serverSettingsConf = False
		self.crypter = Secure(passwd, repeat)
		self.list = []
		self.start = False
		self.server_data_decrypted = []
		self.client_data_decrypted = []
		
	def client(self):
		
		"""
		Se conecta al socket de la direccion y el puerto que usted especifique.
		"""
		
		self.event = socket.socket()
		
		try:
		
			self.event.connect((self.host, self.port))
		
		except socket.error:
			
			raise connectError("Error conectando al socket en la direccion especificada.")
		
	def client_interact(self, data, client):
	
		"""
		Envia datos hacia un socket que este conectado en el servidor a traves de una direccion especifica.
		"""
	
		encryptedata = self.crypter.encrypt(data)
		length_encrypedata = str(len(encryptedata))
		
		try:
		
			self.client_connection.sendto(length_encrypedata+" "+encryptedata, client)
		
		except socket.gaierror:
		
			raise unknownAddr(unknownaddr_message)
		
	def server_interact(self, data):
	
		"""
		Envia datos hacia el servidor de el socket este conectado.
		"""
		
		encryptedata = self.crypter.encrypt(data)
		length_encrypedata = str(len(encryptedata))
		
		self.event.send(length_encrypedata+" "+encryptedata)
		
	def client_sendfile(self, file, client):
		
		"""
		Envia el contenido de un archivo especificado a traves de un socket en una direccion especifica.
		"""
		
		readfile = open(file, "rb")
		
		self.client_interact(readfile.read(), client)
		
		readfile.close()
		
	def server_sendfile(self, file):
		
		"""
		Envia el contenido de un archivo especificado a traves de un socket hacia el servidor.
		"""
		
		readfile = open(file, "rb")
		
		self.server_interact(readfile.read())
		
		readfile.close()
		
	def client_buffer_interact(self, data, client):
	
		"""
		Este metodo se comunica con el metodo 'client_buffer_recv'.
		Envia datos a un socket con una direccion especifica y los almacena en un buffer con datos relevantes.
		"""
		
		host, port = self.client_connection.getsockname()
		origin = host+":"+str(port)
		encryptedata = self.crypter.encrypt(dumps({"origin":origin, "content":data.encode("hex"), "length":len(data)}))
		length_encrypedata = str(len(encryptedata))
		
		try:
			
			self.client_connection.sendto(length_encrypedata+" "+encryptedata, client)

		except socket.gaierror:
			
			raise unknownAddr(unknownaddr_message)
			
	def server_buffer_interact(self, data):
	
		"""
		Este metodo se comunica con el metodo 'server_buffer_recv'.
		Envia datos a un socket conectado al servidor y los almacena en un buffer con datos relevantes. Este metodo se conecta al socket del servidor cada vez que envia datos.
		"""
		
		self.client()
		
		host, port = self.event.getsockname()
		origin = host+":"+str(port)
		encryptedata = self.crypter.encrypt(dumps({"origin":origin, "content":data.encode("hex"), "length":len(data)}))
		length_encrypedata = str(len(encryptedata))
		
		self.event.send(length_encrypedata+" "+encryptedata)
		
	def server_recv(self):
	
		"""
		Espera el contenido enviado a traves de un socket que este conectado hacia el servidor, para posteriormente retornarlo.
		Este metodo se comunica con el metodo 'server_interact'.
		"""
		
		server_data = ''
		repetir = True

		while True:
		
			try:
					
				data = self.event.recv(self.buffer)
					
				if (repetir):
					
					repetir = False
						
					longitud = int(data.split()[0])
					server_data += data.replace(data.split()[0]+" ", "")
						
				else:
						
					server_data += data
					
				longitud_a_sumar = int(len(server_data))
					
				if (longitud == longitud_a_sumar):
						
					return self.crypter.decrypt(server_data)
		
			except:
				
				raise corruptData(corruptdata_message)
		
	def client_recv(self):
	
		"""
		Espera el contenido enviado a traves de un socket que este conectado hacia un cliente, para posteriormente retornarlo.
		Este metodo se comunica con el metodo 'server_interact'.
		"""
		
		show_error(int(len(self.client_list())), 3)
		show_error(self.serverSettingsConf, 1)
		
		client_data = ''
		repetir = True

		while True:
				
			try:
					
				data = self.client_connection.recv(self.buffer)
					
				if (repetir):
					
					repetir = False
						
					longitud = int(data.split()[0])
					client_data += data.replace(data.split()[0]+" ", "")
						
				else:
						
					client_data += data
					
				longitud_a_sumar = int(len(client_data))
					
				if (longitud == longitud_a_sumar):
						
					return self.crypter.decrypt(client_data)

			except:
				
				raise corruptData(corruptdata_message)
					
	def server_buffer_recv(self, stop=False):
		
		"""
		Recibe los datos que un servidor le envia a un cliente a traves de un socket para almacenarlo en un buffer con datos relevantes y especificos.
		
		El parametro stop: Si el argumento es 'False', no parara de recibir y almacenar datos. Si esta el 'True' cuando reciba un datos de un cliente terminara el bucle.
		
		"""
		
		self.client()
		
		def server_receive():
		
			server_data = ''
			repetir = True

			while True:
			
				try:
					
					data = self.event.recv(self.buffer)
					
					if (repetir):
					
						repetir = False
						
						longitud = int(data.split()[0])
						server_data += data.replace(data.split()[0]+" ", "")
						
					else:
						
						server_data += data
					
					longitud_a_sumar = int(len(server_data))
					
					if (longitud == longitud_a_sumar):
						
						self.server_data_decrypted.append(server_data)
						
						if (stop):
						
							break
							
						else:
							
							server_data = ''
							repetir = True
					
				except:
					
					raise corruptData(corruptdata_message)
					
		output = thread.start_new_thread(server_receive, ())
		
	def server(self, buffer=True):
	
		"""
		Inicia el servidor esperando conexiones.
		
		El parametro buffer: Si el argumento es 'True', recibira datos y los almacenara en un buffer con datos relevantes y especificos. Util a la hora de comunicarse con otros metodos: ej: 'server_buffer_interact'. Si esta en 'False' entonces solo esperara las conexiones.
		"""
		
		show_error(self.start, 2)
		
		def start_with_thread():
		
			self.start = True
			level = 0
			repetir = True
			client_data = ''
			
			self.serverSettingsConf = True
		
			self.event = socket.socket()
			self.event.bind((self.host, self.port))
			self.event.listen(self.limit)
		
			while True:
			
				if (self.limit > 0):
					level += 1
						
				self.client_connection, client = self.event.accept()
				self.list.append(client)
				
				if (buffer):
					
					try:
					
						data = self.client_connection.recv(self.buffer)
						
						if (repetir):
						
							repetir = False
							
							longitud = int(data.split()[0])
							client_data += data.replace(data.split()[0]+" ", "")
							
						else:
							
							client_data += data
						
						longitud_a_sumar = int(len(client_data))
						
						if (longitud == longitud_a_sumar):
						
							self.client_data_decrypted.append(client_data)
							
							client_data = ''
							repetir = True
						
							#if (not self.limit == 0 and level == self.limit):
							#	break
				
					except:
						
						raise corruptData(corruptdata_message)
						
		output = thread.start_new_thread(start_with_thread, ())
		
	def client_list(self):
	
		"""
		retorna la lista de clientes que se han conectado. Nota: No se puede determinar si el cliente ya no esta conectado!.
		"""
	
		return self.list
		
	def server_buffer_print(self):
	
		"""
		Desencripta y descodifica los datos que se almacenan en el buffer que se han enviado a traves del socket del servidor hacia el cliente.
		"""
	
		output = []
	
		for i in self.server_data_decrypted:
			
			output.append(loads(self.crypter.decrypt(i)))
	
		output_decode = []
	
		for i in output:
			
			origin = str(i['origin'])
			content = str(i['content'].decode("hex"))
			length = int(i['length'])
			
			output_decode.append({"origin":origin, "length":length, "content":content})
	
		return output_decode
		
	def client_buffer_print(self):
	
		"""
		Desencripta y descodifica los datos que se almacenan en el buffer que se han enviado a traves del socket del cliente hacia el servidor.
		"""
		
		show_error(self.serverSettingsConf, 1)
	
		output = []
	
		for i in self.client_data_decrypted:
			
			output.append(loads(self.crypter.decrypt(i)))
			
		output_decode = []
	
		for i in output:
			
			origin = str(i['origin'])
			content = str(i['content'].decode("hex"))
			length = int(i['length'])
			
			output_decode.append({"origin":origin, "length":length, "content":content})
	
		return output_decode