Upstream proxmox-git/proxmox-widget-toolkit state of the touched files before efab443387
This commit is contained in:
1 parent
7823b35e66
commit
0471e06161
1 file changed
+229
@@ -0,0 +1,229 @@
|
|||||||
|
Ext.define('Proxmox.window.ACMEDomainEdit', {
|
||||||
|
extend: 'Proxmox.window.Edit',
|
||||||
|
xtype: 'pmxACMEDomainEdit',
|
||||||
|
mixins: ['Proxmox.Mixin.CBind'],
|
||||||
|
|
||||||
|
subject: gettext('Domain'),
|
||||||
|
isCreate: false,
|
||||||
|
width: 450,
|
||||||
|
//onlineHelp: 'sysadmin_certificate_management',
|
||||||
|
|
||||||
|
acmeUrl: undefined,
|
||||||
|
|
||||||
|
// config url
|
||||||
|
url: undefined,
|
||||||
|
|
||||||
|
// For PMG the we have multiple certificates, so we have a "usage" attribute & column.
|
||||||
|
domainUsages: undefined,
|
||||||
|
|
||||||
|
// Force the use of 'acmedomainX' properties.
|
||||||
|
separateDomainEntries: undefined,
|
||||||
|
|
||||||
|
cbindData: function (config) {
|
||||||
|
let me = this;
|
||||||
|
return {
|
||||||
|
pluginsUrl: `/api2/json/${me.acmeUrl}/plugins`,
|
||||||
|
hasUsage: !!me.domainUsages,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
xtype: 'inputpanel',
|
||||||
|
onGetValues: function (values) {
|
||||||
|
let me = this;
|
||||||
|
let win = me.up('pmxACMEDomainEdit');
|
||||||
|
let nodeconfig = win.nodeconfig;
|
||||||
|
let olddomain = win.domain || {};
|
||||||
|
|
||||||
|
let params = {
|
||||||
|
digest: nodeconfig.digest,
|
||||||
|
};
|
||||||
|
|
||||||
|
let configkey = olddomain.configkey;
|
||||||
|
let acmeObj = Proxmox.Utils.parseACME(nodeconfig.acme);
|
||||||
|
|
||||||
|
let find_free_slot = () => {
|
||||||
|
for (let i = 0; i < Proxmox.Utils.acmedomain_count; i++) {
|
||||||
|
if (nodeconfig[`acmedomain${i}`] === undefined) {
|
||||||
|
return `acmedomain${i}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw Ext.String.format(
|
||||||
|
gettext('Cannot create more than {0} ACME domains.'),
|
||||||
|
Proxmox.Utils.acmedomain_count,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// If we have a 'usage' property (pmg), we only use the `acmedomainX` config keys.
|
||||||
|
if (win.separateDomainEntries || win.domainUsages) {
|
||||||
|
if (!configkey || configkey === 'acme') {
|
||||||
|
try {
|
||||||
|
configkey = find_free_slot();
|
||||||
|
} catch (e) {
|
||||||
|
Ext.Msg.alert(Proxmox.Utils.errorText, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete values.type;
|
||||||
|
params[configkey] = Proxmox.Utils.printPropertyString(values, 'domain');
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise we put the standalone entries into the `domains` list of the `acme`
|
||||||
|
// property string.
|
||||||
|
|
||||||
|
// Then insert the domain depending on its type:
|
||||||
|
if (values.type === 'dns') {
|
||||||
|
if (!olddomain.configkey || olddomain.configkey === 'acme') {
|
||||||
|
try {
|
||||||
|
configkey = find_free_slot();
|
||||||
|
} catch (e) {
|
||||||
|
Ext.Msg.alert(Proxmox.Utils.errorText, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
if (olddomain.domain) {
|
||||||
|
// we have to remove the domain from the acme domainlist
|
||||||
|
Proxmox.Utils.remove_domain_from_acme(acmeObj, olddomain.domain);
|
||||||
|
params.acme = Proxmox.Utils.printACME(acmeObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete values.type;
|
||||||
|
params[configkey] = Proxmox.Utils.printPropertyString(values, 'domain');
|
||||||
|
} else {
|
||||||
|
if (olddomain.configkey && olddomain.configkey !== 'acme') {
|
||||||
|
// delete the old dns entry, unless we need to declare its usage:
|
||||||
|
params.delete = [olddomain.configkey];
|
||||||
|
}
|
||||||
|
|
||||||
|
// add new, remove old and make entries unique
|
||||||
|
Proxmox.Utils.add_domain_to_acme(acmeObj, values.domain);
|
||||||
|
if (olddomain.domain !== values.domain) {
|
||||||
|
Proxmox.Utils.remove_domain_from_acme(acmeObj, olddomain.domain);
|
||||||
|
}
|
||||||
|
params.acme = Proxmox.Utils.printACME(acmeObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return params;
|
||||||
|
},
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxKVComboBox',
|
||||||
|
name: 'type',
|
||||||
|
fieldLabel: gettext('Challenge Type'),
|
||||||
|
allowBlank: false,
|
||||||
|
value: 'standalone',
|
||||||
|
comboItems: [
|
||||||
|
['standalone', 'HTTP'],
|
||||||
|
['dns', 'DNS'],
|
||||||
|
],
|
||||||
|
validator: function (value) {
|
||||||
|
let me = this;
|
||||||
|
let win = me.up('pmxACMEDomainEdit');
|
||||||
|
let oldconfigkey = win.domain ? win.domain.configkey : undefined;
|
||||||
|
let val = me.getValue();
|
||||||
|
if (val === 'dns' && (!oldconfigkey || oldconfigkey === 'acme')) {
|
||||||
|
// we have to check if there is a 'acmedomain' slot left
|
||||||
|
let found = false;
|
||||||
|
for (let i = 0; i < Proxmox.Utils.acmedomain_count; i++) {
|
||||||
|
if (!win.nodeconfig[`acmedomain${i}`]) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
return gettext('Only 5 Domains with type DNS can be configured');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
listeners: {
|
||||||
|
change: function (cb, value) {
|
||||||
|
let me = this;
|
||||||
|
let view = me.up('pmxACMEDomainEdit');
|
||||||
|
let pluginField = view.down('field[name=plugin]');
|
||||||
|
pluginField.setDisabled(value !== 'dns');
|
||||||
|
pluginField.setHidden(value !== 'dns');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'hidden',
|
||||||
|
name: 'alias',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'pmxACMEPluginSelector',
|
||||||
|
name: 'plugin',
|
||||||
|
disabled: true,
|
||||||
|
hidden: true,
|
||||||
|
allowBlank: false,
|
||||||
|
cbind: {
|
||||||
|
url: '{pluginsUrl}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
name: 'domain',
|
||||||
|
allowBlank: false,
|
||||||
|
vtype: 'DnsNameOrWildcard',
|
||||||
|
value: '',
|
||||||
|
fieldLabel: gettext('Domain'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'combobox',
|
||||||
|
name: 'usage',
|
||||||
|
multiSelect: true,
|
||||||
|
editable: false,
|
||||||
|
fieldLabel: gettext('Usage'),
|
||||||
|
cbind: {
|
||||||
|
hidden: '{!hasUsage}',
|
||||||
|
allowBlank: '{!hasUsage}',
|
||||||
|
},
|
||||||
|
fields: ['usage', 'name'],
|
||||||
|
displayField: 'name',
|
||||||
|
valueField: 'usage',
|
||||||
|
store: {
|
||||||
|
data: [
|
||||||
|
{ usage: 'api', name: 'API' },
|
||||||
|
{ usage: 'smtp', name: 'SMTP' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
initComponent: function () {
|
||||||
|
let me = this;
|
||||||
|
|
||||||
|
if (!me.url) {
|
||||||
|
throw 'no url given';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!me.acmeUrl) {
|
||||||
|
throw 'no acmeUrl given';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!me.nodeconfig) {
|
||||||
|
throw 'no nodeconfig given';
|
||||||
|
}
|
||||||
|
|
||||||
|
me.isCreate = !me.domain;
|
||||||
|
if (me.isCreate) {
|
||||||
|
me.domain = `${Proxmox.NodeName}.`; // TODO: FQDN of node
|
||||||
|
}
|
||||||
|
|
||||||
|
me.callParent();
|
||||||
|
|
||||||
|
if (!me.isCreate) {
|
||||||
|
let values = { ...me.domain };
|
||||||
|
if (Ext.isDefined(values.usage)) {
|
||||||
|
values.usage = values.usage.split(';');
|
||||||
|
}
|
||||||
|
me.setValues(values);
|
||||||
|
} else {
|
||||||
|
me.setValues({ domain: me.domain });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in new issue
Block a user