File manager - Edit - /usr/local/CyberCP/public/snappymail/snappymail/v/2.38.2/static/js/min/admin.min.js
Back
!function(){"use strict";const e=-2,t=-1,s=1,i=0,a={RequestError:1,RequestAborted:2,RequestTimeout:3,InvalidToken:101,AuthError:102,ConnectionError:104,DomainNotAllowed:109,AccountNotAllowed:110,CryptKeyError:111,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,CantActivateFiltersScript:353,CantDeleteFiltersScript:354,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,DomainAlreadyExists:601,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,AccountSwitchFailed:803,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,JsonFalse:950,JsonParse:952,UnknownError:999,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,CantSavePluginSettings:705},o=Array.isArray,r=e=>o(e)&&e.length,n=e=>"function"==typeof e,l=e=>null!=e?""+e:"",c=(e,t)=>Object.entries(e).forEach((([e,s])=>t(e,s))),d=(e,t=0)=>(e=parseInt(e,10),isFinite(e)?e:t),h=(e,t)=>t&&void 0!==t.disabled&&e?.classList.toggle("disabled",e.disabled=t.disabled);let m="all";const u="Menu",p=document,g=p.documentElement.classList,b=e=>p.getElementById(e),S=b("rl-app"),A=rl.settings,v=A.get,w=e=>(v("Admin")||{})[e],f=e=>e&&!!(v("Capa")||{})[e],k=ko.observable(!1).extend({rateLimit:0}),P=ko.observable(!1),E=()=>P(!P()),T=(e,t)=>{let s=p.createElement(e);return t&&Object.entries(t).forEach((([e,t])=>s.setAttribute(e,t))),s},C=(e,t,s)=>dispatchEvent(new CustomEvent(e,{detail:t,cancelable:!!s})),L=ko.observable("all"),y=e=>{if(!e)return m;u!==e&&(m=e,k()&&(e=u)),L(e),shortcuts.setScope(e)};k.subscribe((e=>{e?y(u):u===shortcuts.getScope()&&y(m)})),P.subscribe((e=>g.toggle("rl-left-panel-disabled",e)));const _=p.location.pathname.replace(/\/+$/,"")+"/",D=()=>rl.adminArea()&&!w("host"),M=()=>_+"?"+(D()?w("path"):""),R="&q[]=",V={language:ko.observable(""),languages:ko.observableArray(),userLanguage:ko.observable(""),hourCycle:ko.observable(""),populate:function(){const e=A.app("languages");this.languages(o(e)?e:[]),this.language(v("language")),this.userLanguage(v("clientLanguage")),this.hourCycle(v("hourCycle"))}};let I={};const N=()=>{if(rl.I18N)return I=rl.I18N,rl.I18N=null,p.documentElement.dir=I.LANG_DIR,1},x=e=>{let t=(s=a,i=e,Object.keys(s).find((e=>s[e]===i)));var s,i;return t?I.NOTIFICATIONS[t]:""},O=ko.observable(!1),U=(e,t,s)=>{let i=s??e,a=e.split("/");return I[a[0]]&&a[1]&&(i=I[a[0]][a[1]]||i),t&&c(t,((e,t)=>{i=i.replace("%"+e+"%",t)})),i},H=e=>setTimeout((()=>e.querySelectorAll("[data-i18n]").forEach((e=>{const t=e.dataset.i18n;if("["===t[0])switch(t.slice(1,6)){case"html]":e.innerHTML=U(t.slice(6));break;case"place":e.placeholder=U(t.slice(13));break;case"title":e.title=U(t.slice(7))}else e.textContent=U(t)}))),1),q=(e,t="",s=0)=>(e=d(e),a.ClientViewError===e&&t?t:x(e)||x(d(s))||""),B=(e,t)=>new Promise(((s,i)=>{const a=T("script");a.onload=()=>{N()&&(H(p),O(!O())),a.remove(),s()},a.onerror=()=>i(Error("Language "+e+" failed")),a.src=_+"?/Lang/0/"+(t?"Admin":"App")+"/"+encodeURI(e)+"/"+A.app("version")+"/",p.head.append(a)})),F=(e,t=!1)=>U("LANGS_NAMES"+(!0===t?"_EN":"")+"/"+e,null,e);N();const G=(e,t)=>t?setTimeout((()=>e.setAttribute("data-rainloopErrorTip",t)),100):e.removeAttribute("data-rainloopErrorTip"),Q=e=>ko.computed(e,{pure:!0}),W=(e,t)=>c(t,((t,s)=>e[t]||(e[t]=ko.observable(s)))),z=(e,t)=>c(t,((t,s)=>e[t]=Q(s))),j=(e,t)=>c(t,((t,s)=>e[t].subscribe(s))),Y=e=>n(e?.dispose)&&e.dispose(),J=(e,t,s)=>{e.addEventListener(t,s),ko.utils.domNodeDisposal.addDisposeCallback(e,(()=>e.removeEventListener(t,s)))},$=(e,t,s,i,a)=>{J(t,"keydown",(t=>{e==t.key&&s().call(a)}))};Object.assign(ko.bindingHandlers,{tooltipErrorTip:{init:(e,t)=>{p.addEventListener("click",(()=>{let s=t();ko.isObservable(s)&&!ko.isComputed(s)&&s(""),G(e)}))},update:(e,t)=>{let s=ko.unwrap(t());G(e,n(s)?s():s)}},onEnter:{init:(e,t,s,i)=>$("Enter",e,t,0,i)},onEsc:{init:(e,t,s,i)=>$("Escape",e,t,0,i)},onSpace:{init:(e,t,s,i)=>$(" ",e,t,0,i)},toggle:{init:(e,t)=>{let s=t(),i=()=>s(!s());J(e,"click",i),J(e,"keydown",(e=>" "==e.key&&i()))}},i18nUpdate:{update:(e,t)=>{ko.unwrap(t()),H(e)}},command:{init:(e,t,s,i,a)=>{const o=t();if(!o||!o.canExecute)throw Error("Value should be a command");ko.bindingHandlers["FORM"==e.nodeName?"submit":"click"].init(e,t,s,i,a)},update:(e,t)=>{let s=!t().canExecute();e.classList.toggle("disabled",s),e.matches("INPUT,TEXTAREA,BUTTON")&&(e.disabled=s)}},saveTrigger:{init:e=>{let t=e;e.matches("input,select,textarea")&&(e.classList.add("settings-save-trigger-input"),e.after(e.saveTriggerIcon=t=T("span"))),t.classList.add("settings-save-trigger")},update:(t,a)=>{const o=parseInt(ko.unwrap(a()),10);let r=(t.saveTriggerIcon||t).classList;t.saveTriggerIcon&&(r.toggle("saving",o===e),r.toggle("success",o===s),r.toggle("error",o===i)),r=t.classList,r.toggle("success",o===s),r.toggle("error",o===i)}}}),ko.extenders.toggleSubscribeProperty=(e,t)=>{const s=t[1];return s&&(e.subscribe((e=>e?.[s]?.(!1)),t[0],"beforeChange"),e.subscribe((e=>e?.[s]?.(!0)),t[0])),e},ko.extenders.falseTimeout=(e,t)=>(e.subscribe((()=>e(!1)).debounce(parseInt(t,10)||0)),e),ko.observable.fn.askDeleteHelper=function(){return this.extend({falseTimeout:3e3,toggleSubscribeProperty:[this,"askDelete"]})};let Z=0;const K=matchMedia("(max-width: 799px)"),X={theme:ko.observable(""),themes:ko.observableArray(),userBackgroundName:ko.observable(""),userBackgroundHash:ko.observable(""),fontSansSerif:ko.observable(""),fontSerif:ko.observable(""),fontMono:ko.observable(""),isMobile:ko.observable(!1)},ee=()=>{const e=v("Theme"),t=A.app("themes");X.themes(o(t)?t:[]),X.theme(e),te(e),X.isMobile()||(X.userBackgroundName(v("userBackgroundName")),X.userBackgroundHash(v("userBackgroundHash"))),X.fontSansSerif(v("fontSansSerif")),X.fontSerif(v("fontSerif")),X.fontMono(v("fontMono")),P(X.isMobile())},te=(i,a=(()=>0))=>{const o=b("app-theme-style"),n=()=>{Z=setTimeout((()=>a(t)),1e3)},l=_+"?/Css/0/User/-/"+encodeURI(i)+"/-/"+Date.now()+"/Hash/-/Json/";o.dataset.name!=i&&(clearTimeout(Z),a(e),rl.app.Remote.abort("theme").get("theme",l).then((e=>{2===r(e)&&(o.textContent=e[1],o.dataset.name=i,a(s)),n()}),n))},se=e=>e.replace(/@[a-z]+$/,"").replace(/([A-Z])/g," $1").trim();j(X,{fontSansSerif:e=>{if(null!=e){let t=S.classList;t.forEach((e=>{e.startsWith("font")&&!/font(Serif|Mono)/.test(e)&&t.remove(e)})),e&&t.add("font"+e)}},fontSerif:e=>{if(null!=e){let t=S.classList;t.forEach((e=>e.startsWith("fontSerif")&&t.remove(e))),e&&t.add("fontSerif"+e)}},fontMono:e=>{if(null!=e){let t=S.classList;t.forEach((e=>e.startsWith("fontMono")&&t.remove(e))),e&&t.add("fontMono"+e)}},userBackgroundHash:e=>{var t,s;S.classList.toggle("UserBackground",!!e),S.style.backgroundImage=e?"url("+(s=e,_+"?/Raw/"+R+"/0/"+((t="UserBackground")?t+"/"+(s?R+"/"+s:""):"")+")"):null}}),K.onchange=e=>{X.isMobile(e.matches),g.toggle("rl-mobile",e.matches),P(e.matches)},K.onchange(K);let ie=0;const ae=(e="")=>{return t="Json",M()+"/"+t+"/"+R+"/0/"+l(e);var t},oe=e=>{const t=e?e.code:null;a.InvalidToken===t?setTimeout(rl.logoutReload,5e3):[a.AuthError,a.ConnectionError,a.DomainNotAllowed,a.AccountNotAllowed,a.MailServerError,a.UnknownError].includes(t)&&7<++ie&&rl.logoutReload()},re={},ne=(e,t,s)=>{let i=re[e];re[e]=null,i&&(clearTimeout(i.timeoutId),s||i.abort(new DOMException(e,t||"AbortError")))},le=(e,t,s,i,a)=>{s&&(s instanceof FormData?s.set("Action",e):s.Action=e);const o=new AbortController,r=o.signal;return re[e]=o,o.timeoutId=i&&setTimeout((()=>ne(e,"TimeoutError")),i),rl.fetchJSON(t,{signal:r},s).then((t=>(ne(e,0,1),a?a(t):Promise.resolve(t)))).catch((e=>(clearTimeout(o.timeoutId),e.aborted=r.aborted,Promise.reject(e))))};class FetchError extends Error{constructor(e,t){super(t),this.code=e||a.JsonFalse}}class AbstractFetchRemote{abort(e,t){return ne(e,t),this}streamPerLine(e,t,s){rl.fetch(ae(t),{},s).then((e=>e.body)).then((t=>{let s="";const i=t.getReader(),a=/\r\n|\n|\r/gm,o=new TextDecoder,r=({done:t,value:n})=>{for(s+=n?o.decode(n,{stream:!0}):"";;){let o=a.exec(s);if(!o){if(t)break;return void i.read().then(r)}e(s.slice(0,o.index)),s=s.slice(o.index+1),a.lastIndex=0}s.length&&e(s)};i.read().then(r)}))}request(e,t,s,i,o){s=s||{};const r=Date.now();le(e,ae(o),o?null:s||{},d(i??3e4),(async n=>{let l=0;if(n&&(n.Result?ie=0:(oe(n),l=n.code||a.UnknownError)),111===l&&rl.app.ask&&await rl.app.ask.cryptkey())return this.request(e,t,s,i,o);t&&t(l,n,n?.epoch&&n.epoch<Math.floor(r/1e3)-60)})).catch((e=>{t&&t("TimeoutError"==e.name?3:"AbortError"==e.name?2:1,e)}))}setTrigger(e,t){e&&(t=!!t,(o(e)?e:[e]).forEach((e=>{e?.(t)})))}get(e,t){return le(e,t)}post(e,t,s,i){return this.setTrigger(t,!0),le(e,ae(),s||{},d(i,3e4),(async o=>(ne(e,0,1),o?111===o?.code&&rl.app.ask&&await rl.app.ask.cryptkey()?this.post(e,t,s,i):(this.setTrigger(t,!1),o.Result&&e===o.Action?o:(oe(o),Promise.reject(new FetchError(o?o.code:0,o?o.messageAdditional||o.message:"")))):Promise.reject(new FetchError(a.JsonParse)))))}}Object.assign(AbstractFetchRemote.prototype,{SUCCESS:0,ERROR:1,ABORT:2});var ce=new class RemoteAdminFetch extends AbstractFetchRemote{saveSetting(e,t,s){this.request("AdminSettingsUpdate",s,{[e]:t})}};class AbstractScreen{constructor(e,t=[]){this.__cross=null,this.screenName=e,this.viewModels=o(t)?t:[]}routes(){return null}onStart(){const e=this.routes();if(r(e)){let t=new Crossroads,s=(this.onRoute||(()=>0)).bind(this);e.forEach((e=>e&&(t.addRoute(e[0],s).rules=e[1]))),this.__cross=t}}}const de=[];class AbstractSettingsScreen extends AbstractScreen{constructor(e){super("settings",e),this.menu=ko.observableArray(),this.oCurrentSubScreen=null}onRoute(e){let t=null,s=null,i=de.find((t=>e===t.route));if(i){const e=this.viewModels[1].__vm.viewModelDom,a=i.vmc;a.__vm?(t=a.__vm,s=t.viewModelDom):e&&(s=T("div",{id:"V-Settings-"+a.name.replace(/(User|Admin)Settings/,""),hidden:""}),e.append(s),t=new a,t.viewModelDom=s,t.viewModelTemplateID=i.template,a.__vm=t,C("rl-view-model.create",t),ko.applyBindingAccessorsToNode(s,{template:()=>({name:i.template})},t),t.onBuild?.(s),C("rl-view-model",t)),t&&setTimeout((()=>{this.onHide(),this.oCurrentSubScreen=t,t.beforeShow?.(),H(s),s.hidden=!1,t.onShow?.(),this.menu.forEach((e=>{e.selected(e.route===i.route)})),(e||{}).scrollTop=0}),1)}else hasher.replaceHash(((e="")=>"#/settings"+(e?"/"+e:""))())}onHide(){let e=this.oCurrentSubScreen;e&&(e.onHide?.(),e.viewModelDom.hidden=!0)}onBuild(){de.forEach((e=>this.menu.push(e)))}routes(){const e=de.find((e=>e.isDefault)),t=e?.route||"general",s={subname:/^(.*)$/,normalize_:(e,s)=>(s.subname=l(s.subname??t),[s.subname])};return[["{subname}/",s],["{subname}",s],["",s]]}}function he(e,t,s,i,a=!1){let o=e.name.replace(/(User|Admin)Settings/,"");de.push({vmc:e,label:s||"SETTINGS_LABELS/"+o.toUpperCase(),route:i||o.toLowerCase(),selected:ko.observable(!1),template:t||e.name,isDefault:!!a})}let me=null,ue="";const pe=new Map,ge=e=>e.querySelector("[autofocus]")?.focus(),be=new Set,Se=e=>e&&pe.get(e)||null,Ae=(e,t)=>{if(e&&!e.__vm){const s=new e(t),i=s.viewModelTemplateID,a="rl-"+s.viewType,o=ke===s.viewType,r=p.getElementById(a);if(r){e.__vm=s;let t=o?T("dialog",{id:"V-"+i}):T("div",{id:"V-"+i,hidden:""});if(r.append(t),s.viewModelDom=t,o){t.showModal||(t.className="polyfill",t.showModal=()=>{t.backdrop||t.before(t.backdrop=T("div",{class:"dialog-backdrop"})),t.setAttribute("open",""),t.open=!0,t.backdrop.hidden=!1},t.close=()=>{t.backdrop.hidden=!0,t.removeAttribute("open",null),t.open=!1});const e=e=>{e.target===t&&"opacity"===e.propertyName&&(t.classList.contains("animate")?(s.afterShow?.(),C("rl-vm-visible",s)):(t.close(),s.afterHide?.()))};s.modalVisible.subscribe((e=>{e?(H(t),be.add(s),t.style.zIndex=3001+2*be.size,t.showModal(),t.backdrop&&(t.backdrop.style.zIndex=3e3+2*be.size),s.keyScope.set(),setTimeout((()=>ge(t)),1),requestAnimationFrame((()=>{t.offsetHeight,t.classList.add("animate")}))):(be.delete(s),s.onHide?.(),s.keyScope.unset(),t.classList.remove("animate")),Ee(0<be.size)})),t.addEventListener("transitionend",e)}C("rl-view-model.create",s),ko.applyBindingAccessorsToNode(t,{template:()=>({name:i})},s),s.onBuild?.(t),C("rl-view-model",s)}}return e?.__vm},ve=(e,t)=>{e.viewModels.forEach((e=>{e.__vm&&ke!==e.__vm.viewType&&t(e.__vm,e.__vm.viewModelDom)}))},we=(e,t)=>{e.onHide?.(),ve(e,((e,s)=>{s.hidden=!0,e.onHide?.(),t&&s.remove()})),X.isMobile()&&P(!0)},fe=(e,t)=>{if((e=e||ue)&&C("sm-show-screen",e+(t?"/"+t:""),1)){for(let e of be)e.tryToClose();let s=Se(e);if(s||(s=Se(ue),s&&(t=e+"/"+t,e=ue)),s?.__started){let e=me&&s===me;s.__builded||(s.__builded=!0,s.viewModels.forEach((e=>Ae(e,s))),s.onBuild?.()),setTimeout((()=>{me&&!e&&we(me),me=s,e||(s.onShow?.(),ve(s,((e,t)=>{e.beforeShow?.(),H(t),t.hidden=!1,e.onShow?.(),ge(t)}))),s.__cross?.parse(t)}),1)}}},ke="popups",Pe=(e,t=[])=>{const s=Ae(e);s&&(t=t||[],s.beforeShow?.(...t),s.modalVisible(!0),s.onShow?.(...t))},Ee=ko.observable(!1),Te=e=>{hasher.clear(),pe.forEach((e=>we(e,1))),pe.clear(),me=null,ue="",e.forEach((e=>{const t=new e,s=t.screenName;ue||(ue=s),pe.set(s,t)})),pe.forEach((e=>{e.__started||(e.onStart(),e.__started=!0)}));const t=new Crossroads;t.addRoute(/^([^/]*)\/?(.*)$/,fe),hasher.add(t.parse.bind(t)),hasher.init(),setTimeout((()=>g.remove("rl-started-trigger")),100);const s=b("rl-content"),i=b("rl-loading");s&&(s.hidden=!1),i?.remove()},Ce=(e,t)=>c(t,((t,s)=>{let i=e[t],a=(...t)=>a.canExecute()&&i.apply(e,t);a.canExecute=Q((()=>s.call(e,e))),e[t]=a}));ko.decorateCommands=Ce;class AbstractView{constructor(e,t){this.viewModelTemplateID=e||this.constructor.name.replace("UserView",""),this.viewType=t,this.viewModelDom=null,this.keyScope={scope:"none",previous:"none",set:function(){this.previous=y(),y(this.scope)},unset:function(){y(this.previous)}}}querySelector(e){return this.viewModelDom.querySelector(e)}addObservables(e){W(this,e)}addComputables(e){z(this,e)}addSubscribables(e){j(this,e)}}class AbstractViewPopup extends AbstractView{constructor(e){super("Popups"+e,ke),this.keyScope.scope=e,this.modalVisible=ko.observable(!1).extend({rateLimit:0}),this.close=()=>this.modalVisible(!1),this.tryToClose=()=>!1===this.onClose()||this.close(),((...e)=>{shortcuts.add(...e)})("escape,close","",e,(()=>(this.modalVisible()&&this.tryToClose(),!1)))}onClose(){}}AbstractViewPopup.showModal=function(e=[]){Pe(this,e)},AbstractViewPopup.hidden=function(){return!this.__vm||!this.__vm.modalVisible()};class AbstractViewLeft extends AbstractView{constructor(e){super(e,"left"),this.toggleLeftPanel=E}}class AbstractViewRight extends AbstractView{constructor(e){super(e,"right")}}class AbstractViewSettings{addSetting(a,o){let r=a[0].toLowerCase()+a.slice(1),n=r+"Trigger";W(this,{[r]:v(a),[n]:t}),j(this,{[r]:(r=>{this[n](e),o?.(r),rl.app.Remote.saveSetting(a,r,(e=>{this[n](e?i:s),setTimeout((()=>this[n](t)),1e3)}))}).debounce(999)})}addSettings(e){e.forEach((e=>{let t=e[0].toLowerCase()+e.slice(1);this[t]||(this[t]=ko.observable(v(e))),this[t].subscribe((t=>rl.app.Remote.saveSetting(e,t)))}))}}class AbstractViewLogin extends AbstractView{constructor(e){super(e,"content"),this.formError=ko.observable(!1).extend({falseTimeout:500})}onBuild(e){e.classList.add("LoginView")}onShow(){b("rl-left").hidden=!0,b("rl-right").hidden=!0,rl.route.off()}onHide(){b("rl-left").hidden=!1,b("rl-right").hidden=!1}submitForm(){}}const Le=[],ye=[];rl.pluginRemoteRequest=(e,t,s,i)=>{rl.app.Remote.request("Plugin"+t,e,s,i)},rl.addSettingsViewModel=(e,t,s,i)=>{Le.push([e,t,s,i])},rl.addSettingsViewModelForAdmin=(e,t,s,i)=>{ye.push([e,t,s,i])},rl.pluginSettingsGet=(e,t)=>v("Plugins")?.[e]?.[t],rl.pluginPopupView=AbstractViewPopup;class LanguagesPopupView extends AbstractViewPopup{constructor(){super("Languages"),this.fLang=null,this.languages=ko.observableArray()}onShow(e,t,s){this.fLang=e,this.languages(t.map((t=>({key:t,user:s===t,selected:e?.()===t,fullName:F(t),title:F(t,!0)}))))}changeLanguage(e){this.fLang?.(e),this.close()}}class AdminSettingsGeneral extends AbstractViewSettings{constructor(){super(),this.language=V.language,this.languageAdmin=ko.observable(w("language")),this.theme=X.theme,this.themes=X.themes,this.addSettings(["allowLanguagesOnSettings"]),W(this,{capaThemes:f("Themes"),capaUserBackground:f("UserBackground"),capaAdditionalAccounts:f("AdditionalAccounts"),capaIdentities:f("Identities"),capaAttachmentThumbnails:f("AttachmentThumbnails"),dataFolderAccess:!1}),this.weakPassword=rl.app.weakPassword,this.attachmentLimit=ko.observable(v("attachmentLimit")/1048576).extend({debounce:500}),this.addSetting("language"),this.addSetting("attachmentLimit"),this.addSetting("Theme",(e=>te(e,this.themeTrigger))),this.uploadData=v("phpUploadSizes"),this.uploadDataDesc=this.uploadData?.upload_max_filesize||this.uploadData?.post_max_size?[this.uploadData.upload_max_filesize?"upload_max_filesize = "+this.uploadData.upload_max_filesize+"; ":"",this.uploadData.post_max_size?"post_max_size = "+this.uploadData.post_max_size:""].join(""):"",z(this,{themesOptions:()=>this.themes.map((e=>({optValue:e,optText:se(e)}))),languageFullName:()=>F(this.language()),languageAdminFullName:()=>F(this.languageAdmin())}),this.languageAdminTrigger=ko.observable(t).extend({debounce:100});const a=e=>()=>{this.languageAdminTrigger(e),setTimeout((()=>this.languageAdminTrigger(t)),1e3)},o=e=>t=>ce.saveSetting(e,t);j(this,{languageAdmin:t=>{this.languageAdminTrigger(e),B(t,1).then(a(s),a(i)).then((()=>ce.saveSetting("languageAdmin",t)))},capaAdditionalAccounts:o("CapaAdditionalAccounts"),capaIdentities:o("CapaIdentities"),capaAttachmentThumbnails:o("CapaAttachmentThumbnails"),capaThemes:o("CapaThemes"),capaUserBackground:o("CapaUserBackground")})}selectLanguage(){Pe(LanguagesPopupView,[this.language,V.languages,V.userLanguage()])}selectLanguageAdmin(){Pe(LanguagesPopupView,[this.languageAdmin,w("languages"),w("clientLanguage")])}}const _e=ko.observableArray();_e.loading=ko.observable(!1),_e.fetch=()=>{_e.loading(!0),ce.request("AdminDomainList",((e,t)=>{_e.loading(!1),e||_e(t.Result.map((e=>(e.name=IDN.toUnicode(e.name),e.disabled=ko.observable(e.disabled),e.askDelete=ko.observable(!1),e))))}),{includeAliases:1})};class AskPopupView extends AbstractViewPopup{constructor(){super("Ask"),W(this,{askDesc:"",yesButton:"",noButton:"",username:"",askUsername:!1,passphrase:"",askPass:!1,remember:!0,askRemeber:!1}),this.fYesAction=null,this.fNoAction=null,this.focusOnShow=!0}yesClick(){this.close(),n(this.fYesAction)&&this.fYesAction(this)}noClick(){this.close(),n(this.fNoAction)&&this.fNoAction(this)}onShow(e,t=null,s=null,i=!0,a=0,o=""){this.askDesc(e||""),this.askUsername(2&a),this.askPass(1&a),this.askRemeber(4&a),this.username(""),this.passphrase(""),this.remember(!0),this.yesButton(U(o||"GLOBAL/YES")),this.noButton(U(a?"GLOBAL/CANCEL":"GLOBAL/NO")),this.fYesAction=t,this.fNoAction=s,this.focusOnShow=i?a?'input[type="'+(2&a?"text":"password")+'"]':".buttonYes":""}afterShow(){this.focusOnShow&&this.querySelector(this.focusOnShow).focus()}onClose(){return this.noClick(),!1}onBuild(){shortcuts.add("tab,arrowright,arrowleft","","Ask",(()=>{let e=this.querySelector(".buttonYes"),t=this.querySelector(".buttonNo");return e.matches(":focus")?(t.focus(),!1):t.matches(":focus")?(e.focus(),!1):void 0}))}}const De=e=>e.charAt(0).toUpperCase()+e.slice(1),Me={enableSmartPorts:!1,savingError:"",name:"",imapHost:"",imapPort:143,imapType:0,imapTimeout:300,imapShortLogin:!1,imapLowerLogin:!0,imapSslVerify_peer:!1,imapSslAllow_self_signed:!1,imapExpunge_all_on_delete:!1,imapFast_simple_search:!0,imapFetch_new_messages:!0,imapForce_select:!1,imapFolder_list_limit:200,imapMessage_all_headers:!1,imapMessage_list_limit:1e4,imapSearch_filter:"",imapSpam_headers:"",imapVirus_headers:"",sieveEnabled:!1,sieveHost:"",sievePort:4190,sieveType:0,sieveTimeout:10,sieveAuthLiteral:!0,smtpHost:"",smtpPort:25,smtpType:0,smtpTimeout:60,smtpShortLogin:!1,smtpLowerLogin:!0,smtpUseAuth:!0,smtpSetSender:!1,smtpAuthPlainLine:!1,smtpUsePhpMail:!1,smtpSslVerify_peer:!1,smtpSslAllow_self_signed:!1,whiteList:"",aliasName:""},Re=e=>({name:e.name,IMAP:{host:e.imapHost,port:e.imapPort,secure:d(e.imapType()),timeout:e.imapTimeout,shortLogin:!!e.imapShortLogin(),lowerLogin:!!e.imapLowerLogin(),ssl:{verify_peer:!!e.imapSslVerify_peer(),verify_peer_name:!!e.imapSslVerify_peer(),allow_self_signed:!!e.imapSslAllow_self_signed()},disabled_capabilities:e.imapDisabled_capabilities(),folder_list_limit:d(e.imapFolder_list_limit()),message_list_limit:d(e.imapMessage_list_limit()),search_filter:e.imapSearch_filter(),spam_headers:e.imapSpam_headers(),virus_headers:e.imapVirus_headers()},SMTP:{host:e.smtpHost,port:e.smtpPort,secure:d(e.smtpType()),timeout:e.smtpTimeout,shortLogin:!!e.smtpShortLogin(),lowerLogin:!!e.smtpLowerLogin(),ssl:{verify_peer:!!e.smtpSslVerify_peer(),verify_peer_name:!!e.smtpSslVerify_peer(),allow_self_signed:!!e.smtpSslAllow_self_signed()},setSender:!!e.smtpSetSender(),authPlainLine:!!e.smtpAuthPlainLine(),useAuth:!!e.smtpUseAuth(),usePhpMail:!!e.smtpUsePhpMail()},Sieve:{enabled:!!e.sieveEnabled(),authLiteral:!!e.sieveAuthLiteral(),host:e.sieveHost,port:e.sievePort,secure:d(e.sieveType()),timeout:e.sieveTimeout,shortLogin:!!e.imapShortLogin(),lowerLogin:!!e.imapLowerLogin(),ssl:{verify_peer:!!e.imapSslVerify_peer(),verify_peer_name:!!e.imapSslVerify_peer(),allow_self_signed:!!e.imapSslAllow_self_signed()}},whiteList:e.whiteList});class DomainPopupView extends AbstractViewPopup{constructor(){super("Domain"),W(this,Me),W(this,{edit:!1,saving:!1,testing:!1,testingDone:!1,testingImapError:!1,testingSieveError:!1,testingSmtpError:!1,imapHostFocus:!1,sieveHostFocus:!1,smtpHostFocus:!1,detectingConfig:!1}),this.imapDisabled_capabilities=ko.observableArray(),this.imapCapabilities=ko.observableArray(),z(this,{headerText:()=>{const e=this.name(),t=this.aliasName();return this.edit()?U("POPUPS_DOMAIN/TITLE_EDIT_DOMAIN",{NAME:e})+(t?" ⫘ "+t:""):e?U("POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME",{NAME:e}):U("POPUPS_DOMAIN/TITLE_ADD_DOMAIN")},domainDesc:()=>{const e=this.name();return!this.edit()&&e?U("POPUPS_DOMAIN/NEW_DOMAIN_DESC",{NAME:"*@"+e}):""},domainIsComputed:()=>{const e=this.smtpUsePhpMail(),t=this.sieveEnabled();return this.name()&&this.imapHost()&&this.imapPort()&&(!t||this.sieveHost()&&this.sievePort())&&(this.smtpHost()&&this.smtpPort()||e)},canBeTested:()=>!this.testing()&&this.domainIsComputed(),canBeSaved:()=>!this.saving()&&this.domainIsComputed()}),j(this,{imapHostFocus:e=>e&&this.name()&&!this.imapHost()&&this.imapHost(this.name().replace(/[.]?[*][.]?/g,"")),sieveHostFocus:e=>e&&this.imapHost()&&!this.sieveHost()&&this.sieveHost(this.imapHost()),smtpHostFocus:e=>e&&this.imapHost()&&!this.smtpHost()&&this.smtpHost(this.imapHost().replace(/imap/gi,"smtp")),imapType:e=>{if(this.enableSmartPorts()){const t=d(this.imapPort());switch(d(e)){case 0:case 2:993===t&&this.imapPort(143);break;case 1:143===t&&this.imapPort(993)}}},smtpType:e=>{if(this.enableSmartPorts()){const t=d(this.smtpPort());switch(d(e)){case 0:465!==t&&587!==t||this.smtpPort(25);break;case 1:25!==t&&587!==t||this.smtpPort(465);break;case 2:25!==t&&465!==t||this.smtpPort(587)}}}}),Ce(this,{createOrAddCommand:e=>e.canBeSaved(),testConnectionCommand:e=>e.canBeTested()})}createOrAddCommand(){this.saving(!0),ce.request("AdminDomainSave",(e=>{this.saving(!1),e?this.savingError(q(e)):(_e.fetch(),this.close())}),Object.assign(Re(this),{create:this.edit()?0:1}))}testConnectionCommand(){this.clearTesting(),AskPopupView.credentials("IMAP","GLOBAL/TEST").then((e=>{if(e){this.testing(!0);const t=Re(this);t.auth={user:e.username,pass:e.password},ce.request("AdminDomainTest",((e,t)=>{if(this.testing(!1),e)this.testingImapError(q(e)),this.testingSieveError(q(e)),this.testingSmtpError(q(e));else{const e=t.Result;if(this.testingDone(!0),this.testingImapError(!0!==e.Imap&&e.Imap),this.testingSieveError(!0!==e.Sieve&&e.Sieve),this.testingSmtpError(!0!==e.Smtp&&e.Smtp),!0===e.Imap){let t=e.ImapResult.authCapa||["LIST-STATUS","METADATA","MOVE","SORT","THREAD","BINARY","STATUS=SIZE","PREVIEW"];t=t.concat(e.ImapResult.connectCapa).unique(),t.sort(),this.imapCapabilities(t)}}}),t)}}))}clearTesting(){this.testing(!1),this.testingDone(!1),this.testingImapError(!1),this.testingSieveError(!1),this.testingSmtpError(!1)}autoconfig(){this.detectingConfig(!0);let e=this.name();ce.request("AdminDomainAutoconfig",((e,t)=>{if(t?.Result?.config){let e=t.Result.config.incomingServer[0];this.imapHost(e.hostname),this.imapPort(e.port),this.imapType("STARTTLS"===e.socketType?2:"SSL"===e.socketType?1:0),this.imapShortLogin("%EMAILADDRESS%"!==e.username),e=t.Result.config.outgoingServer[0],this.smtpHost(e.hostname),this.smtpPort(e.port),this.smtpType("STARTTLS"===e.socketType?2:"SSL"===e.socketType?1:0),this.smtpShortLogin("%EMAILADDRESS%"!==e.username),this.smtpUseAuth(!!e.authentication),this.smtpUsePhpMail(!1)}this.detectingConfig(!1)}),{domain:e})}onShow(e){this.saving(!1),this.clearTesting(),this.edit(!1),this.imapCapabilities(["BINARY","LIST-STATUS","METADATA","MOVE","NAMESPACE","PREVIEW","SORT","STATUS=SIZE","THREAD"]),this.imapDisabled_capabilities(["METADATA","OBJECTID","PREVIEW","STATUS=SIZE"]),c(Me,((e,t)=>this[e](t))),this.enableSmartPorts(!0),e&&(this.enableSmartPorts(!1),this.edit(!0),c(e,((e,t)=>{"IMAP"===e||"SMTP"===e||"Sieve"===e?(e=e.toLowerCase(),c(t,((t,s)=>{"Ssl"==(t=De(t))?c(s,((s,i)=>{this[e+t+De(s)]?.(i)})):this[e+t]?.(s)}))):this[e]?.(t)})),this.name(IDN.toUnicode(this.name())),this.aliasName(IDN.toUnicode(this.aliasName())),this.imapCapabilities(this.imapCapabilities.concat(this.imapDisabled_capabilities()).unique()),this.enableSmartPorts(!0))}}class DomainAliasPopupView extends AbstractViewPopup{constructor(){super("DomainAlias"),W(this,{saving:!1,savingError:"",name:"",alias:""}),z(this,{domains:()=>_e.filter((e=>e&&!e.alias)),domainsOptions:()=>this.domains().map((e=>({optValue:e.name,optText:e.name}))),canBeSaved:()=>!this.saving()&&this.name()&&this.alias()}),Ce(this,{createCommand:e=>e.canBeSaved()})}createCommand(){this.saving(!0),ce.request("AdminDomainAliasSave",(e=>{this.saving(!1),e?this.savingError(q(e)):(_e.fetch(),this.close())}),{name:this.name,alias:this.alias})}onShow(){this.saving(!1),this.savingError(""),this.name(""),this.alias("")}}class AdminSettingsDomains{constructor(){this.domains=_e,this.username=ko.observable(""),this.domainForDeletion=ko.observable(null).askDeleteHelper()}testUsername(){ce.request("AdminDomainMatch",((e,t)=>{t?.Result?.domain?alert(`${t.Result.email} matched domain: ${t.Result.domain.name}`):alert("No domain match")}),{username:this.username})}createDomain(){Pe(DomainPopupView)}createDomainAlias(){Pe(DomainAliasPopupView)}deleteDomain(e){_e.remove(e),ce.request("AdminDomainDelete",_e.fetch,{name:e.name})}disableDomain(e){e.disabled(!e.disabled()),ce.request("AdminDomainDisable",_e.fetch,{name:e.name,disabled:e.disabled()?1:0})}onBuild(e){e.addEventListener("click",(t=>{let s=t.target.closestWithin(".b-admin-domains-list-table .e-action",e);s&&ko.dataFor(s)&&ce.request("AdminDomainLoad",((e,t)=>e||Pe(DomainPopupView,[t.Result])),{name:ko.dataFor(s).name})})),_e.fetch()}}class AdminSettingsLogin extends AbstractViewSettings{constructor(){super(),this.addSetting("loginDefaultDomain"),this.addSettings(["determineUserLanguage","determineUserDomain","allowLanguagesOnLogin"])}}class AdminSettingsContacts extends AbstractViewSettings{constructor(){super(),this.defaultOptionsAfterRender=h,this.addSetting("contactsPdoDsn"),this.addSetting("contactsPdoUser"),this.addSetting("contactsPdoPassword"),this.addSetting("contactsPdoType",(()=>{this.testContactsSuccess(!1),this.testContactsError(!1),this.testContactsErrorMessage("")})),this.addSettings(["contactsEnable","contactsSync"]),this.addSetting("contactsMySQLSSLCA"),this.addSetting("contactsMySQLSSLVerify"),this.addSetting("contactsMySQLSSLCiphers"),this.addSetting("contactsSQLiteGlobal"),W(this,{testing:!1,testContactsSuccess:!1,testContactsError:!1,testContactsErrorMessage:""}),this.addSetting("contactsSuggestionsLimit");const e=v("supportedPdoDrivers")||[],t=[{id:"sqlite",name:"SQLite"},{id:"mysql",name:"MySQL"},{id:"pgsql",name:"PostgreSQL"}].filter((t=>e.includes(t.id)));this.contactsSupported=0<t.length,this.contactsTypesOptions=t,this.mainContactsType=ko.computed({read:this.contactsPdoType,write:s=>{s!==this.contactsPdoType()?e.includes(s)?this.contactsPdoType(s):t.length&&this.contactsPdoType(""):this.contactsPdoType.valueHasMutated()}}).extend({notify:"always"}),Ce(this,{testContactsCommand:e=>e.contactsPdoDsn()&&e.contactsPdoUser()})}testContactsCommand(){this.testContactsSuccess(!1),this.testContactsError(!1),this.testContactsErrorMessage(""),this.testing(!0),ce.request("AdminContactsTest",((e,t)=>{this.testContactsSuccess(!1),this.testContactsError(!1),this.testContactsErrorMessage(""),!e&&t.Result.Result?this.testContactsSuccess(!0):(this.testContactsError(!0),this.testContactsErrorMessage(t?.Result?.Message||"")),this.testing(!1)}),{PdoType:this.contactsPdoType(),PdoDsn:this.contactsPdoDsn(),PdoUser:this.contactsPdoUser(),PdoPassword:this.contactsPdoPassword(),MySQLSSLCA:this.contactsMySQLSSLCA(),MySQLSSLVerify:this.contactsMySQLSSLVerify(),MySQLSSLCiphers:this.contactsMySQLSSLCiphers(),SQLiteGlobal:this.contactsSQLiteGlobal()})}onShow(){this.testContactsSuccess(!1),this.testContactsError(!1),this.testContactsErrorMessage("")}}class AdminSettingsSecurity extends AbstractViewSettings{constructor(){super(),this.addSettings(["proxyExternalImages","autoVerifySignatures"]),this.weakPassword=rl.app.weakPassword,W(this,{adminLogin:v("adminLogin"),adminLoginError:!1,adminPassword:"",adminPasswordNew:"",adminPasswordNew2:"",adminPasswordNewError:!1,adminTOTP:"",saveError:!1,saveSuccess:!1,viewQRCode:"",capaGnuPG:f("GnuPG"),capaOpenPGP:f("OpenPGP")}),this.gnuPGversion="GnuPG v"+v("gnupg");const e=()=>{this.saveError(!1),this.saveSuccess(!1),this.adminPasswordNewError(!1)};j(this,{adminPassword:()=>{this.saveError(!1),this.saveSuccess(!1)},adminLogin:()=>this.adminLoginError(!1),adminTOTP:e=>{/[A-Z2-7]{16,}/.test(e)&&0==5*e.length%8?ce.request("AdminQRCode",((e,t)=>{e||this.viewQRCode(t.Result)}),{username:this.adminLogin(),TOTP:this.adminTOTP()}):this.viewQRCode("")},adminPasswordNew:e,adminPasswordNew2:e,capaGnuPG:e=>ce.saveSetting("capaGnuPG",e),capaOpenPGP:e=>ce.saveSetting("capaOpenPGP",e)}),this.adminTOTP(v("adminTOTP")),Ce(this,{saveAdminUserCommand:e=>e.adminLogin().trim()&&e.adminPassword()})}generateTOTP(){let e=16,t="";for(;0<e--;)t+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[Math.floor(32*Math.random())];this.adminTOTP(t)}saveAdminUserCommand(){return this.adminLogin().trim()?this.adminPasswordNew()!==this.adminPasswordNew2()?(this.adminPasswordNewError(!0),!1):(this.saveError(!1),this.saveSuccess(!1),ce.request("AdminPasswordUpdate",((e,t)=>{e?this.saveError(!0):(this.adminPassword(""),this.adminPasswordNew(""),this.adminPasswordNew2(""),this.saveSuccess(!0),this.weakPassword(!!t.Result.Weak))}),{Login:this.adminLogin(),Password:this.adminPassword(),newPassword:this.adminPasswordNew(),TOTP:this.adminTOTP()}),!0):(this.adminLoginError(!0),!1)}onHide(){this.adminPassword(""),this.adminPasswordNew(""),this.adminPasswordNew2("")}}const Ve=ko.observableArray();Ve.real=ko.observable(!0),Ve.loading=ko.observable(!1),Ve.error=ko.observable(""),Ve.fetch=()=>{Ve.loading(!0),ce.request("AdminPackagesList",((e,t)=>{if(Ve.loading(!1),e)Ve.real(!1),Ve.error(q(e));else{Ve.real(!!t.Result.Real),Ve.error(t.Result.Error);const e={};Ve.forEach((t=>{t?.loading()&&(e[t.file]=t)}));let s=[];o(t.Result.List)&&(s=t.Result.List.filter((e=>e)).map((t=>(t.loading=ko.observable(void 0!==e[t.file]),t.enabled=ko.observable(t.enabled),t)))),Ve(s)}}))};class PluginPopupView extends AbstractViewPopup{constructor(){super("Plugin"),W(this,{saveError:"",id:"",name:"",readme:"",author:"",url:"",version:"",released:""}),this.config=ko.observableArray(),z(this,{hasReadme:()=>!!this.readme(),hasConfiguration:()=>0<this.config().length}),this.keyScope.scope="all",Ce(this,{saveCommand:e=>e.hasConfiguration()})}hideError(){this.saveError("")}saveCommand(){const e={id:this.id,settings:{}},t=t=>{let s=t.value();!1!==s&&!0!==s||(s=s?1:0),e.settings[t.name]=s};this.config.forEach((e=>{7==e.type?e.config.forEach((e=>t(e))):t(e)})),this.saveError(""),ce.request("AdminPluginSettingsUpdate",(e=>e?this.saveError(q(e)):this.close()),e)}onShow(e){if(this.id(""),this.name(""),this.readme(""),this.author(""),this.url(""),this.version(""),this.released(""),this.config([]),e){this.id(e.id),this.name(e.name),this.readme(e.readme),this.author(e.author),this.url(e.url),this.version(e.version),this.released(e.released);const t=e.config;r(t)&&this.config(t.map((e=>(7==e.type?e.config.forEach((e=>{e.value=ko.observable(e.value)})):e.value=ko.observable(e.value),e))))}}onClose(){return AskPopupView.hidden()&&Pe(AskPopupView,[U("POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW"),()=>this.close()]),!1}}class AdminSettingsPackages extends AbstractViewSettings{constructor(){super(),this.addSettings(["pluginsEnable"]),W(this,{packagesError:"",search:""}),this.packages=Ve,z(this,{packagesCurrent:()=>Ve().filter((e=>e?.installed&&!e.canBeUpdated)),packagesUpdate:()=>Ve().filter((e=>e?.installed&&e.canBeUpdated)),packagesAvailable:()=>Ve().filter((e=>!e?.installed)),visibility:()=>Ve.loading()?"visible":"hidden"}),this.search.subscribe((e=>{const t=e.toLowerCase(),s=(e,t,s)=>e.querySelectorAll(t).forEach(s);t.length?s(this.viewModelDom,"td:first-child",(e=>{e.parentNode.hidden=!e.textContent.toLowerCase().includes(t)})):s(this.viewModelDom,"tr[hidden]",(e=>e.hidden=!1))}))}onShow(){this.packagesError("")}onBuild(e){Ve.fetch(),e.addEventListener("click",(t=>{let s=t.target.closestWithin(".package-configure",e),i=s&&ko.dataFor(s);i&&ce.request("AdminPluginLoad",((e,t)=>e||Pe(PluginPopupView,[t.Result])),{id:i.id}),s=t.target.closestWithin(".package-active",e),i=s&&ko.dataFor(s),i&&this.disablePlugin(i)}))}requestHelper(e,t){return(s,i)=>{Ve.forEach((t=>{e&&t?.loading?.()&&e.file===t.file&&(e.loading(!1),t.loading(!1))})),s?this.packagesError(q(t?a.CantInstallPackage:a.CantDeletePackage)+(i.message?":\n"+i.message:"")):i.Result.Reload?location.reload():Ve.fetch()}}deletePackage(e){e&&(e.loading(!0),ce.request("AdminPackageDelete",this.requestHelper(e,!1),{id:e.id}))}installPackage(e){e&&(e.loading(!0),ce.request("AdminPackageInstall",this.requestHelper(e,!0),{id:e.id,type:e.type,file:e.file},6e4))}disablePlugin(e){let t=e.enabled();e.enabled(!t),ce.request("AdminPluginDisable",((s,i)=>{s&&(e.enabled(t),this.packagesError(a.UnsupportedPluginPackage===s&&i?.message?i.message:q(s)))}),{id:e.id,disabled:t?1:0})}}class AdminSettingsAbout{constructor(){this.version=A.app("version"),this.phpextensions=ko.observableArray(),W(this,{coreReal:!0,coreUpdatable:!0,coreWarning:!1,coreVersion:"",coreVersionCompare:-2,php64:!0,load1:0,load5:0,load15:0,errorDesc:""}),this.coreChecking=ko.observable(!1).extend({throttle:100}),this.coreUpdating=ko.observable(!1).extend({throttle:100}),this.coreVersionHtmlDesc=ko.computed((()=>(O(),U("TAB_ABOUT/HTML_NEW_VERSION",{VERSION:this.coreVersion()})))),this.statusType=ko.computed((()=>{let e="";const t=this.coreVersionCompare(),s=this.coreChecking(),i=this.coreUpdating(),a=this.coreReal();return s?e="checking":i?e="updating":a?0===t?e="up-to-date":-1===t&&(e="available"):(e="error",this.errorDesc("Cannot access the repository at the moment.")),e}))}onBuild(){this.coreChecking(!0),ce.request("AdminInfo",((e,t)=>{this.coreChecking(!1),t=t?.Result,!e&&t?(this.load1(t.system.load?.[0]),this.load5(t.system.load?.[1]),this.load15(t.system.load?.[2]),this.phpextensions(t.php),this.coreReal(!0),this.coreUpdatable(!!t.core.updatable),this.coreWarning(!!t.core.warning),this.coreVersion(t.core.version||""),this.coreVersionCompare(t.core.versionCompare),this.php64(t.php[1].loaded)):(this.coreReal(!1),this.coreWarning(!1),this.coreVersion(""),this.coreVersionCompare(-2))}))}clearCache(){ce.request("AdminClearCache")}updateCoreData(){this.coreUpdating()||(this.coreUpdating(!0),ce.request("AdminUpgradeCore",((e,t)=>{this.coreUpdating(!1),this.coreVersion(""),this.coreVersionCompare(-2),!e&&t?.Result?(this.coreReal(!0),window.location.reload()):this.coreReal(!1)}),{},9e4))}}class AdminSettingsBranding extends AbstractViewSettings{constructor(){super(),this.addSetting("title"),this.addSetting("loadingDescription"),this.addSetting("faviconUrl")}}class AdminSettingsConfig{constructor(){this.config=ko.observableArray(),this.search=ko.observable(""),this.saved=ko.observable(!1).extend({falseTimeout:5e3}),this.search.subscribe((e=>{const t=e.toLowerCase(),s=(e,t,s)=>e.querySelectorAll(t).forEach(s),i=e=>e.textContent.toLowerCase().includes(t);t.length?s(this.viewModelDom,"tbody",(e=>{let t=i(e.querySelector("th"));t?s(e,"[hidden]",(e=>e.hidden=!1)):s(e,"tbody td:first-child",(e=>{let s=!i(e);t=t||!s,e.parentNode.hidden=s})),e.hidden=!t})):s(this.viewModelDom,"table [hidden]",(e=>e.hidden=!1))}))}beforeShow(){ce.request("AdminSettingsGet",((e,t)=>{if(!e){const e=[],s=(e,t)=>{switch(typeof e){case"boolean":return"checkbox";case"number":return"number"}return t?"password":"text"};c(t.Result,((t,i)=>{const a={name:t,items:[]};c(i,((e,i)=>{"language"===e?i[2]="webmail"===t?V.languages:w("languages"):"theme"===e&&(i[2]=X.themes),"admin_password"===e||a.items.push({key:`config[${t}][${e}]`,name:e,value:i[0],type:s(i[0],e.includes("password")),comment:i[1],options:i[2]})})),e.push(a)})),this.config(e)}}))}saveConfig(e){const t=new FormData(e),s={};this.config.forEach((e=>{s[e.name]||(s[e.name]={}),e.items.forEach((i=>{let a=t.get(i.key);switch(typeof i.value){case"boolean":a="on"==a;break;case"number":a=parseInt(a,10)}s[e.name][i.name]=a}))})),ce.post("AdminSettingsSet",null,{config:s}).then((e=>{e.Result&&this.saved(!0)}))}}class MenuSettingsAdminView extends AbstractViewLeft{constructor(e){super("AdminMenu"),this.menu=e.menu}link(e){return"#/"+e}}class PaneSettingsAdminView extends AbstractViewRight{constructor(){super("AdminPane"),this.toggleLeftPanel=E}logoutClick(){ce.request("AdminLogout",(()=>rl.logoutReload()))}}class SettingsAdminScreen extends AbstractSettingsScreen{constructor(){super([MenuSettingsAdminView,PaneSettingsAdminView]),[AdminSettingsGeneral,AdminSettingsDomains,AdminSettingsLogin,AdminSettingsBranding,AdminSettingsContacts,AdminSettingsSecurity,AdminSettingsPackages,AdminSettingsConfig,AdminSettingsAbout].forEach(((e,t)=>he(e,0,0,0,0===t))),(!0?ye:Le).forEach((e=>he(...e)))}onShow(){rl.setTitle()}}class AdminLoginView extends AbstractViewLogin{constructor(){super("AdminLogin"),W(this,{login:"",password:"",totp:"",loginError:!1,passwordError:!1,submitRequest:!1,submitError:""}),j(this,{login:()=>this.loginError(!1),password:()=>this.passwordError(!1)}),Ce(this,{submitCommand:e=>!e.submitRequest()})}hideError(){this.submitError("")}submitCommand(e,t){let s=t.target.form,i=new FormData(s),a=s.reportValidity()&&C("sm-admin-login",i,1);return this.loginError(!this.login()),this.passwordError(!this.password()),this.formError(!a),a&&(this.submitRequest(!0),ce.request("AdminLogin",((e,t)=>{C("sm-admin-login-response",{error:e,data:t}),e?(this.submitRequest(!1),this.submitError(q(e))):rl.setData(t.Result)}),i)),a}}class LoginAdminScreen extends AbstractScreen{constructor(){super("login",[AdminLoginView])}onShow(){rl.setTitle()}}class SelectComponent{constructor(e){this.value=e.value,this.label=e.label,this.trigger=e.trigger?.subscribe?e.trigger:null,this.placeholder=e.placeholder,this.options=e.options,this.optionsText=e.optionsText,this.optionsValue=e.optionsValue;let t=0<e.size?"span"+e.size:"";if(this.trigger){const e=ko.observable(""),a=t=>{switch(t){case s:e("success");break;case i:e("error");break;default:e("")}};a(this.trigger()),this.className=Q((()=>(t+" settings-save-trigger-input "+e()).trim())),this.disposables=[this.trigger.subscribe(a,this),this.className]}else this.className=t;this.defaultOptionsAfterRender=h}dispose(){this.disposables?.forEach(Y)}}class CheckboxComponent{constructor(e={}){this.name=e.name,this.value=ko.isObservable(e.value)?e.value:ko.observable(!!e.value),this.enable=ko.isObservable(e.enable)?e.enable:ko.observable(e.enable??1),this.label=e.label}click(){this.enable()&&this.value(!this.value())}}class AbstractApp{constructor(e){this.Remote=e}logoutReload(e){Ee(!1),e=e||(D()?M():_),location.href!==e?setTimeout((()=>location.href=e),100):rl.route.reload()}bootstart(){const e=(e,t)=>ko.components.register(e,{template:{element:t.name},viewModel:{createViewModel:(e,s)=>(e=e||{},H(s.element),new t(e))}});var t,s;e("Select",SelectComponent),e("Checkbox",CheckboxComponent),t?.(),t&&O.subscribe(t),s&&O.subscribe(s),V.populate(),ee(),this.start()}}var Ie;AskPopupView.credentials=function(e,t){return new Promise((s=>{this.showModal([e,e=>s({username:e.username(),password:e.passphrase()}),()=>s(null),!0,3,t])}))},Ie=new class AdminApp extends AbstractApp{constructor(){super(ce),this.weakPassword=ko.observable(!1)}refresh(){ee(),this.start()}start(){w("allowed")?v("Auth")?(this.weakPassword(v("weakPassword")),Te([SettingsAdminScreen])):Te([LoginAdminScreen]):(rl.route.root(),setTimeout((()=>location.href="/"),1))}},rl.app=Ie,rl.logoutReload=Ie.logoutReload,rl.i18n=U,rl.Enums={StorageResultType:{Success:0,Error:1,Abort:2}},rl.route={root:()=>{rl.route.off(),hasher.setHash("#/")},reload:()=>{rl.route.root(),setTimeout((()=>location.reload()),100)},off:()=>hasher.active=!1,on:()=>hasher.active=!0}}();
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings