jumpserver/apps/assets/const/protocol.py

254 lines
7.7 KiB
Python
Raw Normal View History

2023-07-11 03:28:09 +00:00
from django.conf import settings
2022-09-18 16:07:59 +00:00
from django.db import models
from django.utils.translation import gettext_lazy as _
2022-12-14 09:19:35 +00:00
2022-09-18 16:07:59 +00:00
from common.db.models import ChoicesMixin
from common.decorators import cached_method
from .base import FillType
2022-09-18 16:07:59 +00:00
__all__ = ['Protocol']
class Protocol(ChoicesMixin, models.TextChoices):
ssh = 'ssh', 'SSH'
rdp = 'rdp', 'RDP'
telnet = 'telnet', 'Telnet'
vnc = 'vnc', 'VNC'
winrm = 'winrm', 'WinRM'
2022-09-18 16:07:59 +00:00
mysql = 'mysql', 'MySQL'
mariadb = 'mariadb', 'MariaDB'
oracle = 'oracle', 'Oracle'
postgresql = 'postgresql', 'PostgreSQL'
sqlserver = 'sqlserver', 'SQLServer'
2022-12-06 09:13:37 +00:00
clickhouse = 'clickhouse', 'ClickHouse'
2022-09-18 16:07:59 +00:00
redis = 'redis', 'Redis'
mongodb = 'mongodb', 'MongoDB'
k8s = 'k8s', 'K8S'
http = 'http', 'HTTP(s)'
2022-09-18 16:07:59 +00:00
2023-06-30 09:35:49 +00:00
chatgpt = 'chatgpt', 'ChatGPT'
2022-09-18 16:07:59 +00:00
@classmethod
2022-09-21 03:17:14 +00:00
def device_protocols(cls):
2022-09-20 13:19:05 +00:00
return {
cls.ssh: {
'port': 22,
2022-09-21 03:17:14 +00:00
'secret_types': ['password', 'ssh_key'],
2022-09-20 13:19:05 +00:00
'setting': {
'sftp_enabled': {
'type': 'bool',
'default': True,
'label': _('SFTP enabled')
},
'sftp_home': {
'type': 'str',
'default': '/tmp',
'label': _('SFTP home')
},
2022-09-20 13:19:05 +00:00
}
},
cls.rdp: {
'port': 3389,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
'setting': {
'console': {
'type': 'bool',
'default': False,
'label': _('Console'),
'help_text': _("Connect to console session")
},
'security': {
'type': 'choice',
'choices': [('any', _('Any')), ('rdp', 'RDP'), ('tls', 'TLS'), ('nla', 'NLA')],
'default': 'any',
'label': _('Security'),
'help_text': _("Security layer to use for the connection")
},
'ad_domain': {
'type': 'str',
'required': False,
'default': '',
'label': _('AD domain')
}
2022-09-20 13:19:05 +00:00
}
},
cls.vnc: {
'port': 5900,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
},
cls.telnet: {
'port': 23,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
},
cls.winrm: {
'port': 5985,
'secret_types': ['password'],
'setting': {
'use_ssl': {
'type': 'bool',
'default': False,
'label': _('Use SSL')
},
}
},
2022-09-20 13:19:05 +00:00
}
@classmethod
2022-09-21 03:17:14 +00:00
def database_protocols(cls):
2022-09-20 13:19:05 +00:00
return {
cls.mysql: {
'port': 3306,
'setting': {},
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
},
cls.mariadb: {
'port': 3306,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
},
cls.postgresql: {
'port': 5432,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
'xpack': True
2022-09-20 13:19:05 +00:00
},
cls.oracle: {
'port': 1521,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
'xpack': True
2022-09-20 13:19:05 +00:00
},
cls.sqlserver: {
'port': 1433,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
'xpack': True,
2022-12-06 09:13:37 +00:00
},
cls.clickhouse: {
'port': 9000,
'required': True,
2022-12-06 09:13:37 +00:00
'secret_types': ['password'],
'xpack': True,
2022-09-20 13:19:05 +00:00
},
cls.mongodb: {
'port': 27017,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
},
cls.redis: {
'port': 6379,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2023-02-13 11:42:42 +00:00
'setting': {
'auth_username': {
'type': 'bool',
'default': False,
'label': _('Auth username')
},
2023-02-13 11:42:42 +00:00
}
2022-09-20 13:19:05 +00:00
},
}
2022-09-18 16:07:59 +00:00
@classmethod
2022-09-21 03:17:14 +00:00
def cloud_protocols(cls):
2022-09-20 13:19:05 +00:00
return {
cls.k8s: {
'port': 443,
'port_from_addr': True,
'required': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['token'],
2022-09-20 13:19:05 +00:00
},
cls.http: {
'port': 80,
'port_from_addr': True,
2022-09-21 03:17:14 +00:00
'secret_types': ['password'],
2022-09-20 13:19:05 +00:00
'setting': {
'autofill': {
2023-07-11 09:27:47 +00:00
'label': _('Autofill'),
'type': 'choice',
'choices': FillType.choices,
'default': 'basic',
},
'username_selector': {
'type': 'str',
'default': 'name=username',
'label': _('Username selector')
},
'password_selector': {
'type': 'str',
'default': 'name=password',
'label': _('Password selector')
},
'submit_selector': {
'type': 'str',
'default': 'type=submit',
'label': _('Submit selector')
2023-07-11 09:04:43 +00:00
},
'script': {
'type': 'text',
2023-07-11 09:59:18 +00:00
'default': [],
2023-07-11 09:04:43 +00:00
'label': _('Script'),
}
2022-09-20 13:19:05 +00:00
}
},
}
@classmethod
2023-06-30 09:35:49 +00:00
def gpt_protocols(cls):
2023-07-11 03:28:09 +00:00
protocols = {
2023-06-30 09:35:49 +00:00
cls.chatgpt: {
'port': 443,
'required': True,
'port_from_addr': True,
2023-06-30 10:33:18 +00:00
'secret_types': ['api_key'],
'setting': {
'api_mode': {
'type': 'choice',
'default': 'gpt-3.5-turbo',
'label': _('API mode'),
'choices': [
('gpt-3.5-turbo', 'GPT-3.5 Turbo'),
('gpt-3.5-turbo-16k', 'GPT-3.5 Turbo 16K'),
]
}
}
2023-06-30 09:35:49 +00:00
}
}
2023-07-11 03:28:09 +00:00
if settings.XPACK_ENABLED:
choices = protocols[cls.chatgpt]['setting']['api_mode']['choices']
choices.extend([
('gpt-4', 'GPT-4'),
('gpt-4-32k', 'GPT-4 32K'),
])
return protocols
2023-06-30 09:35:49 +00:00
2022-09-20 13:19:05 +00:00
@classmethod
@cached_method(ttl=600)
2022-09-20 13:19:05 +00:00
def settings(cls):
return {
2022-12-14 09:19:35 +00:00
**cls.device_protocols(),
**cls.database_protocols(),
2023-06-30 09:35:49 +00:00
**cls.cloud_protocols(),
**cls.gpt_protocols(),
2022-09-18 16:07:59 +00:00
}
@classmethod
@cached_method(ttl=600)
def xpack_protocols(cls):
return [
protocol
for protocol, config in cls.settings().items()
if config.get('xpack', False)
]
@classmethod
def protocol_secret_types(cls):
configs = cls.settings()
return {
protocol: configs[protocol]['secret_types'] or ['password']
for protocol in configs
}