| 
					
				 | 
			
			
				@@ -1,5 +1,3 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import typing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .user import user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .user import user_builder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .user_loader import user_loader 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -11,59 +9,8 @@ from .application_part import application_part 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .apikey import bad_apikey_exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .validators import name_validator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .validators import domain_validator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class secret_response: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, target: secret | secret_builder) -> None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if isinstance(target, secret): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.__target = target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.__target = target.result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def response(self) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "name": self.target.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "domain": self.target.domain, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "coded" : self.target.coded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def target(self) -> secret: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return self.__target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def builder(self) -> secret_builder: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return secret_builder(self.__target) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class secret_collection_response: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, target: typing.Iterable[secret] | None = None) -> None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.__collection = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if target is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if type(target) is list: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.__collection = target.copy() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for count in target: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.__collection.append(count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def response(self) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return [ count.response for count in self.collection ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def collection(self) -> list: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return self.__collection.copy() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def append(self, target: secret | secret_builder) -> object: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if isinstance(target, secret_builder): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            target = target.result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.__collection.append(target) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return self 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .application_secret_response import secret_response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .application_secret_response import secret_collection_response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class application_secret(application_part): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def get(self, apikey: str, name: str) -> dict: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -86,7 +33,7 @@ class application_secret(application_part): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return validation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if not secret_coder.validate(coded): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return self._fail_response(cause = "Invalid coded secret") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._fail_response(cause = "Invalid coded secret.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             builder = secret_builder() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,11 +42,96 @@ class application_secret(application_part): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             builder.coded = coded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             builder.owner = loader.owner 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            loader.append(builder.result)      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if loader.append(builder.result):    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._success_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return self._success_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._fail_response(cause = "Name already in use.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def drop(self, apikey: str, name: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target = loader.load_by_name(name)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if target is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self.__not_found_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if loader.drop(target): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._success_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._fail_response(cause = "Internal database error.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def update( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        apikey: str,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        name: str,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        new_name: str | None = None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        domain: str | None = None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        coded: str | None = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        validation = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if new_name is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            validation = validation or self._validation( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                "name",  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                name_validator(new_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if domain is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            validation = validation or self._validation( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                "domain",  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                domain_validator(domain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if validation is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return validation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if coded is not None and not secret_coder.validate(coded): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._fail_response(cause = "Invalid coded secret.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target = loader.load_by_name(name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if target is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self.__not_found_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            builder = secret_builder(target) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if new_name is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                builder.name = new_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if domain is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                builder.domain = domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if coded is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                builder.coded = coded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if loader.update(builder.result):                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return self._success_response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._fail_response(cause = "Name already in use.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def name_in_use(self, apikey: str, name: str) -> bool: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        validation = self._validation("name", name_validator(name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if validation is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return validation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result = loader.name_in_use(name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self._success_response(in_use = result, name = name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def domain_search(self, apikey: str, domain: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = loader.search_for_domain(domain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return secret_collection_response(results).response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def name_search(self, apikey: str, name: str) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with self.__secret_database(apikey) as loader: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = loader.search_for_name(name)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return secret_collection_response(results).response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def __not_found_response(self) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return self._fail_response(cause = "Secret not found.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |