| 7 | |
| 8 | |
| 9 | class ThycoticHandler(xml.sax.handler.ContentHandler): |
| 10 | def __init__(self): |
| 11 | super().__init__() |
| 12 | self.stack = [] |
| 13 | self.templates = {} |
| 14 | self.secrets = [] |
| 15 | self.folders = [] |
| 16 | self.template = None # type: Optional[dict] |
| 17 | self.secret = None # type: Optional[dict] |
| 18 | self.folder = None # type: Optional[dict] |
| 19 | |
| 20 | def startElement(self, name, attrs): |
| 21 | if len(self.stack) == 0 and name != 'ImportFile': |
| 22 | raise Exception('Invalid Thycotic Secret Server XML Export File') |
| 23 | |
| 24 | if len(self.stack) == 2: |
| 25 | if self.stack[1] == 'SecretTemplates': |
| 26 | if name == 'secrettype': |
| 27 | if self.template is not None: |
| 28 | logging.info('Secret template has not been saved') |
| 29 | self.template = {'name': '', 'fields': {}, 'field': None} |
| 30 | |
| 31 | elif self.stack[1] == 'Secrets': |
| 32 | if name == 'Secret': |
| 33 | if self.secret is not None: |
| 34 | logging.info('Secret has not been saved') |
| 35 | self.secret = {'name': '', 'template': '', 'folder': '', 'totp_code': '', 'items': {}, 'item': None} |
| 36 | |
| 37 | elif self.stack[1] == 'Folders': |
| 38 | if name == 'Folder': |
| 39 | if self.folder is not None: |
| 40 | logging.info('Folder has not been saved') |
| 41 | self.folder = {'name': '', 'path': '', 'permissions': [], 'permission': None, 'shared': False} |
| 42 | |
| 43 | elif len(self.stack) == 4: |
| 44 | if name == 'field' and self.stack[1] == 'SecretTemplates' and self.stack[2] == 'secrettype' and self.stack[3] == 'fields': |
| 45 | if self.template: |
| 46 | if self.template['field']: |
| 47 | logging.warning('Secret template: field has not been saved') |
| 48 | self.template['field'] = {'field_name': '', 'slug': '', 'slug_type': ''} |
| 49 | else: |
| 50 | logging.warning('Secret template: field has not been created') |
| 51 | |
| 52 | elif name == 'SecretItem' and self.stack[1] == 'Secrets' and self.stack[2] == 'Secret' and self.stack[3] == 'SecretItems': |
| 53 | if self.secret: |
| 54 | if self.secret['item']: |
| 55 | logging.warning('Secret: item has not been saved') |
| 56 | self.secret['item'] = {'field_name': '', 'slug': '', 'value': ''} |
| 57 | else: |
| 58 | logging.warning('Secret: item has not been created') |
| 59 | |
| 60 | elif name == 'Permission' and self.stack[1] == 'Folders' and self.stack[2] == 'Folder' and self.stack[3] == 'Permissions': |
| 61 | if self.folder: |
| 62 | if self.folder['permission']: |
| 63 | logging.warning('Folder: permission has not been saved') |
| 64 | self.folder['permission'] = {'group_name': '', 'user_name': '', 'secret_role': '', 'folder_role': ''} |
| 65 | else: |
| 66 | logging.warning('Folder: permission has not been created') |