mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			160 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
# -*- 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="http://jumpserver.abc.com:8080"
 | 
						|
    )
 | 
						|
    USER_GUIDE_URL = forms.URLField(
 | 
						|
        label=_("User Guide URL"),
 | 
						|
        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)'
 | 
						|
    )
 | 
						|
    AUTH_LDAP_USER_ATTR_MAP = DictField(
 | 
						|
        label=_("User attr map"),
 | 
						|
        initial=json.dumps({
 | 
						|
            "username": "cn",
 | 
						|
            "name": "sn",
 | 
						|
            "email": "mail"
 | 
						|
        })
 | 
						|
    )
 | 
						|
    # 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
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
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"
 | 
						|
        )
 | 
						|
    )
 |