mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-15 12:15:20 +08:00
283 lines
6.6 KiB
JavaScript
283 lines
6.6 KiB
JavaScript
import { pInt, forEachObjectEntry } from 'Common/Utils';
|
|
import { i18n, getNotification } from 'Common/Translator';
|
|
|
|
import Remote from 'Remote/Admin/Fetch';
|
|
|
|
import { decorateKoCommands } from 'Knoin/Knoin';
|
|
import { AbstractViewPopup } from 'Knoin/AbstractViews';
|
|
|
|
import { DomainAdminStore } from 'Stores/Admin/Domain';
|
|
|
|
const domainToParams = oDomain => ({
|
|
Name: oDomain.name(),
|
|
|
|
IncHost: oDomain.imapHost(),
|
|
IncPort: oDomain.imapPort(),
|
|
IncSecure: oDomain.imapSecure(),
|
|
|
|
UseSieve: oDomain.useSieve() ? 1 : 0,
|
|
SieveHost: oDomain.sieveHost(),
|
|
SievePort: oDomain.sievePort(),
|
|
SieveSecure: oDomain.sieveSecure(),
|
|
|
|
OutHost: oDomain.smtpHost(),
|
|
OutPort: oDomain.smtpPort(),
|
|
OutSecure: oDomain.smtpSecure(),
|
|
OutAuth: oDomain.smtpAuth() ? 1 : 0,
|
|
OutUsePhpMail: oDomain.smtpPhpMail() ? 1 : 0
|
|
});
|
|
|
|
export class DomainPopupView extends AbstractViewPopup {
|
|
constructor() {
|
|
super('Domain');
|
|
|
|
this.addObservables(this.getDefaults());
|
|
this.addObservables({
|
|
edit: false,
|
|
|
|
saving: false,
|
|
|
|
testing: false,
|
|
testingDone: false,
|
|
testingImapError: false,
|
|
testingSieveError: false,
|
|
testingSmtpError: false,
|
|
testingImapErrorDesc: '',
|
|
testingSieveErrorDesc: '',
|
|
testingSmtpErrorDesc: '',
|
|
|
|
imapHostFocus: false,
|
|
sieveHostFocus: false,
|
|
smtpHostFocus: false,
|
|
});
|
|
|
|
this.addComputables({
|
|
headerText: () => {
|
|
const name = this.name(),
|
|
aliasName = this.aliasName();
|
|
|
|
let result = '';
|
|
|
|
if (this.edit()) {
|
|
result = i18n('POPUPS_DOMAIN/TITLE_EDIT_DOMAIN', { NAME: name });
|
|
if (aliasName) {
|
|
result += ' ⫘ ' + aliasName;
|
|
}
|
|
} else {
|
|
result = name
|
|
? i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME', { NAME: name })
|
|
: i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN');
|
|
}
|
|
|
|
return result;
|
|
},
|
|
|
|
domainDesc: () => {
|
|
const name = this.name();
|
|
return !this.edit() && name ? i18n('POPUPS_DOMAIN/NEW_DOMAIN_DESC', { NAME: '*@' + name }) : '';
|
|
},
|
|
|
|
domainIsComputed: () => {
|
|
const usePhpMail = this.smtpPhpMail(),
|
|
useSieve = this.useSieve();
|
|
|
|
return (
|
|
this.name() &&
|
|
this.imapHost() &&
|
|
this.imapPort() &&
|
|
(useSieve ? this.sieveHost() && this.sievePort() : true) &&
|
|
((this.smtpHost() && this.smtpPort()) || usePhpMail)
|
|
);
|
|
},
|
|
|
|
canBeTested: () => !this.testing() && this.domainIsComputed(),
|
|
canBeSaved: () => !this.saving() && this.domainIsComputed()
|
|
});
|
|
|
|
this.addSubscribables({
|
|
testingImapError: value => value || this.testingImapErrorDesc(''),
|
|
testingSieveError: value => value || this.testingSieveErrorDesc(''),
|
|
testingSmtpError: value => value || this.testingSmtpErrorDesc(''),
|
|
|
|
// smart form improvements
|
|
imapHostFocus: value =>
|
|
value && this.name() && !this.imapHost() && this.imapHost(this.name().replace(/[.]?[*][.]?/g, '')),
|
|
|
|
sieveHostFocus: value =>
|
|
value && this.imapHost() && !this.sieveHost() && this.sieveHost(this.imapHost()),
|
|
|
|
smtpHostFocus: value => value && this.imapHost() && !this.smtpHost()
|
|
&& this.smtpHost(this.imapHost().replace(/imap/gi, 'smtp')),
|
|
|
|
imapSecure: value => {
|
|
if (this.enableSmartPorts()) {
|
|
const port = pInt(this.imapPort());
|
|
switch (pInt(value)) {
|
|
case 0:
|
|
case 2:
|
|
if (993 === port) {
|
|
this.imapPort(143);
|
|
}
|
|
break;
|
|
case 1:
|
|
if (143 === port) {
|
|
this.imapPort(993);
|
|
}
|
|
break;
|
|
// no default
|
|
}
|
|
}
|
|
},
|
|
|
|
smtpSecure: value => {
|
|
if (this.enableSmartPorts()) {
|
|
const port = pInt(this.smtpPort());
|
|
switch (pInt(value)) {
|
|
case 0:
|
|
if (465 === port || 587 === port) {
|
|
this.smtpPort(25);
|
|
}
|
|
break;
|
|
case 1:
|
|
if (25 === port || 587 === port) {
|
|
this.smtpPort(465);
|
|
}
|
|
break;
|
|
case 2:
|
|
if (25 === port || 465 === port) {
|
|
this.smtpPort(587);
|
|
}
|
|
break;
|
|
// no default
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
decorateKoCommands(this, {
|
|
createOrAddCommand: self => self.canBeSaved(),
|
|
testConnectionCommand: self => self.canBeTested()
|
|
});
|
|
}
|
|
|
|
createOrAddCommand() {
|
|
this.saving(true);
|
|
Remote.request('AdminDomainSave',
|
|
this.onDomainCreateOrSaveResponse.bind(this),
|
|
Object.assign(domainToParams(this), {
|
|
Create: this.edit() ? 0 : 1,
|
|
|
|
IncShortLogin: this.imapShortLogin() ? 1 : 0,
|
|
|
|
OutShortLogin: this.smtpShortLogin() ? 1 : 0,
|
|
OutSetSender: this.smtpSetSender() ? 1 : 0,
|
|
|
|
WhiteList: this.whiteList()
|
|
})
|
|
);
|
|
}
|
|
|
|
testConnectionCommand() {
|
|
this.clearTesting(false);
|
|
this.testing(true);
|
|
|
|
Remote.request('AdminDomainTest',
|
|
(iError, oData) => {
|
|
this.testing(false);
|
|
if (iError) {
|
|
this.testingImapError(true);
|
|
this.testingSieveError(true);
|
|
this.testingSmtpError(true);
|
|
} else {
|
|
this.testingDone(true);
|
|
this.testingImapError(true !== oData.Result.Imap);
|
|
this.testingSieveError(true !== oData.Result.Sieve);
|
|
this.testingSmtpError(true !== oData.Result.Smtp);
|
|
|
|
if (this.testingImapError() && oData.Result.Imap) {
|
|
this.testingImapErrorDesc('');
|
|
this.testingImapErrorDesc(oData.Result.Imap);
|
|
}
|
|
|
|
if (this.testingSieveError() && oData.Result.Sieve) {
|
|
this.testingSieveErrorDesc('');
|
|
this.testingSieveErrorDesc(oData.Result.Sieve);
|
|
}
|
|
|
|
if (this.testingSmtpError() && oData.Result.Smtp) {
|
|
this.testingSmtpErrorDesc('');
|
|
this.testingSmtpErrorDesc(oData.Result.Smtp);
|
|
}
|
|
}
|
|
},
|
|
domainToParams(this)
|
|
);
|
|
}
|
|
|
|
onDomainCreateOrSaveResponse(iError) {
|
|
this.saving(false);
|
|
if (iError) {
|
|
this.savingError(getNotification(iError));
|
|
} else {
|
|
DomainAdminStore.fetch();
|
|
this.closeCommand();
|
|
}
|
|
}
|
|
|
|
clearTesting() {
|
|
this.testing(false);
|
|
this.testingDone(false);
|
|
this.testingImapError(false);
|
|
this.testingSieveError(false);
|
|
this.testingSmtpError(false);
|
|
}
|
|
|
|
onShow(oDomain) {
|
|
this.saving(false);
|
|
this.clearTesting();
|
|
this.clearForm();
|
|
if (oDomain) {
|
|
this.enableSmartPorts(false);
|
|
this.edit(true);
|
|
forEachObjectEntry(oDomain, (key, value) => this[key] && this[key](value));
|
|
this.enableSmartPorts(true);
|
|
}
|
|
}
|
|
|
|
getDefaults() {
|
|
return {
|
|
enableSmartPorts: false,
|
|
|
|
savingError: '',
|
|
|
|
name: '',
|
|
|
|
imapHost: '',
|
|
imapPort: 143,
|
|
imapSecure: 0,
|
|
imapShortLogin: false,
|
|
|
|
useSieve: false,
|
|
sieveHost: '',
|
|
sievePort: 4190,
|
|
sieveSecure: 0,
|
|
|
|
smtpHost: '',
|
|
smtpPort: 25,
|
|
smtpSecure: 0,
|
|
smtpShortLogin: false,
|
|
smtpAuth: true,
|
|
smtpSetSender: false,
|
|
smtpPhpMail: false,
|
|
|
|
whiteList: '',
|
|
aliasName: ''
|
|
};
|
|
}
|
|
|
|
clearForm() {
|
|
this.edit(false);
|
|
forEachObjectEntry(this.getDefaults(), (key, value) => this[key](value));
|
|
this.enableSmartPorts(true);
|
|
}
|
|
}
|