Ext.define('PBS.WebauthnConfigView', { extend: 'Proxmox.grid.ObjectGrid', alias: ['widget.pbsWebauthnConfigView'], url: "/api2/json/config/access/tfa/webauthn", cwidth1: 150, interval: 1000, rows: { rp: { header: gettext('Relying Party'), required: true, defaultValue: gettext('Not configured'), }, origin: { header: gettext('Origin'), required: true, defaultValue: gettext('Not configured'), }, id: { header: 'ID', required: true, defaultValue: gettext('Not configured'), }, }, tbar: [ { text: gettext("Edit"), handler: 'runEditor', }, ], controller: { xclass: 'Ext.app.ViewController', runEditor: () => Ext.create('PBS.WebauthnConfigEdit', { autoShow: true }), startStore: function() { this.getView().getStore().rstore.startUpdate(); }, stopStore: function() { this.getView().getStore().rstore.stopUpdate(); }, }, listeners: { itemdblclick: 'runEditor', activate: 'startStore', deactivate: 'stopStore', }, }); Ext.define('PBS.WebauthnConfigEdit', { extend: 'Proxmox.window.Edit', alias: ['widget.pbsWebauthnConfigEdit'], subject: gettext('Webauthn'), url: "/api2/extjs/config/access/tfa/webauthn", autoLoad: true, width: 512, fieldDefaults: { labelWidth: 120, }, setValues: function(values) { let me = this; me.relayingPartySet = values && typeof values.rp === 'string'; me.callParent(arguments); }, items: [ { xtype: 'textfield', fieldLabel: gettext('Relying Party'), name: 'rp', allowBlank: false, listeners: { dirtychange: function(field, isDirty) { let win = field.up('window'); let warningBox = win.down('box[id=rpChangeWarning]'); warningBox.setHidden(!win.relayingPartySet || !isDirty); }, }, }, { xtype: 'textfield', fieldLabel: gettext('Origin'), name: 'origin', allowBlank: false, }, { xtype: 'textfield', fieldLabel: 'ID', name: 'id', allowBlank: false, }, { xtype: 'container', layout: 'hbox', items: [ { xtype: 'box', flex: 1, }, { xtype: 'button', text: gettext('Auto-fill'), iconCls: 'fa fa-fw fa-pencil-square-o', handler: function(button, ev) { let panel = this.up('panel'); panel.down('field[name=rp]').setValue(document.location.hostname); panel.down('field[name=origin]').setValue(document.location.origin); panel.down('field[name=id]').setValue(document.location.hostname); }, }, ], }, { xtype: 'box', html: `${gettext('Note:')} ` + gettext('WebAuthn requires using a trusted certificate.'), }, { xtype: 'box', id: 'rpChangeWarning', hidden: true, padding: '5 0 0 0', html: ' ' + gettext('Changing the Relying Party may break existing webAuthn TFA entries.'), }, ], });