mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
import sys
 | 
						|
from abc import ABC
 | 
						|
 | 
						|
from common.db.utils import Encryptor
 | 
						|
from common.utils import lazyproperty
 | 
						|
 | 
						|
current_module = sys.modules[__name__]
 | 
						|
 | 
						|
__all__ = ['build_entry']
 | 
						|
 | 
						|
 | 
						|
class BaseEntry(ABC):
 | 
						|
 | 
						|
    def __init__(self, instance):
 | 
						|
        self.instance = instance
 | 
						|
 | 
						|
    @lazyproperty
 | 
						|
    def full_path(self):
 | 
						|
        path_base = self.path_base
 | 
						|
        path_spec = self.path_spec
 | 
						|
        path = f'{path_base}/{path_spec}'
 | 
						|
        return path
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_base(self):
 | 
						|
        path = f'orgs/{self.instance.org_id}'
 | 
						|
        return path
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_spec(self):
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    def to_internal_data(self):
 | 
						|
        secret = getattr(self.instance, '_secret', None)
 | 
						|
        if secret is not None:
 | 
						|
            secret = Encryptor(secret).encrypt()
 | 
						|
        data = {'secret': secret}
 | 
						|
        return data
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def to_external_data(data):
 | 
						|
        secret = data.pop('secret', None)
 | 
						|
        if secret is not None:
 | 
						|
            secret = Encryptor(secret).decrypt()
 | 
						|
        return secret
 | 
						|
 | 
						|
 | 
						|
class AccountEntry(BaseEntry):
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_spec(self):
 | 
						|
        path = f'assets/{self.instance.asset_id}/accounts/{self.instance.id}'
 | 
						|
        return path
 | 
						|
 | 
						|
 | 
						|
class AccountTemplateEntry(BaseEntry):
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_spec(self):
 | 
						|
        path = f'account-templates/{self.instance.id}'
 | 
						|
        return path
 | 
						|
 | 
						|
 | 
						|
class HistoricalAccountEntry(BaseEntry):
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_base(self):
 | 
						|
        account = self.instance.instance
 | 
						|
        path = f'accounts/{account.id}/'
 | 
						|
        return path
 | 
						|
 | 
						|
    @property
 | 
						|
    def path_spec(self):
 | 
						|
        path = f'histories/{self.instance.history_id}'
 | 
						|
        return path
 | 
						|
 | 
						|
 | 
						|
def build_entry(instance) -> BaseEntry:
 | 
						|
    class_name = instance.__class__.__name__
 | 
						|
    entry_class_name = f'{class_name}Entry'
 | 
						|
    entry_class = getattr(current_module, entry_class_name, None)
 | 
						|
    if not entry_class:
 | 
						|
        raise Exception(f'Entry class {entry_class_name} is not found')
 | 
						|
    return entry_class(instance)
 |