File: /volume1/@appstore/VPNCenter/app/vpn.js
/* Copyright (c) 2026 Synology Inc. All rights reserved. */
Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelStatus=Ext.extend(SYNO.ux.FormPanel,{constructor:function(a){this.owner=a.appWin;this.module=a.module;var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelStatus.superclass.constructor.call(this,b)},createPPTPPanel:function(){var b=new Ext.Panel({border:false,magin:5,cls:"synovpn-icon",items:[{xtype:"syno_displayfield",width:32,height:32,name:"pptp_icon",cls:"syno-vpn-svr-disable"}]});var c=new Ext.Panel({border:false,width:256,magin:5,cls:"synovpn-contain",items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",value:_V("pptp","pptp")},{xtype:"syno_displayfield",cls:"synovpn-desc-status",htmlEncode:false,value:_V("status","status"),name:"pptp_status"},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","text_ip_range")},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","current_conn")}]});var a=new Ext.Panel({border:false,magin:5,labelWidth:150,cls:"synovpn-contain",items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",htmlEncode:false,name:"pptp_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc-status",htmlEncode:false,name:"pptp_status_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"pptp_range"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"pptp_count"}]});var d={layout:"hbox",name:"pptp_panel",cls:"synovpn-contain",items:[b,c,a]};return new SYNO.ux.FieldSet(d)},createL2TPPanel:function(){var c=new Ext.Panel({border:false,magin:5,cls:"synovpn-icon",items:[{xtype:"syno_displayfield",width:32,height:32,name:"l2tp_icon",cls:"syno-vpn-svr-disable"}]});var d=new Ext.Panel({width:256,border:false,magin:5,cls:"synovpn-contain",items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",value:_V("l2tp","l2tp")},{xtype:"syno_displayfield",cls:"synovpn-desc-status",htmlEncode:false,value:_V("status","status"),name:"l2tp_status"},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","text_ip_range")},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","current_conn")}]});var a=new Ext.Panel({border:false,magin:5,labelWidth:150,items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",htmlEncode:false,name:"l2tp_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc-status",htmlEncode:false,name:"l2tp_status_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"l2tp_range"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"l2tp_count"}]});var b={layout:"hbox",name:"l2tp_panel",cls:"synovpn-contain",items:[c,d,a]};return new SYNO.ux.FieldSet(b)},createOpenVPNPanel:function(){var c=new Ext.Panel({border:false,magin:5,cls:"synovpn-icon",items:[{xtype:"syno_displayfield",width:32,height:32,name:"openvpn_icon",cls:"syno-vpn-svr-disable"}]});var d=new Ext.Panel({width:256,border:false,magin:5,cls:"synovpn-contain",items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",value:_V("openvpn","openvpn")},{xtype:"syno_displayfield",cls:"synovpn-desc-status",value:_V("status","status"),htmlEncode:false,name:"openvpn_status"},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","text_ip_range")},{xtype:"syno_displayfield",cls:"synovpn-desc-subtitle",value:_V("status","current_conn")}]});var b=new Ext.Panel({border:false,magin:5,items:[{xtype:"syno_displayfield",cls:"synovpn-desc-title",htmlEncode:false,name:"openvpn_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc-status",htmlEncode:false,name:"openvpn_status_dummy"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"openvpn_range"},{xtype:"syno_displayfield",cls:"synovpn-desc",name:"openvpn_count"}]});var a={layout:"hbox",name:"openvpn_panel",cls:"synovpn-contain",items:[c,d,b]};return new SYNO.ux.FieldSet(a)},createPackagePanel:function(){var c=[];var a={cls:"synovpn-service-line",border:false};c.push({xtype:"syno_displayfield",name:"dsc_change_if",hideLabel:true,htmlEncode:false,value:_V("status","warn_interface_not_avail"),id:"SwitchIfLink",hidden:true});this.PanelPPTP=this.createPPTPPanel();c.push(a);c.push(this.PanelPPTP);this.PanelOpenVPN=this.createOpenVPNPanel();c.push(a);c.push(this.PanelOpenVPN);if(_D("support_ipsec")==="yes"){this.PanelL2TP=this.createL2TPPanel();c.push(a);c.push(this.PanelL2TP);c.push(a)}var b={cls:"synovpn-overview-main-fieldset",items:c};return new SYNO.ux.FieldSet(b)},fillConfig:function(a){this.EmptyField={synotype:"desc",value:""};this.PanelPackage=this.createPackagePanel();var b={cls:"synovpn-overview",labelAlign:"left",border:false,itemId:"status",labelwidth:160,trackResetOnLoad:true,items:this.PanelPackage};return b},switchIf:function(){this.owner.pageList.selectModule("SYNO.SDS.VPN.VPNPanelGeneral")},MarkColor:function(b,a){return'<element class="'+a+'">'+b+"</>"},getVPNRange:function(d){var c,b;var a=d.split(".");a[3]=255;b=a.join(".");a[3]=0;c=a.join(".");return c+" ~ "+b},markStatus:function(c,a){var b;if(c){if(a){b=this.MarkColor(_V("common","enable"),"blue-status")}else{b=this.MarkColor(_V("common","enable_fail"),"red-status")}}else{b=this.MarkColor(_V("common","disable"),"disable-font")}return b},loadFormDone:function(h,a,g,d){if(h){var c={pptp_dummy:"<br>",pptp_status_dummy:"<br>",pptp_status:this.markStatus(a.pptp.serv_enable,a.pptp.serv_run),pptp_range:a.pptp.serv_enable?this.getVPNRange(a.pptp.serv_ip):"-",pptp_count:a.pptp.serv_enable?a.pptp.con_count:"-",l2tp_dummy:"<br>",l2tp_status_dummy:"<br>",l2tp_status:this.markStatus(a.l2tp.serv_enable,a.l2tp.serv_run),l2tp_range:a.l2tp.serv_enable?this.getVPNRange(a.l2tp.serv_ip):"-",l2tp_count:a.l2tp.serv_enable?a.l2tp.con_count:"-",openvpn_dummy:"<br>",openvpn_status_dummy:"<br>",openvpn_status:this.markStatus(a.openvpn.serv_enable,a.openvpn.serv_run),openvpn_range:a.openvpn.serv_enable?this.getVPNRange(a.openvpn.serv_ip):"-",openvpn_count:a.openvpn.serv_enable?a.openvpn.con_count:"-"};this.getForm().setValues(c);if(a.pptp.serv_enable){this.getForm().findField("pptp_icon").removeClass("syno-vpn-svr-disable");this.getForm().findField("pptp_icon").addClass("syno-vpn-svr-enable")}else{this.getForm().findField("pptp_icon").removeClass("syno-vpn-svr-enable");this.getForm().findField("pptp_icon").addClass("syno-vpn-svr-disable")}if(_D("support_ipsec")==="yes"){if(a.l2tp.serv_enable){this.getForm().findField("l2tp_icon").removeClass("syno-vpn-svr-disable");this.getForm().findField("l2tp_icon").addClass("syno-vpn-svr-enable")}else{this.getForm().findField("l2tp_icon").removeClass("syno-vpn-svr-enable");this.getForm().findField("l2tp_icon").addClass("syno-vpn-svr-disable")}}if(a.openvpn.serv_enable){this.getForm().findField("openvpn_icon").removeClass("syno-vpn-svr-disable");this.getForm().findField("openvpn_icon").addClass("syno-vpn-svr-enable")}else{this.getForm().findField("openvpn_icon").removeClass("syno-vpn-svr-enable");this.getForm().findField("openvpn_icon").addClass("syno-vpn-svr-disable")}if(!a.pkg.active){this.getForm().findField("dsc_change_if").show();var b=Ext.id();var e=this.getForm().findField("dsc_change_if");var f="<element class='red-status'>"+_V("status","warn_interface_not_avail")+"</>";f=f.replace("(","<a class='link-font' style='cursor: pointer;' id="+b+">");f=f.replace(")","</a>");e.setValue(f);e.originalValue=e.getValue();Ext.get(b).addListener("click",this.switchIf,this)}else{this.getForm().findField("dsc_change_if").hide()}}else{this.owner.getMsgBox().alert(_V("status","status"),_T("common","error_system"))}this.owner.clearStatusBusy()},loadForm:function(){this.owner.setStatusBusy();this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"status_load",callback:this.loadFormDone,scope:this})},onPageActivate:function(){this.loadForm();this.PanelPPTP.doLayout();this.PanelOpenVPN.doLayout();if(_D("support_ipsec")==="yes"){this.PanelL2TP.doLayout()}}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelPPTP=Ext.extend(SYNO.SDS.Utils.FormPanel,{OriSetting:undefined,TmpSetting:undefined,BtnApplyId:undefined,BtnCancelId:undefined,constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelPPTP.superclass.constructor.call(this,b);var c=function(){var e=this.getForm().findField("serv_enable").getValue();var f=this.getForm().findField("auth_type").getValue();var d=this.getForm().findField("dns_check").getValue();if(true===e&&SYNO.SDS.VPN.AUTH_TYPE_MSCHAP===f){this.getForm().findField("mppe_type").enable()}else{this.getForm().findField("mppe_type").disable()}if(true===e&&true===d){this.getForm().findField("dns").enable()}else{this.getForm().findField("dns").disable()}};this.mon(this,"afterrender",function(d,e){this.mon(this.getForm().findField("serv_ip"),"afterrender",function(f,g){this.mon(this.getForm().findField("dns_field"),"afterrender",function(h,i){this.dummy1=new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"serv_enable",["serv_ip","serv_ip_1","serv_ip_2","serv_ip_3","serv_range","auth_type","auth_conn","mtu","dns_check","dns"]);this.getForm().findField("dns_check").on("check",c,this);this.getForm().findField("auth_type").on("select",c,this);this.getForm().findField("serv_enable").on("check",c,this)},this,{single:true})},this,{single:true})},this,{single:true})},fillConfig:function(a){this.EmptyField={synotype:"desc",value:""};this.owner=a.appWin;var b={cls:"synovpn-panel",labelAlign:"left",border:false,itemId:"pptp",trackResetOnLoad:true,items:[{xtype:"syno_fieldset",title:_V("pptp","pptp"),width:"570",height:"400",items:[{xtype:"syno_checkbox",boxLabel:_V("pptp","chk_service_enable"),name:"serv_enable"},SYNO.SDS.VPN.TextFieldIP("PPTP"),SYNO.SDS.VPN.ComboboxIpRange(),{xtype:"syno_numberfield",fieldLabel:_V("common","max_conn_per_account"),name:"auth_conn",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,allowBlank:false,maxlength:2,validator:function(e){var d=this.ownerCt.ownerCt.getForm().findField("serv_range");var c=d.getValue();if(e>c){return _V("msg","error_conn_exceed")}return true}},SYNO.SDS.VPN.ComboboxAuth(),SYNO.SDS.VPN.ComboboxMppe(),SYNO.SDS.VPN.TextMTU(),SYNO.SDS.VPN.TextFieldDNS()]}],buttons:[{xtype:"syno_button",text:_T("common","reset"),itemId:"cancel",ctCls:"syno-sds-cp-btn",id:this.BtnCancelId=Ext.id(),scope:this,handler:this.onCancel},{xtype:"syno_button",btnStyle:"blue",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",text:_T("common","commit"),itemId:"apply",ctCls:"syno-sds-cp-btn",id:this.BtnApplyId=Ext.id(),scope:this,handler:this.onSave}]};b=this.addStatusBar(b);SYNO.LayoutConfig.fill(b);Ext.apply(b,a);return b},addStatusBar:function(a){var b={xtype:"statusbar",hideMode:"visibility",defaultText:" ",statusAlign:"left",buttonAlign:"left",items:[]};if(a.buttons){b.items=b.items.concat(a.buttons);delete a.buttons}Ext.applyIf(a,{fbar:b});return a},loadFormDone:function(d,a,c,b){this.clearStatusBusy();if(d){var e=a.items.serv_ip.split(".");if(4!=e.length){SYNO.Debug("Invalid IP format!!!")}this.OriSetting={serv_enable:a.items.serv_enable,serv_ip_1:e[0],serv_ip_2:e[1],serv_ip_3:e[2],serv_range:a.items.serv_range,auth_type:a.items.auth_type,auth_conn:a.items.auth_conn,mppe_type:a.items.mppe_type,mtu:a.items.mtu,dns_check:a.items.dns_check,dns:a.items.dns};this.getForm().setValues(this.OriSetting);this.getForm().findField("auth_conn").validate();this.getForm().findField("auth_type").fireEvent("select")}else{this.owner.getMsgBox().alert(_V("pptp","pptp"),_T("common","error_system"))}},loadForm:function(){this.setStatusBusy();this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"load",params:{serv_type:"pptp"},callback:this.loadFormDone,scope:this})},applyFormDone:function(e,a,d,b){this.clearStatusBusy();if(e){this.owner.setStatusOK();if(!this.OriSetting.serv_enable&&this.TmpSetting.serv_enable){var c=_V("msg","info_firewall_portforward");c=c.replace("_PRTL_","TCP");c=c.replace("_PORT_",SYNO.SDS.VPN.PPTP_PORT);this.owner.getMsgBox().alert(_V("pptp","pptp"),c,function(){if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}},this)}else{if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}}this.OriSetting=this.TmpSetting;this.getForm().setValues(this.OriSetting)}else{if(1000===a.code){this.owner.getMsgBox().alert(_V("pptp","pptp"),_V("msg","err_ip_conflict"))}else{this.owner.getMsgBox().alert(_V("pptp","pptp"),_T("common","error_system"))}if(this.confirmLostChangeReject){this.confirmLostChangeReject()}}},applyForm:function(){this.setStatusBusy({text:_T("common","saving")});var c=this.getForm();var b=c.findField("serv_ip_1").getValue();var a=c.findField("serv_ip_2").getValue();var e=c.findField("serv_ip_3").getValue();var d={serv_type:"pptp",serv_enable:c.findField("serv_enable").getValue(),serv_ip:b+"."+a+"."+e+".0",serv_range:c.findField("serv_range").getValue(),auth_type:c.findField("auth_type").getValue(),auth_conn:c.findField("auth_conn").getValue(),mppe_type:c.findField("mppe_type").getValue(),mtu:c.findField("mtu").getValue(),dns_check:c.findField("dns_check").getValue(),dns:c.findField("dns").getValue()};this.TmpSetting={serv_enable:c.findField("serv_enable").getValue(),serv_ip_1:b,serv_ip_2:a,serv_ip_3:e,serv_range:c.findField("serv_range").getValue(),auth_type:c.findField("auth_type").getValue(),auth_conn:c.findField("auth_conn").getValue(),mppe_type:c.findField("mppe_type").getValue(),mtu:c.findField("mtu").getValue(),dns_check:c.findField("dns_check").getValue(),dns:c.findField("dns").getValue()};this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"apply",params:d,callback:this.applyFormDone,scope:this})},onPageActivate:function(){this.loadForm();this.getForm().findField("serv_ip").doLayout();this.doLayout()},getIPString:function(){var c=this.getForm();var b=c.findField("serv_ip_1").getValue();var a=c.findField("serv_ip_2").getValue();var d=c.findField("serv_ip_3").getValue();return b+"."+a+"."+d+".0"},checkDirty:function(){if(this.getForm().isDirty()){return true}return false},onBeforeSaveCheck:function(){if(!this.checkDirty()){this.setStatusError({text:_T("error","nochange_subject"),clear:true});return false}if(this.getForm().findField("serv_enable").getValue()&&this.getForm().findField("serv_enable").isDirty()){if(this.confirmPPTPWarn){return true}else{this.appWin.getMsgBox().confirm("",_V("pptp","enable_pptp_warn"),function(a){if("yes"===a){this.confirmPPTPWarn=true;this.onSave()}},this);return false}}this.confirmPPTPWarn=false;return true},onSave:function(){if(!this.onBeforeSaveCheck()){return}var a=this.getForm().findField("serv_enable").getValue();if(a){if(!SYNO.SDS.VPN.PrivateAddressCheck(this.getIPString())){var b=_V("msg","err_invalid_private_ip");this.getForm().findField("serv_ip_1").markInvalid(b);this.getForm().findField("serv_ip_2").markInvalid(b);this.getForm().findField("serv_ip_3").markInvalid(b);this.owner.setStatusError({text:b,clear:true});return}if(!this.getForm().isValid()){this.owner.setStatusError({text:_T("common","forminvalid"),clear:true});return}}this.applyForm()},onCancel:function(){this.getForm().setValues(this.OriSetting)},onPageConfirmLostChangeSave:function(){return new Promise(function(b,a){this.onSave();this.confirmLostChangeResolve=b;this.confirmLostChangeReject=a}.bind(this))}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelL2TP=Ext.extend(SYNO.SDS.Utils.FormPanel,{OriSetting:undefined,TmpSetting:undefined,constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelL2TP.superclass.constructor.call(this,b);var c=function(){var e=this.getForm().findField("serv_enable").getValue();var d=this.getForm().findField("dns_check").getValue();if(true===e&&true===d){this.getForm().findField("dns").enable()}else{this.getForm().findField("dns").disable()}};this.mon(this,"afterrender",function(d,e){this.mon(this.getForm().findField("serv_ip"),"afterrender",function(f,g){this.mon(this.getForm().findField("dns_field"),"afterrender",function(h,i){this.dummy=new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"serv_enable",["serv_ip","serv_ip_1","serv_ip_2","serv_ip_3","serv_range","auth_type","auth_conn","mtu","dns_check","dns","preshared_key","preshared_key_confirm","sha2_truncbug","kernel_mode","ike_auth"]);this.getForm().findField("serv_enable").on("check",c,this);this.getForm().findField("dns_check").on("check",c,this)},this,{single:true})},this,{single:true})},this,{single:true})},fillConfig:function(a){this.EmptyField={synotype:"desc",value:""};this.owner=a.appWin;var b={cls:"synovpn-panel",labelAlign:"left",border:false,itemId:"l2tp",trackResetOnLoad:true,items:[{xtype:"syno_fieldset",title:_V("l2tp","l2tp"),width:"570",height:"400",items:[{xtype:"syno_checkbox",boxLabel:_V("l2tp","chk_service_enable"),name:"serv_enable"},SYNO.SDS.VPN.TextFieldIP("L2TP"),SYNO.SDS.VPN.ComboboxIpRange(),{xtype:"syno_numberfield",fieldLabel:_V("common","max_conn_per_account"),name:"auth_conn",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,allowBlank:false,maxlength:2,validator:function(e){var d=this.ownerCt.ownerCt.getForm().findField("serv_range");var c=d.getValue();if(e>c){return _V("msg","error_conn_exceed")}return true}},SYNO.SDS.VPN.ComboboxAuth(),SYNO.SDS.VPN.TextMTU(),SYNO.SDS.VPN.TextFieldDNS(),{xtype:"syno_checkbox",boxLabel:_V("l2tp","chk_kernel_mode"),name:"kernel_mode",indent:1,hidden:(0<=(_D("unique").indexOf("qoriq"))||(0<=_D("unique").indexOf("88f6281"))||(0<=_D("unique").indexOf("88f6282")))?true:false},{xtype:"syno_displayfield",name:"ike_auth",value:_V("l2tp","ike_auth"),indent:1},{xtype:"syno_textfield",textType:"password",indent:1,fieldLabel:_V("l2tp","pswd_preshared"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,name:"preshared_key",allowBlank:false,validator:function(c){if(127<c.length){return String.format(_T("storage_manager","field_max_len"),127)}if(-1===c.search('"')&&/^[\x00-\x7F]*$/.test(c)){return true}return _T("service","service_ddns_input_warning_passwd")}},{xtype:"syno_textfield",textType:"password_confirm",indent:1,fieldLabel:_V("l2tp","confirm_preshared"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,name:"preshared_key_confirm",confirmFor:"preshared_key",validator:function(e){var d=this.ownerCt.ownerCt.getForm().findField(this.confirmFor);var c=d.getValue();if(127<e.length){return String.format(_T("storage_manager","field_max_len"),127)}if((e!==c)&&(c!=="12345678"||e!=="87654321")){return _T("pppoe","error_password")}return true}},{xtype:"syno_checkbox",boxLabel:_V("l2tp","chk_sha2_truncbug"),name:"sha2_truncbug",indent:1,hidden:(0<=(_D("unique").indexOf("qoriq"))||(0<=_D("unique").indexOf("88f6281"))||(0<=_D("unique").indexOf("88f6282")))?true:false},{xtype:"syno_displayfield",indent:1,name:"msg_enable_fail",hideLabel:true,value:"<element class='red-status'>"+_V("msg","err_l2tpc_conflict")+"</>",hidden:true}]}],buttons:[{xtype:"syno_button",text:_T("common","reset"),itemId:"cancel",ctCls:"syno-sds-cp-btn",scope:this,handler:this.onCancel},{xtype:"syno_button",btnStyle:"blue",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",text:_T("common","commit"),itemId:"apply",ctCls:"syno-sds-cp-btn",scope:this,handler:this.onSave}]};b=this.addStatusBar(b);SYNO.LayoutConfig.fill(b);Ext.apply(b,a);return b},addStatusBar:function(a){var b={xtype:"statusbar",hideMode:"visibility",defaultText:" ",statusAlign:"left",buttonAlign:"left",items:[]};if(a.buttons){b.items=b.items.concat(a.buttons);delete a.buttons}Ext.applyIf(a,{fbar:b});return a},LayoutUpdate:function(a){if(a){var b="<element class='red-status'>"+_V(a.sec,a.key)+"</>";this.getForm().setValues({msg_enable_fail:b});this.getForm().findField("msg_enable_fail").show()}else{this.getForm().findField("msg_enable_fail").hide()}},loadFormDone:function(d,a,c,b){this.clearStatusBusy();if(d){var e=a.items.serv_ip.split(".");if(4!=e.length){SYNO.Debug("Invalid IP format!!!")}this.OriSetting={serv_enable:a.items.serv_enable,serv_ip_1:e[0],serv_ip_2:e[1],serv_ip_3:e[2],serv_range:a.items.serv_range,auth_type:a.items.auth_type,auth_conn:a.items.auth_conn,mtu:a.items.mtu,dns_check:a.items.dns_check,dns:a.items.dns,preshared_key:a.items.preshared_key,preshared_key_confirm:a.items.preshared_key,sha2_truncbug:a.items.sha2_truncbug,kernel_mode:a.items.kernel_mode};if(this.OriSetting.preshared_key==="12345678"){this.OriSetting.preshared_key_confirm="87654321"}this.getForm().setValues(this.OriSetting);this.getForm().findField("auth_conn").validate();this.getForm().findField("auth_type").fireEvent("select");this.LayoutUpdate(a.items.errinfo)}else{this.owner.getMsgBox().alert(_V("l2tp","l2tp"),_T("common","error_system"))}},loadForm:function(){this.setStatusBusy();this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"load",params:{serv_type:"l2tp"},callback:this.loadFormDone,scope:this})},applyFormDone:function(e,a,d,b){this.clearStatusBusy();if(e){this.setStatusOK();if(!this.OriSetting.serv_enable&&this.TmpSetting.serv_enable){var c=_V("msg","info_firewall_portforward_plural");c=c.replace("_PRTL_","UDP");c=c.replace("_PORT_","1701, 500, 4500");this.owner.getMsgBox().alert(_V("l2tp","l2tp"),c,function(){if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}},this)}else{if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}}this.OriSetting=this.TmpSetting;this.getForm().setValues(this.OriSetting)}else{if(1000===a.code){this.owner.getMsgBox().alert(_V("l2tp","l2tp"),_V("msg","err_ip_conflict"))}else{if(1001===a.code){this.owner.getMsgBox().alert(_V("l2tp","l2tp"),_V("msg","err_l2tpc_conflict"))}else{this.owner.getMsgBox().alert(_V("l2tp","l2tp"),_T("common","error_system"))}}if(this.confirmLostChangeReject){this.confirmLostChangeReject()}}},applyForm:function(){this.setStatusBusy();var c=this.getForm();var b=c.findField("serv_ip_1").getValue();var a=c.findField("serv_ip_2").getValue();var e=c.findField("serv_ip_3").getValue();var d={serv_type:"l2tp",serv_enable:c.findField("serv_enable").getValue(),serv_ip:b+"."+a+"."+e+".0",serv_range:c.findField("serv_range").getValue(),auth_type:c.findField("auth_type").getValue(),auth_conn:c.findField("auth_conn").getValue(),mtu:c.findField("mtu").getValue(),dns_check:c.findField("dns_check").getValue(),dns:c.findField("dns").getValue(),preshared_key:c.findField("preshared_key").getValue(),preshared_key_confirm:c.findField("preshared_key_confirm").getValue(),sha2_truncbug:c.findField("sha2_truncbug").getValue(),kernel_mode:c.findField("kernel_mode").getValue()};this.TmpSetting={serv_enable:c.findField("serv_enable").getValue(),serv_ip_1:b,serv_ip_2:a,serv_ip_3:e,serv_range:c.findField("serv_range").getValue(),auth_type:c.findField("auth_type").getValue(),auth_conn:c.findField("auth_conn").getValue(),mtu:c.findField("mtu").getValue(),dns_check:c.findField("dns_check").getValue(),dns:c.findField("dns").getValue(),preshared_key:c.findField("preshared_key").getValue(),preshared_key_confirm:c.findField("preshared_key_confirm").getValue(),sha2_truncbug:c.findField("sha2_truncbug").getValue(),kernel_mode:c.findField("kernel_mode").getValue()};this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"apply",params:d,callback:this.applyFormDone,scope:this})},onPageActivate:function(){this.loadForm();this.getForm().findField("serv_ip").doLayout();this.doLayout()},getIPString:function(){var c=this.getForm();var b=c.findField("serv_ip_1").getValue();var a=c.findField("serv_ip_2").getValue();var d=c.findField("serv_ip_3").getValue();return b+"."+a+"."+d+".0"},checkDirty:function(){if(this.getForm().isDirty()){return true}return false},onSave:function(){if(!this.checkDirty()){this.setStatusError({text:_T("error","nochange_subject"),clear:true});return}if(!SYNO.SDS.VPN.PrivateAddressCheck(this.getIPString())){var a=_V("msg","err_invalid_private_ip");this.getForm().findField("serv_ip_1").markInvalid(a);this.getForm().findField("serv_ip_2").markInvalid(a);this.getForm().findField("serv_ip_3").markInvalid(a);this.setStatusError({text:a,clear:true});return}if(!this.getForm().isValid()){this.setStatusError({text:_T("common","forminvalid"),clear:true});return}this.applyForm()},onCancel:function(){this.getForm().setValues(this.OriSetting)},onPageConfirmLostChangeSave:function(){return new Promise(function(b,a){this.onSave();this.confirmLostChangeResolve=b;this.confirmLostChangeReject=a}.bind(this))}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelOpenVPN=Ext.extend(SYNO.SDS.Utils.FormPanel,{OriSetting:undefined,TmpSetting:undefined,BtnCerExpId:undefined,BtnApplyId:undefined,BtnCancelId:undefined,noInterCrt:undefined,constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelOpenVPN.superclass.constructor.call(this,b);this.mon(this,"afterlayout",function(){SYNO.SDS.Utils.AddTip(this.getForm().findField("push_route_enable").getEl(),_V("msg","push_route_notify"));SYNO.SDS.Utils.AddTip(this.getForm().findField("tls_auth_key").getEl(),_V("openvpn","tls_auth_key_tooltip"));SYNO.SDS.Utils.AddTip(this.getForm().findField("verify_server_cn").getEl(),_V("openvpn","verify_server_cn_tooltip"))},this,{single:true});this.dummy=new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"serv_enable",["serv_ip","serv_ip_1","serv_ip_2","serv_ip_3","serv_range","auth_conn","port","protocol","encryption","authentication","comp_enable","push_route_enable","tls_auth_key","verify_server_cn","enable_ipv6_server","mssfix_value"]);this.dummy2=new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_ipv6_server",["ipv6_prefix"])},fillConfig:function(a){this.EmptyField={synotype:"desc",value:""};this.owner=a.appWin;var b={cls:"synovpn-panel",labelAlign:"left",border:false,itemId:"openvpn",trackResetOnLoad:true,items:[{xtype:"syno_fieldset",title:_V("openvpn","openvpn"),width:"570",height:"400",items:[{xtype:"syno_checkbox",boxLabel:_V("openvpn","chk_service_enable"),name:"serv_enable"},SYNO.SDS.VPN.TextFieldIP("openvpn"),SYNO.SDS.VPN.ComboboxIpRange(),{xtype:"syno_numberfield",fieldLabel:_V("common","max_conn_per_account"),name:"auth_conn",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,allowBlank:false,maxlength:2,validator:function(e){var d=this.ownerCt.ownerCt.getForm().findField("serv_range");var c=d.getValue();if(e>c){return _V("msg","error_conn_exceed")}return true}},{xtype:"syno_numberfield",fieldLabel:_T("common","port"),name:"port",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,allowBlank:false,maxlength:5,minValue:1,maxValue:65535,value:1194},{xtype:"syno_combobox",fieldLabel:_T("tcpip","wireless_protocol"),name:"protocol",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,editable:false,allowBlank:false,store:[["udp",_T("routerconf","routerconf_protocol_udp")],["tcp",_T("routerconf","routerconf_protocol_tcp")]],value:"udp"},{xtype:"syno_combobox",name:"encryption",fieldLabel:_V("openvpn","encryption"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,valueField:"value",displayField:"display",store:new Ext.data.SimpleStore({fields:["value","display"],data:[["AUTO",_T("common","auto")],["CHACHA20-POLY1305","CHACHA20-POLY1305"],["AES-256-GCM","AES-256-GCM"],["AES-192-GCM","AES-192-GCM"],["AES-128-GCM","AES-128-GCM"],["AES-256-CBC","AES-256-CBC"],["AES-192-CBC","AES-192-CBC"],["AES-128-CBC","AES-128-CBC"],["DES-CBC","DES-CBC"],["IDEA-CBC","IDEA-CBC"],["RC2-CBC","RC2-CBC"],["DES-EDE-CBC","DES-EDE-CBC"],["DES-EDE3-CBC","DES-EDE3-CBC"],["DESX-CBC","DESX-CBC"],["BF-CBC","BF-CBC"],["RC2-40-CBC","RC2-40-CBC"],["CAST5-CBC","CAST5-CBC"],["RC2-64-CBC","RC2-64-CBC"],["CAMELLIA-128-CBC","CAMELLIA-128-CBC"],["CAMELLIA-192-CBC","CAMELLIA-192-CBC"],["CAMELLIA-256-CBC","CAMELLIA-256-CBC"],["SEED-CBC","SEED-CBC"]]}),value:"BF-CBC",indent:1},{xtype:"syno_combobox",name:"authentication",fieldLabel:_V("openvpn","authentication"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,valueField:"value",displayField:"display",store:new Ext.data.SimpleStore({fields:["value","display"],data:[["MD5","MD5"],["SHA1","SHA1"],["RIPEMD160","RIPEMD160"],["MD4","MD4"],["SHA256","SHA256"],["SHA384","SHA384"],["SHA512","SHA512"],["SHA224","SHA224"],["whirlpool","whirlpool"]]}),value:"SHA1",indent:1},{xtype:"syno_numberfield",fieldLabel:_V("openvpn","mssfix_option_value"),name:"mssfix_value",indent:1,labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,allowBlank:false,maxlength:4,minValue:1,maxValue:65535,vtype:"number"},{xtype:"syno_checkbox",indent:1,boxLabel:_V("openvpn","chk_compress"),name:"comp_enable"},{xtype:"syno_checkbox",indent:1,boxLabel:_V("openvpn","chk_push_route"),name:"push_route_enable"},{xtype:"syno_checkbox",indent:1,boxLabel:_V("openvpn","tls_auth_key"),name:"tls_auth_key"},{xtype:"syno_checkbox",indent:1,boxLabel:_V("openvpn","verify_server_cn"),name:"verify_server_cn"},{xtype:"syno_checkbox",indent:1,boxLabel:_V("openvpn","enable_ipv6_server"),name:"enable_ipv6_server"},{xtype:"syno_combobox",indent:2,fieldLabel:_T("tcpip","ipv6_prefix"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,store:this.prefixStore=new Ext.data.SimpleStore({fields:["value","display"]}),displayField:"display",valueField:"value",name:"ipv6_prefix",allowBlank:false},{xtype:"syno_button",indent:1,text:_V("openvpn","button_certexp"),name:"cert_export",id:this.BtnCerExpId=Ext.id(),scope:this,handler:this.onExportCert},{xtype:"syno_displayfield",indent:1,name:"msg_user_config",hideLabel:true,htmlEncode:false,value:"<element class='blue-status'>"+_V("msg","info_openvpn_user_config")+"</>",hidden:true},{xtype:"syno_displayfield",indent:1,name:"msg_enable_fail",hideLabel:true,htmlEncode:false,value:"<element class='red-status'>"+_V("msg","err_openvpn_svr_enable_failed")+"</>",hidden:true},{xtype:"syno_displayfield",indent:1,name:"msg_prefix_not_match",hideLabel:true,htmlEncode:false,value:"<element class='red-status'>"+_T("msg","err_prefix_not_match")+"</>",hidden:true},{xtype:"syno_displayfield",indent:1,name:"msg_cert_expired",hideLabel:true,htmlEncode:false,value:'<element class="red-status">'+_V("openvpn","err_cert_expired_msg")+"</>",hidden:true},{xtype:"syno_displayfield",indent:1,name:"err_cert_no_intermediate",hideLabel:true,htmlEncode:false,value:"<element class='red-status'>"+String.format(_V("openvpn","err_cert_no_intermediate"),_V("openvpn","openvpn"))+"</>",hidden:true}]}],buttons:[{xtype:"syno_button",text:_T("common","reset"),itemId:"cancel",ctCls:"syno-sds-cp-btn",id:this.BtnCancelId=Ext.id(),scope:this,handler:this.onCancel},{xtype:"syno_button",btnStyle:"blue",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",text:_T("common","commit"),itemId:"apply",ctCls:"syno-sds-cp-btn",id:this.BtnApplyId=Ext.id(),scope:this,handler:this.onSave}]};b=this.addStatusBar(b);SYNO.LayoutConfig.fill(b);Ext.apply(b,a);return b},addStatusBar:function(a){var b={xtype:"statusbar",hideMode:"visibility",defaultText:" ",statusAlign:"left",buttonAlign:"left",items:[]};if(a.buttons){b.items=b.items.concat(a.buttons);delete a.buttons}Ext.applyIf(a,{fbar:b});return a},LayoutUpdate:function(c,b){console.log("serv_enable",c);console.log("user_conf",b);Ext.getCmp(this.BtnCerExpId).setDisabled(!c);if(b){this.getForm().findField("msg_user_config").show()}else{this.getForm().findField("msg_user_config").hide()}var a=this.getForm().findField("serv_enable");if(b){a.suspendEvents();this.getForm().findField("serv_ip_1").disable();this.getForm().findField("serv_ip_2").disable();this.getForm().findField("serv_ip_3").disable();this.getForm().findField("serv_range").disable();this.getForm().findField("auth_conn").disable();this.getForm().findField("comp_enable").disable();this.getForm().findField("push_route_enable").disable();this.getForm().findField("tls_auth_key").disable();this.getForm().findField("verify_server_cn").disable();Ext.getCmp(this.BtnCerExpId).setDisabled(true)}else{a.resumeEvents()}},isInPrefixStore:function(b){var a=false;this.prefixStore.each(function(c){if(b===c.get("value")){a=true;return false}},this);return a},checkAndGetIPv6Prefix:function(a){if(!this.isInPrefixStore(a)){this.getForm().findField("msg_prefix_not_match").show()}return a},loadFormDone:function(j,c,d,a){this.clearStatusBusy();if(j){var e=SYNO.API.Response.GetValByAPI(c,"SYNO.VPNServer.Settings.Config","load");var b=e.items.serv_ip.split(".");if(4!=b.length){SYNO.Debug("Invalid IP format!!!")}this.OriSetting={serv_enable:e.items.serv_enable,serv_ip_1:b[0],serv_ip_2:b[1],serv_ip_3:b[2],comp_enable:e.items.comp_enable,push_route_enable:e.items.push_route_enable,tls_auth_key:e.items.tls_auth_key,verify_server_cn:e.items.verify_server_cn,auth_conn:e.items.auth_conn,port:e.items.port,protocol:e.items.protocol,encryption:e.items.encryption,authentication:e.items.authentication,serv_range:e.items.serv_range,enable_ipv6_server:e.items.enable_ipv6_server,mssfix_value:e.items.mssfix_value};if(1===e.items.enable_ipv6_server){this.OriSetting.ipv6_prefix=this.checkAndGetIPv6Prefix(e.items.ipv6_prefix)}this.getForm().setValues(this.OriSetting);this.getForm().findField("auth_conn").validate();this.noInterCrt=e.items.no_inter_cert;this.LayoutUpdate(e.items.serv_enable,e.items.user_conf);if(e.items.serv_enable&&!e.items.serv_run){this.getForm().findField("msg_enable_fail").show();if(e.items.no_inter_cert){this.getForm().findField("err_cert_no_intermediate").show()}}else{this.getForm().findField("msg_enable_fail").hide();this.getForm().findField("err_cert_no_intermediate").hide()}var g=SYNO.API.Response.GetValByAPI(c,"SYNO.Core.Certificate.CRT","list");var h=SYNO.API.Response.GetValByAPI(c,"SYNO.Core.Region.NTP","get","timestamp");if(Array.isArray(g.certificates)&&h){var i=g.certificates.find(function(l){return Array.isArray(l.services)&&l.services.find(function(m){return m.service==="OpenVPN"&&m.subscriber==="VPNCenter"})});if(i&&i.valid_from&&i.valid_till){var f=new Date(i.valid_from).getTime()/1000;var k=new Date(i.valid_till).getTime()/1000;if(h<=f||h>=k){this.getForm().findField("msg_cert_expired").show()}else{this.getForm().findField("msg_cert_expired").hide()}}}this.doLayout()}else{this.owner.getMsgBox().alert(_V("openvpn","openvpn"),_T("common","error_system"))}},loadForm:function(){this.sendWebAPI({compound:{stopwhenerror:true,params:[{api:"SYNO.VPNServer.Settings.Config",version:1,method:"load",params:{serv_type:"openvpn"}},{api:"SYNO.Core.Certificate.CRT",version:1,method:"list"},{api:"SYNO.Core.Region.NTP",version:2,method:"get"}]},callback:this.loadFormDone,scope:this})},sendAddPrefixWebAPI:function(a){this.sendWebAPI({api:"SYNO.Core.Network.IPv6.Router.Prefix",version:1,method:"add",params:{ifname:"ovpn",prefix:a},callback:function(e,c,d,b){if(e){this.getForm().findField("msg_prefix_not_match").hide()}},scope:this})},sendRemovePrefixWebAPI:function(a,b){this.sendWebAPI({api:"SYNO.Core.Network.IPv6.Router.Prefix",version:1,method:"remove",params:{ifname:"ovpn",prefix:a},callback:function(f,d,e,c){if(f){this.getForm().findField("msg_prefix_not_match").hide()}if(""!==b){this.sendAddPrefixWebAPI(b)}},scope:this})},syncIPv6Prefix:function(b,d,a,c){if(!b&&d){this.sendAddPrefixWebAPI(c)}else{if(b&&!d){this.sendRemovePrefixWebAPI(a)}else{if(b&&d){this.sendRemovePrefixWebAPI(a,c)}}}},applyFormDone:function(g,a,f,d){this.clearStatusBusy();if(g){if(a.serv_enable&&!a.serv_run){this.getForm().findField("msg_enable_fail").show();this.owner.getMsgBox().alert(_V("openvpn","openvpn"),_V("msg","err_openvpn_svr_enable_failed"))}else{if(a.serv_enable&&a.serv_run){this.getForm().findField("msg_enable_fail").hide();this.setStatusOK();var c=this.getForm().findField("port");var b=this.getForm().findField("protocol");if((!this.OriSetting.serv_enable&&this.TmpSetting.serv_enable)||c.isDirty()||b.isDirty()){var e=_V("msg","info_firewall_portforward");e=e.replace("_PRTL_",("udp"===this.getForm().findField("protocol").getValue())?"UDP":"TCP");e=e.replace("_PORT_",this.getForm().findField("port").getValue());this.owner.getMsgBox().alert(_V("openvpn","openvpn"),e,function(){if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}this.checkEncryption()},this)}else{if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}this.checkEncryption()}}}this.syncIPv6Prefix(this.OriSetting.enable_ipv6_server,this.TmpSetting.enable_ipv6_server,this.OriSetting.ipv6_prefix,this.TmpSetting.ipv6_prefix);this.OriSetting=this.TmpSetting;this.getForm().setValues(this.OriSetting);Ext.getCmp(this.BtnCerExpId).setDisabled(!this.TmpSetting.serv_enable);this.LayoutUpdate(a.serv_enable,a.user_conf)}else{if(1000===a.code){this.owner.getMsgBox().alert(_V("openvpn","openvpn"),_V("msg","err_ip_conflict"))}else{if(1002===a.code){this.owner.getMsgBox().alert(_V("openvpn","openvpn"),_V("msg","err_vpnc_conflict"))}else{if(1003===a.code){this.setStatusError({text:_V("msg","err_openvpn_port_conflict"),clear:true});this.getForm().findField("port").markInvalid(_V("msg","err_openvpn_port_conflict"))}else{this.owner.getMsgBox().alert(_V("openvpn","openvpn"),_T("common","error_system"))}}}if(this.confirmLostChangeReject){this.confirmLostChangeReject()}}},checkEncryption:function(){var a=this.getForm().findField("encryption").getValue();if("CHACHA20-POLY1305"===a){this.owner.getMsgBox().alert(_V("openvpn","openvpn"),String.format(_V("openvpn","openvpn_enc_version_alert_msg"),"2.5"))}else{if("AES-256-GCM"===a||"AES-192-GCM"===a||"AES-128-GCM"===a){this.owner.getMsgBox().alert(_V("openvpn","openvpn"),String.format(_V("openvpn","openvpn_enc_version_alert_msg"),"2.4"))}}},applyForm:function(){this.setStatusBusy({text:_T("common","saving")});var b=this.getForm();var a=b.findField("serv_ip_1").getValue();var r=b.findField("serv_ip_2").getValue();var q=b.findField("serv_ip_3").getValue();var f=b.findField("serv_enable").getValue();var m=b.findField("comp_enable").getValue();var s=b.findField("push_route_enable").getValue();var o=b.findField("tls_auth_key").getValue();var g=b.findField("verify_server_cn").getValue();var l=b.findField("auth_conn").getValue();var d=b.findField("port").getValue();var h=b.findField("protocol").getValue();var j=b.findField("encryption").getValue();var e=b.findField("authentication").getValue();var i=b.findField("serv_range").getValue();var k=b.findField("enable_ipv6_server").getValue();var p=b.findField("ipv6_prefix").getValue();var n=b.findField("mssfix_value").getValue();var c={serv_type:"openvpn",serv_enable:f,serv_ip:a+"."+r+"."+q+".0",serv_range:i,comp_enable:m,push_route_enable:s,tls_auth_key:o,verify_server_cn:g,auth_conn:l,port:d,protocol:h,encryption:j,authentication:e,enable_ipv6_server:k,ipv6_prefix:p,mssfix_value:n};this.TmpSetting={serv_enable:f,serv_ip_1:a,serv_ip_2:r,serv_ip_3:q,serv_range:i,comp_enable:m,push_route_enable:s,tls_auth_key:o,verify_server_cn:g,auth_conn:l,port:d,protocol:h,encryption:j,authentication:e,enable_ipv6_server:k,ipv6_prefix:p,mssfix_value:n};this.sendWebAPI({api:"SYNO.VPNServer.Settings.Config",version:1,method:"apply",params:c,callback:this.applyFormDone,scope:this})},exportCert:function(){this.downloadWebAPI({webapi:{api:"SYNO.VPNServer.Settings.Certificate",version:1,method:"export"},scope:this})},onPageActivate:function(){this.setStatusBusy();if(Ext.isDefined(SYNO.API.GetKnownAPI("SYNO.Core.Network.IPv6.Router.Prefix"))){this.sendWebAPI({api:"SYNO.Core.Network.IPv6.Router.Prefix",version:1,method:"list",callback:function(e,c,d,a){var b=[];Ext.each(c.prefix,function(f){if(""===f.lan||"ovpn"===f.lan){b.push([f.prefix,f.prefix+"("+SYNO.SDS.Utils.Network.idToString.apply(this,[f.wan])+")"])}},this);this.prefixStore.loadData(b);this.loadForm()},scope:this})}else{this.getForm().findField("enable_ipv6_server").hide();this.getForm().findField("ipv6_prefix").hide();this.loadForm()}this.getForm().findField("serv_ip").doLayout();this.doLayout()},getIPString:function(){var c=this.getForm();var b=c.findField("serv_ip_1").getValue();var a=c.findField("serv_ip_2").getValue();var d=c.findField("serv_ip_3").getValue();return b+"."+a+"."+d+".0"},checkDirty:function(){if(this.getForm().isDirty()){return true}return false},onSave:function(){if(!this.checkDirty()){this.setStatusError({text:_T("error","nochange_subject"),clear:true});return}if(this.noInterCrt){this.owner.getMsgBox().alert("",String.format(_V("openvpn","err_cert_no_intermediate"),_V("openvpn","openvpn")));return false}if(!this.getForm().findField("serv_enable").getValue()){this.applyForm();return}if(!SYNO.SDS.VPN.PrivateAddressCheck(this.getIPString())){var c=_V("msg","err_invalid_private_ip");this.getForm().findField("serv_ip_1").markInvalid(c);this.getForm().findField("serv_ip_2").markInvalid(c);this.getForm().findField("serv_ip_3").markInvalid(c);this.setStatusError({text:c,clear:true});return}if(!this.getForm().isValid()){this.setStatusError({text:_T("common","forminvalid"),clear:true});return}var a=this.getForm().findField("port").getValue();var b=this.getForm().findField("protocol").getValue();if((this.getForm().findField("port").isDirty()||this.getForm().findField("protocol").isDirty())&&443===a&&"tcp"===b){this.owner.getMsgBox().confirm("",_V("openvpn","info_port_443"),function(d){if("yes"===d){this.applyForm()}},this)}else{this.applyForm()}},onCancel:function(){this.getForm().setValues(this.OriSetting)},onExportCert:function(){this.exportCert()},onPageConfirmLostChangeSave:function(){return new Promise(function(b,a){this.onSave();this.confirmLostChangeResolve=b;this.confirmLostChangeReject=a}.bind(this))}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelConn=Ext.extend(SYNO.ux.GridPanel,{constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelConn.superclass.constructor.call(this,b)},fillConfig:function(g){this.owner=g.appWin;this.pageSize=50;var d=[{id:"user",header:_V("common","field_username"),dataIndex:"user"},{id:"ipfrom",header:_V("common","field_clientip"),dataIndex:"ip_from"},{id:"ipas",header:_V("common","field_vpnip"),dataIndex:"ip_as"},{id:"protocol",header:_V("common","field_protocol"),dataIndex:"prtltype",renderer:SYNO.SDS.VPN.RenderPrtlType},{id:"time",header:_V("common","field_uptime"),dataIndex:"login_time",renderer:SYNO.SDS.VPN.RenderUpTime}];var i=new Ext.grid.ColumnModel({columns:d,defaults:{sortable:true,menuDisabled:true}});var b=this.createStore();var f=new Ext.Toolbar();f.add({xtype:"syno_button",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",itemId:"btnDisconnect",id:this.btnDisconnectId=Ext.id(),text:_V("conn","btn_disconn"),handler:this.onDisconnect,scope:this});var e=new SYNO.ux.PagingToolbar({store:b,pageSize:this.pageSize,displayInfo:true});var c=new Ext.grid.RowSelectionModel({singleSelect:true});var h=function(m,k,j,l){this.setBtnState()};c.on("rowselect",h,this);c.on("rowdeselect",h,this);var a={itemId:"connection",tbar:f,stripeRows:true,cls:"without-dirty-red-grid",enableColLock:false,enableHdMenu:false,enableColumnMove:false,colModel:i,ds:b,sm:c,autoExpandColumn:"time",loadMask:true,bbar:e};Ext.apply(a,g);return a},createStore:function(){var a=["id","user","ip_from","ip_as","prtltype","login_time"];var b=new Ext.data.Store({pruneModifiedRecords:true,autoLoad:false,proxy:new SYNO.API.Proxy({api:"SYNO.VPNServer.Management.Connection",method:"enum",version:1}),reader:new Ext.data.JsonReader({root:"items",totalProperty:"total",id:"id"},a),sortInfo:{field:"login_time",direction:"DESC"},baseParams:{start:0,limit:this.pageSize,sort:"login_time",dir:"DESC"},remoteSort:true});this.addManagedComponent(b);return b},applyDisconnectDone:function(d,a,c,b){this.owner.clearStatusBusy();if(d){this.refreshList()}else{this.owner.getMsgBox().alert(_V("conn","connection"),_T("common","error_system"))}},applyDisconnect:function(){this.owner.setStatusBusy();var a=this.getSelectionModel().getSelected();var b={};b={id:a.get("id"),user:a.get("user"),prtltype:a.get("prtltype"),ip_from:a.get("ip_from"),ip_as:a.get("ip_as")};this.sendWebAPI({api:"SYNO.VPNServer.Management.Connection",version:1,method:"kick",params:b,callback:this.applyDisconnectDone,scope:this})},onPageActivate:function(){this.refreshList()},onDisconnect:function(){if(undefined===this.getSelectionModel().getSelected()){this.owner.getMsgBox().alert(_V("conn","connection"),_V("msg","warn_select_conn"));return}var a={yes:{text:_V("conn","btn_disconn"),btnStyle:"red"},no:{text:_T("common","no")}};this.owner.getMsgBox().confirmDelete(_V("conn","connection"),_V("msg","warn_kick_user"),function(b){if("yes"===b){this.applyDisconnect()}},this,a)},refreshList:function(){var a=function(b,c,d){if(!d){return}this.setBtnState()};this.getStore().load({scope:this,callback:a})},setBtnState:function(){var a=this.getSelectionModel();var b=Ext.getCmp(this.btnDisconnectId);b.setDisabled(!a.hasSelection())}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.PAGE_ITEM_LIMIT=50;SYNO.SDS.VPN.USERNAME_COL_WIDTH=200;SYNO.SDS.VPN.STATUS_COL_WIDTH=120;SYNO.SDS.VPN.VPNPanelPrivGridView=Ext.extend(SYNO.ux.GridPanel,{constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelPrivGridView.superclass.constructor.call(this,b)},fillConfig:function(h){this.owner=h.appWin;this.pageSize=SYNO.SDS.VPN.PAGE_ITEM_LIMIT;var k=new SYNO.ux.EnableColumn({header:_V("pptp","pptp"),dataIndex:"enable_pptp",align:"center"});var g=new SYNO.ux.EnableColumn({header:_V("l2tp","l2tp"),dataIndex:"enable_l2tp",align:"center"});var l=new SYNO.ux.EnableColumn({header:_V("openvpn","openvpn"),dataIndex:"enable_ovpn",align:"center"});var d=[{id:"username",header:_V("common","field_username"),dataIndex:"username",fixed:true,width:SYNO.SDS.VPN.USERNAME_COL_WIDTH,renderer:SYNO.SDS.VPN.RenderUserName},{id:"status",header:_V("privilege","user_status"),dataIndex:"status",fixed:true,width:SYNO.SDS.VPN.STATUS_COL_WIDTH,renderer:SYNO.SDS.VPN.RenderUserStatus},k,l];if(_D("support_ipsec")==="yes"){d.push(g)}var j=new Ext.grid.ColumnModel({columns:d});var b=this.createStore();var c=new SYNO.ux.TextFilter({itemId:"search",emptyText:_V("privilege","search_user"),store:b,pageSize:this.pageSize});var f=new SYNO.ux.Toolbar();f.addClass("synovpn-priv-toolbar");f.add("->");f.add(c);var e=new SYNO.ux.PagingToolbar({store:b,pageSize:this.pageSize,displayInfo:true});var i=[k,l];if(_D("support_ipsec")==="yes"){i.push(g)}var a={itemId:"privilege",tbar:f,stripeRows:true,enableColLock:false,enableHdMenu:false,enableColumnMove:false,colModel:j,ds:b,plugins:i,colPPTP:k,colL2TP:g,colOVPN:l,autoExpandColumn:"username",loadMask:true,bbar:e};Ext.apply(a,h);return a},createStore:function(){var a=["username","status","enable_pptp","enable_ovpn"];if(_D("support_ipsec")==="yes"){a.push("enable_l2tp")}var b=new Ext.data.Store({pruneModifiedRecords:true,autoLoad:false,proxy:new SYNO.API.Proxy({api:"SYNO.VPNServer.Management.Account",method:"load",version:1}),reader:new Ext.data.JsonReader({root:"items",totalProperty:"total",id:"username"},a),baseParams:{start:0,limit:SYNO.SDS.VPN.PAGE_ITEM_LIMIT}});this.addManagedComponent(b);return b},onPageActivate:function(){this.getStore().load()},applyGridDone:function(b,c,a){this.owner.clearStatusBusy();if(this.ownerCt.confirmLostChangeResolve){this.ownerCt.confirmLostChangeResolve()}else{this.getStore().load()}},applyGrid:function(){this.owner.setStatusBusy();var a=[];Ext.each(this.getStore().getModifiedRecords(),function(b){a.push({name:b.data.username,enable_pptp:b.data.enable_pptp,enable_l2tp:b.data.enable_l2tp,enable_ovpn:b.data.enable_ovpn})});this.sendWebAPI({api:"SYNO.VPNServer.Management.Account",version:1,method:"apply",params:{priv:a},callback:this.applyGridDone,scope:this})},onPageDeactivate:function(){return(!this.checkDirty())},checkDirty:function(){if(0===this.getStore().getModifiedRecords().length){return false}return true},onSave:function(){if(!this.checkDirty()){this.ownerCt.setStatusError({text:_T("error","nochange_subject"),clear:true});return}this.applyGrid()}});SYNO.SDS.VPN.VPNPanelPriv=Ext.extend(SYNO.SDS.Utils.FormPanel,{constructor:function(b){this.gridview=new SYNO.SDS.VPN.VPNPanelPrivGridView(b);var a=this.fillConfig(b);SYNO.SDS.VPN.VPNPanelPriv.superclass.constructor.call(this,a)},fillConfig:function(b){var c=[{xtype:"syno_button",btnStyle:"grey",text:_T("common","reset"),scope:this,handler:this.onResetBtn},{xtype:"syno_button",btnStyle:"blue",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",text:_T("common","commit"),scope:this,handler:this.onApplyBtn}];var a=Ext.apply({cls:"synovpn-panel",layout:"fit",items:[this.gridview],buttons:c},b);return a},onPageActivate:function(){this.gridview.onPageActivate()},onPageDeactivate:function(){return this.gridview.onPageDeactivate()},onApplyBtn:function(){this.gridview.onSave()},onResetBtn:function(){this.gridview.getStore().load()},onPageConfirmLostChangeSave:function(){return new Promise(function(b,a){this.gridview.onSave();this.confirmLostChangeResolve=b;this.confirmLostChangeReject=a}.bind(this))}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelLog=Ext.extend(SYNO.ux.GridPanel,{constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelLog.superclass.constructor.call(this,b)},fillConfig:function(g){this.owner=g.appWin;this.pageSize=50;var d=[{id:"time",header:_V("log","field_datetime"),dataIndex:"time",width:150,renderer:function(j){return SYNO.SDS.DateTimeFormatter(new Date(j*1000))}},{id:"prtltype",header:_V("common","field_protocol"),dataIndex:"prtltype",width:80,renderer:SYNO.SDS.VPN.RenderPrtlType},{id:"user",header:_V("common","field_username"),dataIndex:"user",width:80},{id:"event",header:_V("log","field_event"),dataIndex:"event",width:300,renderer:SYNO.SDS.VPN.RenderLogContent}];var i=new Ext.grid.ColumnModel({columns:d});var c=this.createStore();var f=new Ext.Toolbar();f.add({xtype:"syno_button",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",itemId:"btnClear",text:_V("log","btn_clear"),handler:this.onClear,scope:this});f.add({xtype:"syno_button",disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",itemId:"btnExport",text:_V("log","btn_export"),handler:this.onExport,scope:this});f.add("->");var h=[[SYNO.SDS.VPN.ALL,_V("common","all")],[SYNO.SDS.VPN.PPTP,_V("pptp","pptp")],[SYNO.SDS.VPN.OPENVPN,_V("openvpn","openvpn")]];if(_D("support_ipsec")==="yes"){h.push([SYNO.SDS.VPN.L2TP,_V("l2tp","l2tp")])}var b=new SYNO.ux.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:h}),itemId:"cbxPrtl",name:"cbxPrtl",lazyRender:true,mode:"local",displayField:"display",valueField:"value",triggerAction:"all",editable:false,value:SYNO.SDS.VPN.ALL,listeners:{scope:this,select:this.onLogFilterSelect}});f.add(b);var e=new SYNO.ux.PagingToolbar({store:c,pageSize:this.pageSize,displayInfo:true});var a={itemId:"log",tbar:f,stripeRows:true,cls:"without-dirty-red-grid",enableColLock:false,enableHdMenu:false,enableColumnMove:false,colModel:i,ds:c,autoExpandColumn:"event",loadMask:true,bbar:e};Ext.apply(a,g);return a},createStore:function(){var a=["level","time","user","event","prtltype","id"];var b=new Ext.data.Store({pruneModifiedRecords:true,autoLoad:false,proxy:new SYNO.API.Proxy({api:"SYNO.VPNServer.Management.Log",method:"load",version:1}),reader:new Ext.data.JsonReader({root:"items",totalProperty:"total",id:"id"},a),baseParams:{start:0,limit:this.pageSize,prtltype:SYNO.SDS.VPN.ALL}});this.addManagedComponent(b);return b},applyClearDone:function(d,a,c,b){this.owner.clearStatusBusy();if(d){this.getStore().load()}else{this.owner.getMsgBox().alert(_V("log","log"),_T("common","error_system"))}},applyClear:function(){var a={yes:{text:_T("common","clean"),btnStyle:"red"},no:{text:_T("common","cancel")}};this.owner.getMsgBox().confirmDelete(_V("log","log"),_T("log","log_cfrm_clear"),function(b){if("yes"===b){this.owner.setStatusBusy();this.sendWebAPI({api:"SYNO.VPNServer.Management.Log",version:1,method:"clear",callback:this.applyClearDone,scope:this})}},this,a)},onLogFilterSelect:function(){var a=this.getTopToolbar().getComponent("cbxPrtl").getValue();this.getStore().baseParams.prtltype=a;this.getStore().load()},applyExport:function(){this.downloadWebAPI({webapi:{api:"SYNO.VPNServer.Management.Log",version:1,method:"export"},scope:this})},onPageActivate:function(){this.getStore().load()},onClear:function(){this.applyClear()},onExport:function(){this.applyExport()}});Ext.define("SYNO.SDS.VPN.Instance",{extend:"SYNO.SDS.AppInstance",appWindowName:"SYNO.SDS.VPN.VPNMainWindow"});Ext.define("SYNO.SDS.VPN.VPNMainWindow",{extend:"SYNO.SDS.PageListAppWindow",activePage:"SYNO.SDS.VPN.VPNPanelStatus",constructor:function(a){var b=[{text:_V("status","overview"),iconCls:"vpn-icon-overview",fn:"SYNO.SDS.VPN.VPNPanelStatus"},{text:_V("conn","connection"),iconCls:"vpn-icon-connection",fn:"SYNO.SDS.VPN.VPNPanelConn"},{text:_V("log","log"),iconCls:"vpn-icon-log",fn:"SYNO.SDS.VPN.VPNPanelLog"},{text:_V("general","general_settings"),iconCls:"vpn-icon-general",fn:"SYNO.SDS.VPN.VPNPanelGeneral"},{text:_V("privilege","privilege"),iconCls:"vpn-icon-privilege",fn:"SYNO.SDS.VPN.VPNPanelPriv"}];var c=[{text:_V("pptp","pptp"),iconCls:"vpn-icon-pptp",fn:"SYNO.SDS.VPN.VPNPanelPPTP"},{text:_V("openvpn","openvpn"),iconCls:"vpn-icon-openvpn",fn:"SYNO.SDS.VPN.VPNPanelOpenVPN"}];if(_D("support_ipsec")==="yes"){c.push({text:_V("l2tp","l2tp"),iconCls:"vpn-icon-l2tp",fn:"SYNO.SDS.VPN.VPNPanelL2TP"})}return this.callParent([Ext.apply({cls:"syno-vpn-list",minHeight:560,minWidth:1000,defaultCollapsible:false,width:1000,height:560,listItems:[{text:_V("app","management"),items:b},{text:_V("app","settings"),items:c}]},a)])},onClose:function(){if(false===SYNO.SDS.VPN.VPNMainWindow.superclass.onClose.apply(this,arguments)){return false}if(this.activePage.checkDirty&&this.activePage.checkDirty()){this.getMsgBox().confirm(_V("app","app_name"),_T("common","confirm_lostchange"),function(a){if("yes"===a){this.doClose()}},this);return false}return true}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.VPNPanelGeneral=Ext.extend(SYNO.SDS.Utils.FormPanel,{InterfaceStore:null,AccountTypeStore:null,OriSetting:undefined,TmpSetting:undefined,BtnApplyId:undefined,BtnCancelId:undefined,constructor:function(a){var b=this.fillConfig(a);SYNO.SDS.VPN.VPNPanelGeneral.superclass.constructor.call(this,b)},fillConfig:function(a){this.EmptyField={synotype:"desc",value:""};this.owner=a.appWin;this.InterfaceStore=new Ext.data.SimpleStore({id:"dsInterface",fields:["value","display"],data:[]});this.AccountTypeStore=new Ext.data.ArrayStore({fields:["type","name","key","display","valid"]});var b={cls:"synovpn-panel",labelAlign:"left",border:false,itemId:"general",trackResetOnLoad:true,items:[{xtype:"syno_fieldset",title:_V("general","general_settings"),autoHeight:false,width:"570",height:"400",items:[{xtype:"syno_combobox",fieldLabel:_V("general","cbx_interface"),labelWidth:SYNO.SDS.VPN.FORM_GEN_LABELWIDTH,hiddenName:"interface",name:"interface",editable:false,store:this.InterfaceStore,forceSelection:true,allowBlank:false,displayField:"display",valueField:"value",typeAhead:true,triggerAction:"all",lazyRender:true,width:SYNO.SDS.VPN.FORM_TEXTWIDTH,tpl:'<tpl for="."><div ext:qtip="{display}" class="x-combo-list-item">{display}</div></tpl>'},{xtype:"syno_displayfield",name:"ifdown",hidden:true,htmlEncode:false,value:'<element class="red-status">'+_V("msg","warn_interface_down")+"</>"},{xtype:"syno_combobox",fieldLabel:_V("general","account_type"),labelWidth:SYNO.SDS.VPN.FORM_GEN_LABELWIDTH,hiddenName:"account_type",name:"account_type",editable:false,store:this.AccountTypeStore,forceSelection:true,allowBlank:false,displayField:"display",valueField:"key",typeAhead:true,triggerAction:"all",lazyRender:true,width:SYNO.SDS.VPN.FORM_TEXTWIDTH,listeners:{scope:this,select:this.onTypeSelect}},{xtype:"syno_checkbox",boxLabel:_V("general","chk_privilege_enable"),name:"privilege_enable"}]},{xtype:"syno_fieldset",title:_T("tree","leaf_autoblock"),items:[{xtype:"syno_displayfield",name:"autoblock_status",htmlEncode:false,cls:"synovpn-ellipsis-text",fieldLabel:_T("tree","leaf_autoblock"),listeners:{afterrender:{single:true,fn:function(c){c.getEl().dom.qtip=_V("general","autoblock_link").replace("_AUTOBLOCK_",_T("tree","leaf_autoblock"))}}}}]}],buttons:[{text:_T("common","reset"),itemId:"cancel",ctCls:"syno-sds-cp-btn",scope:this,id:this.BtnCancelId=Ext.id(),xtype:"syno_button",handler:this.onCancel},{disabled:_S("demo_mode"),tooltip:_S("demo_mode")?_JSLIBSTR("uicommon","error_demo"):"",text:_T("common","commit"),itemId:"apply",ctCls:"syno-sds-cp-btn",scope:this,id:this.BtnApplyId=Ext.id(),btnStyle:"blue",xtype:"syno_button",handler:this.onSave}]};b=this.addStatusBar(b);SYNO.LayoutConfig.fill(b);Ext.apply(b,a);return b},onTypeSelect:function(c,a,b){if(false===a.get("valid")){c.markInvalid(_TT("SYNO.SDS.MAILSERVER.Instance","error","domain_unavaiable"))}},addStatusBar:function(a){var b={xtype:"statusbar",hideMode:"visibility",defaultText:" ",statusAlign:"left",buttonAlign:"left",items:[]};if(a.buttons){b.items=b.items.concat(a.buttons);delete a.buttons}Ext.applyIf(a,{fbar:b});return a},MarkColor:function(b,a){return'<element class="'+a+'">'+b+"</>"},markAutoBlockStatus:function(b,c){var a;var d;if(b){a=this.MarkColor(_V("common","enable"),"blue-status")}else{a=this.MarkColor(_V("common","disable"),"disable-font")}d=' (<a class="link-font" style="cursor: pointer;" id="'+c+'">'+_V("general","autoblock_link").replace("_AUTOBLOCK_",_T("tree","leaf_autoblock"))+"</a>)";return a+d},callAutoBlock:function(){SYNO.SDS.AppLaunch("SYNO.SDS.AdminCenter.Application",{fn:"SYNO.SDS.AdminCenter.Security.Main",tab:"AccountTab"})},genTypeComboItem:function(c,a,d){var b=c+"_"+a;var e=_T("share","share_local_user");if("ad"==c){e=_T("share","share_domain_user")+" ("+a+")"}else{if("ldap"==c){e=_T("share","ldap_user")+" ("+a+")"}}return[c,a,b,e,d]},getVPNInterfaceAPI:function(){var a={get:{api:"SYNO.VPNServer.Management.Interface",method:"load",version:1},postReturnData:function(g){var f=[];for(var d=0;d<g.items.length;d++){if("yes"===this._D("support_oob_ctl")&&g.items[d].name===this._D("oob_interface")){g.items[d].ip=String.format("{0} ({1})",_T("oob","oob_tab_label"),g.items[d].ip)}else{g.items[d].ip=String.format("{0} ({1})",SYNO.SDS.Utils.Network.idToString(g.items[d].name),g.items[d].ip)}f.push([g.items[d].name,g.items[d].ip])}this.InterfaceStore.loadData(f,false);var j=[];var c=false;for(d=0;d<g.acc_items.length;d++){if(g.acc_items[d].type==g.account_type&&g.acc_items[d].name==g.acc_domain_name){c=true}j.push(this.genTypeComboItem(g.acc_items[d].type,g.acc_items[d].name,true))}if(!c){j.push(this.genTypeComboItem(g.account_type,g.acc_domain_name,false))}this.AccountTypeStore.loadData(j);var b=g.account_type+"_"+g.acc_domain_name;var e=g.items.some(function(i){if(i.name===g.vpninterface){return true}return false});if(!e){g.vpninterface=SYNO.SDS.Utils.Network.idToString(g.vpninterface)}this.OriSetting={"interface":g.vpninterface,account_type:b,privilege_enable:g.privilege_enable};this.getForm().setValues(this.OriSetting);if(!c){var h=this.getForm().findField("account_type");h.markInvalid(_V("msg","warn_domain_unavaiable"))}if(g.ifdown){this.getForm().findField("ifdown").show();this.getForm().findField("interface").markInvalid(_V("msg","warn_interface_down"))}else{this.getForm().findField("ifdown").hide()}}};return a},getAutoBlockAPI:function(){var a={get:{api:"SYNO.Core.Security.AutoBlock",method:"get",version:1},postReturnData:function(d){var c=Ext.id();var e=this.getForm().findField("autoblock_status");var b=this.markAutoBlockStatus(d.enable,c);e.setValue(b);Ext.get(c).addListener("click",this.callAutoBlock,this);e.originalValue=e.getValue()}};return a},loadForm:function(){var b=[this.getVPNInterfaceAPI(),this.getAutoBlockAPI()];var c=[];for(var a=0;a<b.length;a++){c.push(b[a].get)}this.owner.setStatusBusy();this.sendWebAPI({scope:this,compound:{stopwhenerror:false,params:c},callback:function(g,d,f,e){this.owner.clearStatusBusy();if(g){Ext.each(d.result,function(j,i,h){if(!j.success){SYNO.Debug("Failed on "+j.api+" "+j.method);return}b[i].postReturnData.apply(this,[j.data])},this)}else{this.owner.getMsgBox().alert(_V("general","general_settings"),_T("common","error_system"))}}})},applyFormDone:function(d,a,c,b){this.owner.clearStatusBusy();if(d){this.setStatusOK();this.OriSetting=this.TmpSetting;this.getForm().setValues(this.OriSetting);if(a.ifdown){this.getForm().findField("ifdown").show();this.getForm().findField("interface").markInvalid(_V("msg","warn_interface_down"))}else{this.getForm().findField("ifdown").hide()}if(this.confirmLostChangeResolve){this.confirmLostChangeResolve()}else{this.loadForm()}}else{this.owner.getMsgBox().alert(_V("general","general_settings"),_T("common","error_system"));if(this.confirmLostChangeReject){this.confirmLostChangeReject()}}},applyForm:function(){this.owner.setStatusBusy({text:_T("common","saving")});var d=this.getForm();var b=d.findField("interface").getValue();var g=d.findField("account_type").getValue();var a=this.AccountTypeStore.find("key",g);var f=this.AccountTypeStore.getAt(a).get("type");var e=this.AccountTypeStore.getAt(a).get("name");var c=this.AccountTypeStore.getAt(a).get("key");this.TmpSetting={account_type:c,"interface":b,privilege_enable:d.findField("privilege_enable").getValue()};this.auth_type=f;this.sendWebAPI({api:"SYNO.VPNServer.Management.Interface",version:1,method:"apply",params:{auth_type:f,domain_name:e,interface_card:b,privilege_enable:d.findField("privilege_enable").getValue()},callback:this.applyFormDone,scope:this})},onPageActivate:function(){this.loadForm();this.doLayout()},checkDirty:function(){if(this.getForm().isDirty()){return true}return false},onSave:function(){if(!this.checkDirty()){this.setStatusError({text:_T("error","nochange_subject"),clear:true});return}if(!this.getForm().isValid()){this.setStatusError({text:_T("common","forminvalid"),clear:true});return}this.applyForm()},onCancel:function(){this.getForm().setValues(this.OriSetting)},onPageConfirmLostChangeSave:function(){return new Promise(function(b,a){this.onSave();this.confirmLostChangeResolve=b;this.confirmLostChangeReject=a}.bind(this))}});Ext.ns("SYNO.SDS.VPN");SYNO.SDS.VPN.ALL=0;SYNO.SDS.VPN.PPTP=1;SYNO.SDS.VPN.L2TP=2;SYNO.SDS.VPN.OPENVPN=3;SYNO.SDS.VPN.AUTH_TYPE_PAP=0;SYNO.SDS.VPN.AUTH_TYPE_CHAP=1;SYNO.SDS.VPN.AUTH_TYPE_MSCHAP=2;SYNO.SDS.VPN.MPPE_TYPE_NO=0;SYNO.SDS.VPN.MPPE_TYPE_OPT=1;SYNO.SDS.VPN.MPPE_TYPE_REQ=2;SYNO.SDS.VPN.TREENODE_MANAGEMENT=0;SYNO.SDS.VPN.TREENODE_STATUS=1;SYNO.SDS.VPN.TREENODE_CONNECTION=2;SYNO.SDS.VPN.TREENODE_LOG=3;SYNO.SDS.VPN.TREENODE_GENERAL=4;SYNO.SDS.VPN.TREENODE_SETTINGS=5;SYNO.SDS.VPN.TREENODE_PPTP=6;SYNO.SDS.VPN.TREENODE_OPENVPN=7;SYNO.SDS.VPN.PPTP_PORT=1723;SYNO.SDS.VPN.WID_WIDTH=820;if(_D("support_ipsec")==="yes"){SYNO.SDS.VPN.DEFAULT_HEIGHT=500}else{SYNO.SDS.VPN.DEFAULT_HEIGHT=450}SYNO.SDS.VPN.GRID_HEIGHT=500;SYNO.SDS.VPN.FORM_HEIGHT=400;SYNO.SDS.VPN.L2TP_FORM_HEIGHT=450;SYNO.SDS.VPN.LIST_WIDTH=190;SYNO.SDS.VPN.CARD_WIDTH=500;SYNO.SDS.VPN.FORM_GEN_LABELWIDTH=160;SYNO.SDS.VPN.FORM_LABELWIDTH=330;SYNO.SDS.VPN.FORM_TEXTWIDTH=200;SYNO.SDS.VPN.FORM_LABELWIDTH_WITH_CHECK=324;SYNO.SDS.VPN.FORM_IPWIDTH=46;SYNO.SDS.VPN.FORM_MTUWIDTH=54;SYNO.SDS.VPN.CONN_MAX_LIMIT=60;var _V=function(b,a){if(SYNO.SDS.isNVR&&(("info_firewall_portforward"===a)||("info_vpn_auth"===a))){return _TT("SYNO.SDS.VPN.Instance",b,a.concat("_northstarplus"))}return _TT("SYNO.SDS.VPN.Instance",b,a)};SYNO.SDS.VPN.USER_STATUS_TABLE=[["0","disable-font","user_disabled"],["1","blue-status","user_normal"],["2","red-status","user_disabled"],["3","disable-font","user_unsupported"]];SYNO.SDS.VPN.RenderUserName=function(b,a){var c="<font>"+b+"</font>";if(null!==a){a.attr='ext:qtip="'+Ext.util.Format.htmlEncode(c)+'"'}return c};SYNO.SDS.VPN.RenderUserStatus=function(f,e){var d=SYNO.SDS.VPN.USER_STATUS_TABLE;var a;for(a=0;a<d.length;a++){if(d[a][0]==f){break}}var b=_V("privilege",d[a][2]);var c='<element class="'+d[a][1]+'">'+b+"</>";if(null!==e){e.attr='ext:qtip="'+Ext.util.Format.htmlEncode(b)+'"'}return c};SYNO.SDS.VPN.PrintFakePass=function(a){if("$$$$$$$$"==a){return'<font color="red">Wrong Password</font>'}else{if("@@@@@@@@"==a){return""}else{if("********"==a){return"********"}else{return"Modified"}}}};SYNO.SDS.VPN.RenderPrtlType=function(a){if(SYNO.SDS.VPN.PPTP==parseInt(a,10)){return _V("pptp","pptp")}else{if(SYNO.SDS.VPN.L2TP==parseInt(a,10)){return _V("l2tp","l2tp")}else{if(SYNO.SDS.VPN.OPENVPN==parseInt(a,10)){return _V("openvpn","openvpn")}else{if(SYNO.SDS.VPN.ALL==parseInt(a,10)){return"SYSTEM"}}}}return _V("common","unknown")};SYNO.SDS.VPN.RenderLogContent=function(b,a){if(null!==a){a.attr='ext:qtip="'+b+'"'}return b};SYNO.SDS.VPN.RenderUpTime=function(e){e=Number(e);if(0>e){return"N/A"}var c=Math.floor(e/3600);var a=Math.floor(e%3600/60);var b=Math.floor(e%3600%60);return((c>0?c+":":"")+(a>0?(c>0&&a<10?"0":"")+a+":":"0:")+(b<10?"0":"")+b)};SYNO.SDS.VPN.ValidIpRange=function(a){if(a<0||a>255){return false}return true};Ext.form.VTypes.ipfieldText=_JSLIBSTR("vtype","bad_field");Ext.form.VTypes.ipfieldMask=/[0-9]/;Ext.form.VTypes.ipfieldVal=/[^0-9]/;Ext.form.VTypes.ipfield=function(a){if(a.length>3||Ext.form.VTypes.ipfieldVal.test(a)||!SYNO.SDS.VPN.ValidIpRange(a)){return false}return true};SYNO.SDS.VPN.PrivateAddressCheck=function(b){var a=b.split(".");if(4!==a.length){return false}if(!SYNO.SDS.VPN.ValidIpRange(a[2])||!SYNO.SDS.VPN.ValidIpRange(a[3])){return false}if(10==a[0]){if(!SYNO.SDS.VPN.ValidIpRange(a[1])){return false}}else{if(172==a[0]){if(a[1]<16||a[1]>31){return false}}else{if(192==a[0]){if(a[1]!=168){return false}}else{return false}}}return true};SYNO.SDS.VPN.TextFieldIP=function(a){var c="0";if("openvpn"==a){c="1"}var b={xtype:"syno_compositefield",indent:1,fieldLabel:_V("common","text_ip"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,name:"serv_ip",width:250,items:[{xtype:"syno_numberfield",width:SYNO.SDS.VPN.FORM_IPWIDTH,allowBlank:false,name:"serv_ip_1",vtype:"ipfield",maxlength:3},{xtype:"syno_displayfield",value:".",cls:"syno-dot-display"},{xtype:"syno_numberfield",width:SYNO.SDS.VPN.FORM_IPWIDTH,allowBlank:false,name:"serv_ip_2",vtype:"ipfield",maxlength:3},{xtype:"syno_displayfield",value:".",cls:"syno-dot-display"},{xtype:"syno_numberfield",width:SYNO.SDS.VPN.FORM_IPWIDTH,allowBlank:false,name:"serv_ip_3",vtype:"ipfield",maxlength:3},{xtype:"syno_displayfield",value:".",cls:"syno-dot-display"},{xtype:"syno_displayfield",value:c,cls:"syno-ip-display"}]};return b};SYNO.SDS.VPN.genRange=function(a,b){var e=[];var c;for(c=b;c<=a;c=c+b){var d=[c,c];e.push(d)}return e};SYNO.SDS.VPN.createVPNRangeStore=function(){var b=[[3,3],[5,5]];var a=_D("vpn_conn_max");var c;if(!a){c=[]}else{if(5>=a){c=b}else{if(SYNO.SDS.VPN.CONN_MAX_LIMIT<a){a=SYNO.SDS.VPN.CONN_MAX_LIMIT}c=SYNO.SDS.VPN.genRange(a,5)}}var d=new Ext.data.SimpleStore({fields:["value","display"],data:c});return d};SYNO.SDS.VPN.ComboboxIpRange=function(){var b=SYNO.SDS.VPN.createVPNRangeStore();var a={xtype:"syno_combobox",indent:1,fieldLabel:_V("common","cbx_client_num"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,hiddenName:"serv_range",name:"serv_range",editable:false,store:b,forceSelection:true,allowBlank:false,displayField:"display",valueField:"value",typeAhead:true,triggerAction:"all",lazyRender:true,width:SYNO.SDS.VPN.FORM_TEXTWIDTH};return a};SYNO.SDS.VPN.createVPNAuthStore=function(){var a=[[SYNO.SDS.VPN.AUTH_TYPE_PAP,"PAP"],[SYNO.SDS.VPN.AUTH_TYPE_MSCHAP,"MS-CHAP v2"]];var b=new Ext.data.SimpleStore({fields:["value","display"],data:a});return b};SYNO.SDS.VPN.ComboboxAuth=function(){var a=SYNO.SDS.VPN.createVPNAuthStore();var b={xtype:"syno_combobox",indent:1,fieldLabel:_V("common","cbx_auth"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,hiddenName:"auth_type",name:"auth_type",editable:false,store:a,forceSelection:true,allowBlank:false,displayField:"display",valueField:"value",typeAhead:true,triggerAction:"all",lazyRender:true,width:SYNO.SDS.VPN.FORM_TEXTWIDTH};return b};SYNO.SDS.VPN.createVPNMppeStore=function(){var a=[[SYNO.SDS.VPN.MPPE_TYPE_NO,"No MPPE"],[SYNO.SDS.VPN.MPPE_TYPE_OPT,"Optional MPPE"],[SYNO.SDS.VPN.MPPE_TYPE_REQ,"Require MPPE"]];var b=new Ext.data.SimpleStore({fields:["value","display"],data:a});return b};SYNO.SDS.VPN.ComboboxMppe=function(){var b=SYNO.SDS.VPN.createVPNMppeStore();var a={xtype:"syno_combobox",indent:1,fieldLabel:_V("common","cbx_encrypt"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,hiddenName:"mppe_type",name:"mppe_type",editable:false,store:b,forceSelection:true,allowBlank:false,displayField:"display",valueField:"value",typeAhead:true,triggerAction:"all",lazyRender:true,width:SYNO.SDS.VPN.FORM_TEXTWIDTH};return a};SYNO.SDS.VPN.TextMTU=function(){var a={xtype:"syno_textfield",indent:1,fieldLabel:_V("pptp","pptp_mtu"),labelWidth:SYNO.SDS.VPN.FORM_LABELWIDTH,width:SYNO.SDS.VPN.FORM_MTUWIDTH,allowBlank:false,name:"mtu",vtype:"number",maxlength:4};return a};SYNO.SDS.VPN.TextFieldDNS=function(){var a={xtype:"syno_compositefield",hideLabel:true,name:"dns_field",items:[{xtype:"syno_checkbox",indent:1,boxLabel:_V("pptp","pptp_dns"),width:SYNO.SDS.VPN.FORM_LABELWIDTH_WITH_CHECK,name:"dns_check"},{xtype:"syno_textfield",width:SYNO.SDS.VPN.FORM_TEXTWIDTH,allowBlank:false,name:"dns",vtype:"ip",maxlength:16}]};return a};