From 0e338b0530c35da21dd80e84b80c793eb9e236b8 Mon Sep 17 00:00:00 2001 From: Mechiel Lukkien Date: Sun, 10 Nov 2024 22:19:02 +0100 Subject: [PATCH] for aliases, enable "public posting" by default when creating an alias and explain in more detail what it means in the webadmin interface. will hopefully bring less confusion. for issue #244 by exander77, thanks for reporting --- doc.go | 2 +- main.go | 4 ++-- webadmin/admin.js | 4 ++-- webadmin/admin.ts | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/doc.go b/doc.go index c14170e55..9498ee0f5 100644 --- a/doc.go +++ b/doc.go @@ -1008,7 +1008,7 @@ Print settings and members of alias. # mox config alias add -Add new alias with one or more addresses. +Add new alias with one or more addresses and public posting enabled. usage: mox config alias add alias@domain rcpt1@domain ... diff --git a/main.go b/main.go index 0ac8c14df..8fbca8ab7 100644 --- a/main.go +++ b/main.go @@ -770,13 +770,13 @@ func ctlcmdConfigAliasPrint(ctl *ctl, address string) { func cmdConfigAliasAdd(c *cmd) { c.params = "alias@domain rcpt1@domain ..." - c.help = `Add new alias with one or more addresses.` + c.help = `Add new alias with one or more addresses and public posting enabled.` args := c.Parse() if len(args) < 2 { c.Usage() } - alias := config.Alias{Addresses: args[1:]} + alias := config.Alias{PostPublic: true, Addresses: args[1:]} mustLoadConfig() ctlcmdConfigAliasAdd(xctl(), args[0], alias) diff --git a/webadmin/admin.js b/webadmin/admin.js index 3e0f15dd7..735d0fb54 100644 --- a/webadmin/admin.js +++ b/webadmin/admin.js @@ -2358,7 +2358,7 @@ const domain = async (d) => { e.stopPropagation(); const alias = { Addresses: aliasAddresses.value.split('\n').map(s => s.trim()).filter(s => !!s), - PostPublic: false, + PostPublic: true, ListMembers: false, AllowMsgFrom: false, // Ignored: @@ -2554,7 +2554,7 @@ const domainAlias = async (d, aliasLocalpart) => { e.preventDefault(); e.stopPropagation(); check(aliasFieldset, client.AliasUpdate(aliasLocalpart, d, postPublic.checked, listMembers.checked, allowMsgFrom.checked)); - }, aliasFieldset = dom.fieldset(style({ display: 'flex', flexDirection: 'column', gap: '.5ex' }), dom.label(postPublic = dom.input(attr.type('checkbox'), alias.PostPublic ? attr.checked('') : []), ' Public, anyone can post instead of only members'), dom.label(listMembers = dom.input(attr.type('checkbox'), alias.ListMembers ? attr.checked('') : []), ' Members can list other members'), dom.label(allowMsgFrom = dom.input(attr.type('checkbox'), alias.AllowMsgFrom ? attr.checked('') : []), ' Allow messages to use the alias address in the message From header'), dom.div(style({ marginTop: '1ex' }), dom.submitbutton('Save')))), dom.br(), dom.h2('Members'), dom.p('Members receive messages sent to the alias. If a member address is in the message From header, the member will not receive the message.'), dom.table(dom.thead(dom.tr(dom.th('Address'), dom.th('Account'), dom.th())), dom.tbody((alias.Addresses || []).map((address, index) => { + }, aliasFieldset = dom.fieldset(style({ display: 'flex', flexDirection: 'column', gap: '.5ex' }), dom.label(postPublic = dom.input(attr.type('checkbox'), alias.PostPublic ? attr.checked('') : []), ' Public, anyone is allowed to send to the alias, instead of only members of the alias', attr.title('Based on address in message From header, which is assumed to be DMARC-like verified. If this setting is disabled and a non-member sends a message to the alias, the message is rejected.')), dom.label(listMembers = dom.input(attr.type('checkbox'), alias.ListMembers ? attr.checked('') : []), ' Members can list other members'), dom.label(allowMsgFrom = dom.input(attr.type('checkbox'), alias.AllowMsgFrom ? attr.checked('') : []), ' Allow messages to use the alias address in the message From header'), dom.div(style({ marginTop: '1ex' }), dom.submitbutton('Save')))), dom.br(), dom.h2('Members'), dom.p('Members receive messages sent to the alias. If a member address is in the message From header, the member will not receive the message.'), dom.table(dom.thead(dom.tr(dom.th('Address'), dom.th('Account'), dom.th())), dom.tbody((alias.Addresses || []).map((address, index) => { const pa = (alias.ParsedAddresses || [])[index]; return dom.tr(dom.td(prewrap(address)), dom.td(dom.a(pa.AccountName, attr.href('#accounts/' + pa.AccountName))), dom.td(dom.clickbutton('Remove', async function click(e) { await check(e.target, client.AliasAddressesRemove(aliasLocalpart, d, [address])); diff --git a/webadmin/admin.ts b/webadmin/admin.ts index ab22e4eaa..4087efda4 100644 --- a/webadmin/admin.ts +++ b/webadmin/admin.ts @@ -1347,7 +1347,7 @@ const domain = async (d: string) => { e.stopPropagation() const alias: api.Alias = { Addresses: aliasAddresses.value.split('\n').map(s => s.trim()).filter(s => !!s), - PostPublic: false, + PostPublic: true, ListMembers: false, AllowMsgFrom: false, // Ignored: @@ -1814,7 +1814,8 @@ const domainAlias = async (d: string, aliasLocalpart: string) => { style({display: 'flex', flexDirection: 'column', gap: '.5ex'}), dom.label( postPublic=dom.input(attr.type('checkbox'), alias.PostPublic ? attr.checked('') : []), - ' Public, anyone can post instead of only members', + ' Public, anyone is allowed to send to the alias, instead of only members of the alias', + attr.title('Based on address in message From header, which is assumed to be DMARC-like verified. If this setting is disabled and a non-member sends a message to the alias, the message is rejected.'), ), dom.label( listMembers=dom.input(attr.type('checkbox'), alias.ListMembers ? attr.checked('') : []),