e5fc1bd574
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
596 lines
No EOL
33 KiB
HTML
596 lines
No EOL
33 KiB
HTML
<!--
|
|
Copyright (C) 2024 Nicola Murino
|
|
|
|
This WebUI uses the KeenThemes Mega Bundle, a proprietary theme:
|
|
|
|
https://keenthemes.com/products/templates-mega-bundle
|
|
|
|
KeenThemes HTML/CSS/JS components are allowed for use only within the
|
|
SFTPGo product and restricted to be used in a resealable HTML template
|
|
that can compete with KeenThemes products anyhow.
|
|
|
|
This WebUI is allowed for use only within the SFTPGo product and
|
|
therefore cannot be used in derivative works/products without an
|
|
explicit grant from the SFTPGo Team (support@sftpgo.com).
|
|
-->
|
|
{{template "base" .}}
|
|
|
|
{{- define "page_body"}}
|
|
<div class="card shadow-sm">
|
|
<div class="card-header bg-light">
|
|
<h3 data-i18n="{{.Title}}" class="card-title section-title"></h3>
|
|
</div>
|
|
<div class="card-body">
|
|
{{- template "errmsg" .Error}}
|
|
<div class="accordion" id="accordion_configs">
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="accordion_header_sftp">
|
|
<button class="accordion-button section-title-inner text-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#accordion_sftp_body" aria-expanded="{{if eq .ConfigSection 1}}true{{else}}false{{end}}" aria-controls="accordion_sftp_body">
|
|
<span data-i18n="storage.sftp">SFTP</span>
|
|
</button>
|
|
</h2>
|
|
<div id="accordion_sftp_body" class="accordion-collapse collapse {{if eq .ConfigSection 1}}show{{end}}" aria-labelledby="accordion_header_sftp" data-bs-parent="#accordion_configs">
|
|
<div class="accordion-body">
|
|
{{- template "infomsg" "sftp.help"}}
|
|
|
|
<form id="configs_sftp_form" action="{{.CurrentURL}}" method="POST" autocomplete="off">
|
|
<div class="form-group row">
|
|
<label for="idHostKeyAlgos" data-i18n="sftp.host_key_algos" class="col-md-3 col-form-label">
|
|
Host Key Algos
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idHostKeyAlgos" name="sftp_host_key_algos" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple>
|
|
{{- range $val := .Configs.SFTPD.GetSupportedHostKeyAlgos}}
|
|
<option value="{{$val}}" {{range $algo :=$.Configs.SFTPD.HostKeyAlgos }}{{if eq $algo $val}}selected{{end}}{{end}}>{{$val}}</option>
|
|
{{- end}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idPubKeyAlgos" data-i18n="status.ssh_pub_key_algo" class="col-md-3 col-form-label">
|
|
Public Key Algos
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idPubKeyAlgos" name="sftp_pub_key_algos" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple>
|
|
{{- range $val := .Configs.SFTPD.GetSupportedPublicKeyAlgos}}
|
|
<option value="{{$val}}" {{range $algo :=$.Configs.SFTPD.PublicKeyAlgos }}{{if eq $algo $val}}selected{{end}}{{end}}>{{$val}}</option>
|
|
{{- end}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idKEXAlgos" data-i18n="status.ssh_kex_algo" class="col-md-3 col-form-label">
|
|
KEX Algos
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idKEXAlgos" name="sftp_kex_algos" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple>
|
|
{{- range $val := .Configs.SFTPD.GetSupportedKEXAlgos}}
|
|
<option value="{{$val}}" {{range $algo :=$.Configs.SFTPD.KexAlgorithms }}{{if eq $algo $val}}selected{{end}}{{end}}>{{$val}}</option>
|
|
{{- end}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idMACAlgos" data-i18n="status.ssh_mac_algo" class="col-md-3 col-form-label">
|
|
MAC Algos
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idMACAlgos" name="sftp_macs" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple>
|
|
{{- range $val := .Configs.SFTPD.GetSupportedMACs}}
|
|
<option value="{{$val}}" {{range $algo :=$.Configs.SFTPD.MACs }}{{if eq $algo $val}}selected{{end}}{{end}}>{{$val}}</option>
|
|
{{- end}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idCiphers" data-i18n="status.ssh_cipher_algo" class="col-md-3 col-form-label">
|
|
KEX Algos
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idCiphers" name="sftp_ciphers" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple>
|
|
{{range $val := .Configs.SFTPD.GetSupportedCiphers}}
|
|
<option value="{{$val}}" {{range $algo :=$.Configs.SFTPD.Ciphers }}{{if eq $algo $val}}selected{{end}}{{end}}>{{$val}}</option>
|
|
{{end}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-end mt-12">
|
|
<input type="hidden" name="_form_token" value="{{.CSRFToken}}">
|
|
<input type="hidden" name="form_action" value="sftp_submit">
|
|
<button type="submit" id="sftp_form_submit" class="btn btn-primary px-10">
|
|
<span data-i18n="general.submit" class="indicator-label">
|
|
Submit
|
|
</span>
|
|
<span data-i18n="general.wait" class="indicator-progress">
|
|
Please wait...
|
|
<span class="spinner-border spinner-border-sm align-middle ms-2"></span>
|
|
</span>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="accordion_header_acme">
|
|
<button class="accordion-button section-title-inner text-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#accordion_acme_body" aria-expanded="{{if eq .ConfigSection 2}}true{{else}}false{{end}}" aria-controls="accordion_acme_body">
|
|
<span data-i18n="acme.title">ACME</span>
|
|
</button>
|
|
</h2>
|
|
<div id="accordion_acme_body" class="accordion-collapse collapse {{if eq .ConfigSection 2}}show{{end}}" aria-labelledby="accordion_header_acme" data-bs-parent="#accordion_configs">
|
|
<div class="accordion-body">
|
|
{{- template "infomsg" "acme.help"}}
|
|
|
|
<form id="configs_acme_form" action="{{.CurrentURL}}" method="POST" autocomplete="off">
|
|
|
|
<div class="form-group row">
|
|
<label for="idACMEDomain" data-i18n="general.domain" class="col-md-3 col-form-label">Domain</label>
|
|
<div class="col-md-9">
|
|
<input id="idACMEDomain" type="text" class="form-control" name="acme_domain" value="{{.Configs.ACME.Domain}}" aria-describedby="idACMEDomainHelp" />
|
|
<div id="idACMEDomainHelp" class="form-text" data-i18n="acme.domain_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idACMEEmail" data-i18n="general.email" class="col-md-3 col-form-label">Email</label>
|
|
<div class="col-md-9">
|
|
<input id="idACMEEmail" type="email" class="form-control" placeholder="" name="acme_email" value="{{.Configs.ACME.Email}}" aria-describedby="idACMEEmailHelp"
|
|
maxlength="255" autocomplete="off" spellcheck="false" />
|
|
<div id="idACMEEmailHelp" class="form-text" data-i18n="acme.email_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idACMEPort" data-i18n="general.port" class="col-md-3 col-form-label">Port</label>
|
|
<div class="col-md-9">
|
|
<input id="idACMEPort" type="number" min="1" max="65535" class="form-control" name="acme_port" value="{{.Configs.ACME.HTTP01Challenge.Port}}" aria-describedby="idACMEPortHelp" />
|
|
<div id="idACMEPortHelp" class="form-text" data-i18n="acme.port_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idACMEProtocols" data-i18n="ip_list.protocols" class="col-md-3 col-form-label">
|
|
Protocols
|
|
</label>
|
|
<div class="col-md-9">
|
|
<select id="idACMEProtocols" name="acme_protocols" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple aria-describedby="idACMEProtocolsHelp">
|
|
<option value="1" {{if .Configs.ACME.HasProtocol "HTTP"}}selected{{end}}>HTTP</option>
|
|
<option value="2" {{if .Configs.ACME.HasProtocol "FTP"}}selected{{end}}>FTP</option>
|
|
<option value="3" {{if .Configs.ACME.HasProtocol "DAV"}}selected{{end}}>DAV</option>
|
|
</select>
|
|
<div id="idACMEProtocolsHelp" class="form-text" data-i18n="acme.protocols_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-end mt-12">
|
|
<input type="hidden" name="_form_token" value="{{.CSRFToken}}">
|
|
<input type="hidden" name="form_action" value="acme_submit">
|
|
<button type="submit" id="acme_form_submit" class="btn btn-primary px-10">
|
|
<span data-i18n="general.submit" class="indicator-label">
|
|
Submit
|
|
</span>
|
|
<span data-i18n="general.wait" class="indicator-progress">
|
|
Please wait...
|
|
<span class="spinner-border spinner-border-sm align-middle ms-2"></span>
|
|
</span>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="accordion_header_smtp">
|
|
<button class="accordion-button section-title-inner text-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#accordion_smtp_body" aria-expanded="{{if eq .ConfigSection 3}}true{{else}}false{{end}}" aria-controls="accordion_smtp_body">
|
|
<span data-i18n="smtp.title">SMTP</span>
|
|
</button>
|
|
</h2>
|
|
<div id="accordion_smtp_body" class="accordion-collapse collapse {{if eq .ConfigSection 3}}show{{end}}" aria-labelledby="accordion_header_smtp" data-bs-parent="#accordion_configs">
|
|
<div class="accordion-body">
|
|
{{- template "infomsg" "smtp.help"}}
|
|
|
|
<form id="configs_smtp_form" action="{{.CurrentURL}}" method="POST" autocomplete="off">
|
|
|
|
<div class="form-group row">
|
|
<label for="idSMTPHost" data-i18n="smtp.host" class="col-md-3 col-form-label">Server name</label>
|
|
<div class="col-md-5">
|
|
<input id="idSMTPHost" type="text" class="form-control" name="smtp_host" value="{{.Configs.SMTP.Host}}" maxlength="512" spellcheck="false" aria-describedby="idSMTPHostHelp" />
|
|
<div id="idSMTPHostHelp" class="form-text" data-i18n="smtp.host_help"></div>
|
|
</div>
|
|
<div class="col-md-1"></div>
|
|
<label for="idSMTPPort" data-i18n="general.port" class="col-md-1 col-form-label">Port</label>
|
|
<div class="col-md-2">
|
|
<input id="idSMTPPort" type="number" min="1" max="65535" class="form-control" name="smtp_port" value="{{.Configs.SMTP.Port}}"/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idSMTPUsername" data-i18n="login.username" class="col-md-3 col-form-label">Username</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPUsername" type="text" placeholder="" name="smtp_username" value="{{.Configs.SMTP.User}}" maxlength="255" autocomplete="off"
|
|
spellcheck="false" class="form-control" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idSMTPPassword" data-i18n="login.password" class="col-md-3 col-form-label">Password</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPPassword" type="password" class="form-control" name="smtp_password" autocomplete="new-password"
|
|
spellcheck="false" value="{{if .Configs.SMTP.Password.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.Configs.SMTP.Password.GetPayload}}{{end}}" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idSMTPAuth" data-i18n="smtp.auth" class="col-md-3 col-form-label">Auth</label>
|
|
<div class="col-md-3">
|
|
<select id="idSMTPAuth" name="smtp_auth" class="form-select" data-control="i18n-select2" data-hide-search="true">
|
|
<option value="0" {{if eq .Configs.SMTP.AuthType 0}}selected{{end}}>Plain</option>
|
|
<option value="1" {{if eq .Configs.SMTP.AuthType 1}}selected{{end}}>Login</option>
|
|
<option value="2" {{if eq .Configs.SMTP.AuthType 2}}selected{{end}}>CRAM-MD5</option>
|
|
<option value="3" {{if eq .Configs.SMTP.AuthType 3}}selected{{end}}>OAuth2</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-1"></div>
|
|
<label for="idSMTPEncryption" data-i18n="smtp.encryption" class="col-md-2 col-form-label">Encryption</label>
|
|
<div class="col-md-3">
|
|
<select id="idSMTPEncryption" name="smtp_encryption" class="form-select" data-control="i18n-select2" data-hide-search="true">
|
|
<option value="0" {{if eq .Configs.SMTP.Encryption 0}}selected{{end}}>---</option>
|
|
<option value="1" {{if eq .Configs.SMTP.Encryption 1}}selected{{end}}>TLS</option>
|
|
<option value="2" {{if eq .Configs.SMTP.Encryption 2}}selected{{end}}>STARTTLS</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row smtp-oauth2 mt-10">
|
|
<label for="idSMTPOAuth2Provider" data-i18n="smtp.oauth2_provider" class="col-md-3 col-form-label">OAuth2 provider</label>
|
|
<div class="col-md-9">
|
|
<select id="idSMTPOAuth2Provider" name="smtp_oauth2_provider" class="form-select" data-control="i18n-select2" data-hide-search="true" aria-describedby="idSMTPOAuth2ProviderHelp">
|
|
<option value="0" {{if eq .Configs.SMTP.OAuth2.Provider 0}}selected{{end}}>Google</option>
|
|
<option value="1" {{if eq .Configs.SMTP.OAuth2.Provider 1}}selected{{end}}>Microsoft</option>
|
|
</select>
|
|
<div id="idSMTPOAuth2ProviderHelp" class="form-text"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row smtp-oauth2 smtp-oauth2-microsoft mt-10">
|
|
<label for="idSMTPOauth2Tenant" data-i18n="smtp.oauth2_tenant" class="col-md-3 col-form-label">OAuth2 Tenant</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPOauth2Tenant" type="text" class="form-control" name="smtp_oauth2_tenant" value="{{.Configs.SMTP.OAuth2.Tenant}}" aria-describedby="idSMTPOauth2TenantHelp" />
|
|
<div id="idSMTPOauth2TenantHelp" class="form-text" data-i18n="smtp.oauth2_tenant_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row smtp-oauth2 mt-10">
|
|
<label for="idSMTPOauth2ClientID" data-i18n="smtp.oauth2_client_id" class="col-md-3 col-form-label">OAuth2 Client ID</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPOauth2ClientID" type="text" class="form-control" name="smtp_oauth2_client_id" value="{{.Configs.SMTP.OAuth2.ClientID}}" spellcheck="false" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row smtp-oauth2 mt-10">
|
|
<label for="idSMTPOAuth2ClientSecret" data-i18n="smtp.oauth2_client_secret" class="col-md-3 col-form-label">OAuth2 Client secret</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPOAuth2ClientSecret" type="password" class="form-control" name="smtp_oauth2_client_secret" spellcheck="false" autocomplete="new-password"
|
|
value="{{if .Configs.SMTP.OAuth2.ClientSecret.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.Configs.SMTP.OAuth2.ClientSecret.GetPayload}}{{end}}" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row smtp-oauth2 mt-10">
|
|
<label for="idSMTPOAuth2RefreshToken" data-i18n="smtp.oauth2_token" class="col-md-3 col-form-label">OAuth2 Token</label>
|
|
<div class="col-md-9">
|
|
<div class="input-group">
|
|
<input id="idSMTPOAuth2RefreshToken" type="password" class="form-control rounded-left" name="smtp_oauth2_refresh_token" spellcheck="false" autocomplete="new-password"
|
|
value="{{if .Configs.SMTP.OAuth2.RefreshToken.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.Configs.SMTP.OAuth2.RefreshToken.GetPayload}}{{end}}" />
|
|
<button id="refresh_token_button" type="button" class="btn btn-primary">
|
|
<span data-i18n="general.get">Get</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idSMTPFrom" data-i18n="smtp.sender" class="col-md-3 col-form-label">From</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPFrom" type="text" placeholder="" name="smtp_from" value="{{.Configs.SMTP.From}}" maxlength="512" autocomplete="off"
|
|
spellcheck="false" class="form-control" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<label for="idSMTPDomain" data-i18n="general.domain" class="col-md-3 col-form-label">Domain</label>
|
|
<div class="col-md-9">
|
|
<input id="idSMTPDomain" type="text" placeholder="" name="smtp_domain" value="{{.Configs.SMTP.Domain}}" maxlength="512"
|
|
spellcheck="false" class="form-control" aria-describedby="idSMTPDomainHelp" />
|
|
<div id="idSMTPDomainHelp" class="form-text" data-i18n="smtp.domain_help"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row align-items-center mt-10">
|
|
<label data-i18n="smtp.debug" class="col-md-3 col-form-label" for="idSMTPDebug">Debug logs</label>
|
|
<div class="col-md-9">
|
|
<div class="form-check form-switch form-check-custom form-check-solid">
|
|
<input class="form-check-input" type="checkbox" id="idSMTPDebug" name="smtp_debug" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row mt-10">
|
|
<div class="col-md-12">
|
|
<div class="input-group">
|
|
<input id="idSMTPRecipient" type="email" class="form-control rounded-left" name="smtp_oauth2_refresh_token"
|
|
data-i18n="[placeholder]smtp.test_recipient" spellcheck="false" />
|
|
<button id="smtp_test_button" type="button" class="btn btn-primary">
|
|
<span data-i18n="general.test">Test</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-end mt-12">
|
|
<input type="hidden" name="_form_token" value="{{.CSRFToken}}">
|
|
<input type="hidden" name="form_action" value="smtp_submit">
|
|
<button type="submit" id="smtp_form_submit" class="btn btn-primary px-10">
|
|
<span data-i18n="general.submit" class="indicator-label">
|
|
Submit
|
|
</span>
|
|
<span data-i18n="general.wait" class="indicator-progress">
|
|
Please wait...
|
|
<span class="spinner-border spinner-border-sm align-middle ms-2"></span>
|
|
</span>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{- end}}
|
|
|
|
{{- define "extra_js"}}
|
|
<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
|
|
function onSMTPOAuth2ProviderChanged(val){
|
|
if (val == '1'){
|
|
$('.smtp-oauth2-microsoft').show();
|
|
return;
|
|
}
|
|
$('.smtp-oauth2-microsoft').hide();
|
|
}
|
|
|
|
function onSMTPAuthChanged(val){
|
|
if (val == '3'){
|
|
$('.smtp-oauth2').show();
|
|
onSMTPOAuth2ProviderChanged($('#idSMTPOAuth2Provider').val());
|
|
return;
|
|
}
|
|
$('.smtp-oauth2').hide();
|
|
}
|
|
|
|
function getRefreshToken() {
|
|
let clientID = $('#idSMTPOauth2ClientID').val();
|
|
let clientSecret = $('#idSMTPOAuth2ClientSecret').val();
|
|
if (!clientID){
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.client_id_required'),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
if (!clientSecret){
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.client_secret_required'),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
$('#loading_message').text("");
|
|
KTApp.showPageLoading();
|
|
|
|
let data = {"base_redirect_url": getCurrentURI(), "provider": parseInt($('#idSMTPOAuth2Provider').val()),
|
|
"tenant": $('#idSMTPOauth2Tenant').val(), "client_id": clientID,
|
|
"client_secret": clientSecret};
|
|
|
|
axios.post("{{.OAuth2TokenURL}}", data, {
|
|
timeout: 15000,
|
|
headers: {
|
|
'X-CSRF-TOKEN': '{{.CSRFToken}}'
|
|
},
|
|
validateStatus: function (status) {
|
|
return status == 200;
|
|
}
|
|
}).then(function (response){
|
|
KTApp.hidePageLoading();
|
|
if (response.data && response.data.message){
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.oauth2_question'),
|
|
icon: "success",
|
|
confirmButtonText: $.t('general.confirm'),
|
|
cancelButtonText: $.t('general.cancel'),
|
|
customClass: {
|
|
confirmButton: "btn btn-danger",
|
|
cancelButton: 'btn btn-secondary'
|
|
}
|
|
}).then((result) => {
|
|
if (result.isConfirmed){
|
|
window.open(response.data.message,'_blank');
|
|
}
|
|
});
|
|
} else {
|
|
ModalAlert.fire({
|
|
text: $.t("smtp.oauth2_flow_error"),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
}
|
|
}).catch(function (error){
|
|
KTApp.hidePageLoading();
|
|
ModalAlert.fire({
|
|
text: $.t("smtp.oauth2_flow_error"),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function testSMTP() {
|
|
let recipient = $('#idSMTPRecipient').val();
|
|
if (!recipient){
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.recipient_required'),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
let authType = parseInt($('#idSMTPAuth').val());
|
|
let clientID = $('#idSMTPOauth2ClientID').val();
|
|
let clientSecret = $('#idSMTPOAuth2ClientSecret').val();
|
|
let refreshToken = $('#idSMTPOAuth2RefreshToken').val();
|
|
if (authType === 3){
|
|
let message;
|
|
if (!clientID){
|
|
message = "smtp.client_id_required";
|
|
}
|
|
if (!clientSecret){
|
|
message = "smtp.client_secret_required";
|
|
}
|
|
if (!refreshToken){
|
|
message = "smtp.refresh_token_required"
|
|
}
|
|
if (message){
|
|
ModalAlert.fire({
|
|
text: $.t(message),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
$('#loading_message').text("");
|
|
KTApp.showPageLoading();
|
|
let debug = 0;
|
|
if ($('#idSMTPDebug').is(':checked')){
|
|
debug = 1;
|
|
}
|
|
|
|
let data = {"host": $('#idSMTPHost').val(),"port": parseInt($('#idSMTPPort').val()),
|
|
"from": $('#idSMTPFrom').val(),"user": $('#idSMTPUsername').val(),"password": $('#idSMTPPassword').val(),
|
|
"auth_type": authType,"encryption": parseInt($('#idSMTPEncryption').val()),
|
|
"domain": $('#idSMTPDomain').val(),"debug": debug, "oauth2": {"provider": parseInt($('#idSMTPOAuth2Provider').val()),
|
|
"tenant": $('#idSMTPOauth2Tenant').val(), "client_id": clientID,
|
|
"client_secret": clientSecret, "refresh_token": refreshToken},
|
|
"recipient": recipient};
|
|
|
|
axios.post("{{.ConfigsURL}}/smtp/test", data, {
|
|
timeout: 15000,
|
|
headers: {
|
|
'X-CSRF-TOKEN': '{{.CSRFToken}}'
|
|
},
|
|
validateStatus: function (status) {
|
|
return status == 200;
|
|
}
|
|
}).then(function (response){
|
|
KTApp.hidePageLoading();
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.test_ok'),
|
|
icon: "success",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: 'btn btn-primary'
|
|
}
|
|
});
|
|
}).catch(function (error){
|
|
KTApp.hidePageLoading();
|
|
ModalAlert.fire({
|
|
text: $.t('smtp.test_error'),
|
|
icon: "warning",
|
|
confirmButtonText: $.t('general.ok'),
|
|
customClass: {
|
|
confirmButton: "btn btn-primary"
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
$(document).on("i18nload", function(){
|
|
$('#idSMTPAuth').on("change", function(){
|
|
onSMTPAuthChanged(this.value);
|
|
});
|
|
|
|
$('#idSMTPOAuth2Provider').on("change", function(){
|
|
onSMTPOAuth2ProviderChanged(this.value);
|
|
});
|
|
|
|
$('#refresh_token_button').on("click", function(e){
|
|
e.preventDefault();
|
|
this.blur();
|
|
getRefreshToken();
|
|
});
|
|
|
|
$('#smtp_test_button').on("click", function(e){
|
|
e.preventDefault();
|
|
this.blur();
|
|
testSMTP();
|
|
});
|
|
|
|
let currentURI = getCurrentURI();
|
|
let providerHelpText = $.t('smtp.oauth2_provider_help') + " \""+currentURI+"{{.OAuth2RedirectURL}}\"";
|
|
$('#idSMTPOAuth2ProviderHelp').text(providerHelpText);
|
|
onSMTPAuthChanged('{{.Configs.SMTP.AuthType}}');
|
|
onSMTPOAuth2ProviderChanged('{{.Configs.SMTP.OAuth2.Provider}}');
|
|
});
|
|
|
|
$(document).on("i18nload", function(){
|
|
$('#configs_sftp_form').submit(function (event) {
|
|
let submitButton = document.querySelector('#sftp_form_submit');
|
|
submitButton.setAttribute('data-kt-indicator', 'on');
|
|
submitButton.disabled = true;
|
|
});
|
|
|
|
$('#configs_acme_form').submit(function (event) {
|
|
let submitButton = document.querySelector('#acme_form_submit');
|
|
submitButton.setAttribute('data-kt-indicator', 'on');
|
|
submitButton.disabled = true;
|
|
});
|
|
|
|
$('#configs_smtp_form').submit(function (event) {
|
|
let submitButton = document.querySelector('#smtp_form_submit');
|
|
submitButton.setAttribute('data-kt-indicator', 'on');
|
|
submitButton.disabled = true;
|
|
});
|
|
});
|
|
</script>
|
|
{{- end}} |