• 老广's avatar
    Merge to dev (#1051) · c2abd58d
    老广 authored
    * [Update] 修改 success message, 添加资产组时可以添加资产
    
    * [Update] system user form add label
    
    * [Update] set default cluster
    
    * [Update] 修改一些翻译
    
    * [Bugfix] 修复重置密码bug
    
    * [Bugfix] 默认default cluster
    
    * [Bugfix] 用户添加报错
    
    * 修改tab样式
    
    * [Bugfix] 修复了一些显示上的bug
    
    * 修复全选按钮在搜索后仍然选择全部的问题
    
    * [Bugfix] 修复以下bug
    1. 查看执行历史异常
    2. 用户授权资产页显示message
    
    * [Update] api 返回platform, 并增加web terminal nav
    
    * [Feature] 添加setting页面
    
    * [Feature] 添加basic settings
    
    * [Update] 修改翻译
    
    * [Update] 修改config
    
    * [Update] 启动加载common setting
    
    * [Bugfix] 修复cluster创建的bug
    
    * [Bugfix] 修复title显示Jumpserver
    
    * [Bugfix] setting tables not found
    
    * [Bugfix] settings add option
    
    * [Feature] 添加后端paging
    
    * [Bugfix] 资产列表选择别的页会报错
    
    * [Update] check all 只选择当前页面
    
    * [Bugfix] user login ip
    
    * [Bugfix] for login ip
    
    * [Bugfix] 修复资产列表显示bug
    
    * [Remove] labels
    
    * [Bugfix] task运行失败,因为tasks没有设置
    
    * [Feature] 增加标签
    
    * [Bugfix] 读取不到prefix
    
    * For storage
    
    * [Change] 修改部分翻译
    
    * [Update] 启用ldap移动位置
    
    * [Update] 修改翻译
    
    * [Feature] 支持es存储命令
    
    * Update README.md
    
    * [Feature] 添加es支持
    
    * [update] 修改用户创建时 姓名和用户名的位置
    
    * [Update] 修改install.md
    
    * [Update] remote default PAGE_SIZE stting
    
    * [Feature] terminal config load
    
    * [Feature] es support
    
    * [Update] 修改requirement
    
    * [Update] 修改requirements
    
    * [Update] 修改dictfiled
    
    * [Fix] 修改Logger
    
    * [Bugfix] 倒序显示
    
    * [Update] 修改默认头像和logo
    
    * [Update] 修改django-celery-beat的版本
    
    * [Feature] 添加修改用户密码api
    
    * add logo test
    
    * [Bugfix] 修复一些bug
    
    * [Update] 修改copyrite
    
    * [Update] 修改copyright
    
    * Update ISSUE_TEMPLATE.md
    
    * [Update] 修改禁止排序的颜色
    
    * [Feature] 标签管理功能
    
    * [Bugfix] git status
    
    * [Model] 修改create_by字段
    
    * [Update] 修改位置
    
    * [Update] 修改签名md5算法
    
    * [Feature] 资产列表标签搜索
    
    * [Feature] 添加资产详情标签
    
    * [Bugfix] 修复资产搜索bug
    
    * [Update] ansible disk bug
    
    * [Update] ansible disk bug
    
    * [Bugfix] 修复获取kvmcpu的bug
    
    * [Bugfix] 修复bsd获取cpu数量bug
    
    * [Bugfix] 修改翻译
    
    * [Bugfix] 资产model 太长
    
    * [Bugfix] 修改项目结构描述
    
    修正"项目多语言目录"
    
    * Update project_structure.md
    
    * [Update] add debug log
    
    * refactor: rename folder i18n
    
    * [Feature] 添加链接token
    
    * [Feature] Label 删除修改
    
    * [Update] 修改部分翻译
    
    * [Update] 修改小bug
    
    * [Update] 修复获取资产信息异常bug
    
    * [Bugfix] 修复系统用户上传秘钥的bug
    
    * [Update] 修改获取资产信息产生的异常
    
    * [Update] 删除部分资产属性
    
    * [Bugfix] 资产批量便捷
    
    * [Update] 修改认证
    
    * [Feature] 支持popover
    
    * [Feature] tree
    
    * [Feature] 添加资产树
    
    * [Feature] 使用ztree
    
    * [Feature] tree增删功能
    
    * [Bugfix] 修复组详情bug
    
    * [Bugfix] 修复组详情bug
    
    * [Bugfix] 修改创建label时报错的bug
    
    * [Bugfix] 修改label api bug
    
    * [Update] 去掉资产组添加
    
    * [Update] 修改ztrr
    
    * Update README.md
    
    * [Update] 修改资产创建
    
    * [Bugfix] 修复ldap认证bug
    
    * [Update] 修改一处翻译
    
    * [Update] 更改授权规则前commit
    
    * [Abandon] ...
    
    * Update README.md
    
    * Update README.md
    
    * Update README.md
    
    * [Feature] 完成资产授权和资产添加
    
    * [Update] 修改授权
    
    * [Bugfix] 修改创建系统用户的bug
    
    * feat: rdp support
    
    * [Update] 拆分asset api module
    
    * [Update] 资产列表选中和移除资产
    
    * [Feature] 更改perms api
    
    * [Update] 使用资产树,去掉集群和资产组
    
    * [Update] 修改系统用户推送,拆分assets的部分模块
    
    * [Update] 完成树形改造
    
    * [Update] 完成资产书
    
    * [Update] 修改资产model
    
    * ubuntu16.04 deb_requirements.txt update (#1007)
    
    * Update run server.py (#915)
    
    Fix  for not callable error when  config.py not exists
    
    * [Update]一些修改
    
    * [Update] 修改初始
    
    * feat: replay setting page and api
    
    * 增加隐藏树功能
    
    * [Update] 修改翻译
    
    * 对齐菜单文字。修改英文
    
    * feat: update app setting
    
    * fix: app get replay storage
    
    * [Update] 修改文案
    
    * [Docs] 初始化doc
    
    * [Bugfix] 用户csv导入编码问题
    
    * [Update] 修改设置的一些require
    
    * [Bugfix] 修复管理用户无法查看的bug
    
    * [Update] 修改授权api, windows资产只有rdp协议,linux只有ssh协议
    
    * [Update] terminal可以更改名称
    
    * [Update] 统一copyright
    
    * [Update] 修改文档
    
    * [Bugfix] 修复资产禁用还可以登录
    
    * [Update] 修改文案
    
    * [Update] 支持拖拽更新
    
    * [Bugfix] 修复bug,修改celery beat版本依赖
    
    * [Update] 修改一些小问题
    
    * 添加普通用户使用内容
    
    * [Update] 修改一些文案
    
    * Update README.md
    
    * Update README.md
    
    * Update README.md
    
    * 用户列表
    
    * [Update] 修改一些bug和文案
    
    * [Delete] 删除build 页面
    
    * [Update] 修改conf
    
    * [Update] bugfix
    
    * [Update] 更新文档地址
    
    * [Update] 修改部分翻译和文档
    
    * [Update] 修改一些bug
    
    * [Update] 修改链接
    
    * [Update] 增加批量终端session api
    
    * [Update] 修改Node value唯一
    
    * [Bugfix] 修复首页无法显示数据的bug
    
    * feat: s3 replay file get
    
    * feat: update
    
    * [Update] 修改bug
    Unverified
    c2abd58d
forms.py 5.89 KB
# -*- coding: utf-8 -*-
#
import json

from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.html import escape
from django.db import transaction
from django.conf import settings

from .models import Setting
from .fields import DictField


def to_model_value(value):
    try:
        return json.dumps(value)
    except json.JSONDecodeError:
        return None


def to_form_value(value):
    try:
        data = json.loads(value)
        if isinstance(data, dict):
            data = value
        return data
    except json.JSONDecodeError:
        return ""


class BaseForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        db_settings = Setting.objects.all()
        for name, field in self.fields.items():
            db_value = getattr(db_settings, name).value
            django_value = getattr(settings, name) if hasattr(settings, name) else None
            if db_value is False or db_value:
                field.initial = to_form_value(db_value)
            elif django_value is False or django_value:
                field.initial = to_form_value(to_model_value(django_value))

    def save(self, category="default"):
        if not self.is_bound:
            raise ValueError("Form is not bound")

        db_settings = Setting.objects.all()
        if self.is_valid():
            with transaction.atomic():
                for name, value in self.cleaned_data.items():
                    field = self.fields[name]
                    if isinstance(field.widget, forms.PasswordInput) and not value:
                        continue
                    if value == to_form_value(getattr(db_settings, name).value):
                        continue

                    defaults = {
                        'name': name,
                        'category': category,
                        'value': to_model_value(value)
                    }
                    Setting.objects.update_or_create(defaults=defaults, name=name)
        else:
            raise ValueError(self.errors)


class BasicSettingForm(BaseForm):
    SITE_URL = forms.URLField(
        label=_("Current SITE URL"),
        help_text="eg: http://jumpserver.abc.com:8080"
    )
    USER_GUIDE_URL = forms.URLField(
        label=_("User Guide URL"), required=False,
        help_text=_("User first login update profile done redirect to it")
    )
    EMAIL_SUBJECT_PREFIX = forms.CharField(
        max_length=1024, label=_("Email Subject Prefix"),
        initial="[Jumpserver] "
    )


class EmailSettingForm(BaseForm):
    EMAIL_HOST = forms.CharField(
        max_length=1024, label=_("SMTP host"), initial='smtp.jumpserver.org'
    )
    EMAIL_PORT = forms.CharField(max_length=5, label=_("SMTP port"), initial=25)
    EMAIL_HOST_USER = forms.CharField(
        max_length=128, label=_("SMTP user"), initial='noreply@jumpserver.org'
    )
    EMAIL_HOST_PASSWORD = forms.CharField(
        max_length=1024, label=_("SMTP password"), widget=forms.PasswordInput,
        required=False, help_text=_("Some provider use token except password")
    )
    EMAIL_USE_SSL = forms.BooleanField(
        label=_("Use SSL"), initial=False, required=False,
        help_text=_("If SMTP port is 465, may be select")
    )
    EMAIL_USE_TLS = forms.BooleanField(
        label=_("Use TLS"), initial=False, required=False,
        help_text=_("If SMTP port is 587, may be select")
    )


class LDAPSettingForm(BaseForm):
    AUTH_LDAP_SERVER_URI = forms.CharField(
        label=_("LDAP server"), initial='ldap://localhost:389'
    )
    AUTH_LDAP_BIND_DN = forms.CharField(
        label=_("Bind DN"), initial='cn=admin,dc=jumpserver,dc=org'
    )
    AUTH_LDAP_BIND_PASSWORD = forms.CharField(
        label=_("Password"), initial='',
        widget=forms.PasswordInput, required=False
    )
    AUTH_LDAP_SEARCH_OU = forms.CharField(
        label=_("User OU"), initial='ou=tech,dc=jumpserver,dc=org'
    )
    AUTH_LDAP_SEARCH_FILTER = forms.CharField(
        label=_("User search filter"), initial='(cn=%(user)s)',
        help_text=_("User search filter must contain ([cn,uid,sAMAccountName,...]=%(user)s)")
    )
    AUTH_LDAP_USER_ATTR_MAP = DictField(
        label=_("User attr map"),
        initial=json.dumps({
            "username": "cn",
            "name": "sn",
            "email": "mail"
        }),
        help_text=_(
            "User attr map present how to map LDAP user attr to jumpserver, username,name,email is jumpserver attr")
    )
    # AUTH_LDAP_GROUP_SEARCH_OU = CONFIG.AUTH_LDAP_GROUP_SEARCH_OU
    # AUTH_LDAP_GROUP_SEARCH_FILTER = CONFIG.AUTH_LDAP_GROUP_SEARCH_FILTER
    AUTH_LDAP_START_TLS = forms.BooleanField(
        label=_("Use SSL"), initial=False, required=False
    )
    AUTH_LDAP = forms.BooleanField(label=_("Enable LDAP auth"), initial=False, required=False)


class TerminalSettingForm(BaseForm):
    SORT_BY_CHOICES = (
        ('hostname', _('Hostname')),
        ('ip', _('IP')),
    )
    TERMINAL_ASSET_LIST_SORT_BY = forms.ChoiceField(
        choices=SORT_BY_CHOICES, initial='hostname', label=_("List sort by")
    )
    TERMINAL_HEARTBEAT_INTERVAL = forms.IntegerField(
        initial=5, label=_("Heartbeat interval"), help_text=_("Units: seconds")
    )
    TERMINAL_PASSWORD_AUTH = forms.BooleanField(
        initial=True, required=False, label=_("Password auth")
    )
    TERMINAL_PUBLIC_KEY_AUTH = forms.BooleanField(
        initial=True, required=False, label=_("Public key auth")
    )
    TERMINAL_COMMAND_STORAGE = DictField(
        label=_("Command storage"), help_text=_(
            "Set terminal storage setting, `default` is the using as default,"
            "You can set other storage and some terminal using"
        )
    )
    TERMINAL_REPLAY_STORAGE = DictField(
        label=_("Replay storage"), help_text=_(
            "Set replay storage setting, `default` is the using as default,"
            "You can set other storage and some terminal using"
        )
    )