| 
					
				 | 
			
			
				@@ -0,0 +1,96 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .application_part import application_part 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .code_key import code_key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .secret_coder import secret_coder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .user import user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .user_loader import user_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .secret_coder import bad_password 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class application_secret(application_part): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    This is endpoints, which is responsible for encrypting  and decrypting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    new secrets, to work it require apikey and password. Apikey is used to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    load user master crypto key, and password to decrypt that key. Response  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    which and with success has always encrypted secret and plain decrypted 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    secret. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def encrypt(self, apikey: str, password: str, plain: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        This endpoint is requiored to encrypt new secret. It get plain text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        which would be encrypted. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            apikey (str): ApiKey of the user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            password (str): Master password of the user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            plain (str): Plain content to encrypt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (dict): Result to parse into JSON 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__database as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target = loader.get_by_apikey(apikey) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if target is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._fail_no_apikey() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                crypted = target.coder(password).encrypt(plain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            except bad_password: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._fail_bad_password() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self.__crypto_response(crypted, plain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def decrypt(self, apikey: str, password: str, crypted: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        This endpoint decrypt given secret. It return plain secret and also 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        crypted secret. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            apikey (str): ApiKey of the user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            password (str): Master password of the user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            crypted (str): Crypted secret to encode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (dict): Result to parse into JSON 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__database as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target = loader.get_by_apikey(apikey) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if target is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._fail_no_apikey() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                plain = target.coder(password).decrypt(crypted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._fail_bad_password() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self.__crypto_response(crypted, plain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __crypto_response(self, crypted: str, plain: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        This return standard success crypto response, which has secret in plan 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        form, and crypted form. It also of course has information about  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        success result. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Parameters:  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            crypted (str): Secret in crypted form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            plain (str): Secret in plain form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (dict): Result to create JSON response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self._success_response( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            crypted = crypted, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            plain = plain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __database(self) -> user_loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ This return new handler to user loader. """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return user_loader(self._connector)     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 |