Skip to content

Commit

Permalink
when removing account, remove its data directory instead of leaving i…
Browse files Browse the repository at this point in the history
…t around

recreating the account would resurface the old messages, certainly not what you'ld expect.
it's about time to just remove the files. we do ask admins to confirm that when
removing through admin interface. it's also in the "mox config account rm" help
output now.

for issue #162 by RobSlgm with feedback from x8x, thanks!
  • Loading branch information
mjl- committed May 9, 2024
1 parent a2c9cfc commit 30ac690
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 2 deletions.
2 changes: 2 additions & 0 deletions doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -937,6 +937,8 @@ Remove an account and reload the configuration.
Email addresses for this account will also be removed, and incoming email for
these addresses will be rejected.
All data for the account will be removed.
usage: mox config account rm account
# mox config address add
Expand Down
2 changes: 2 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -890,6 +890,8 @@ func cmdConfigAccountRemove(c *cmd) {
Email addresses for this account will also be removed, and incoming email for
these addresses will be rejected.
All data for the account will be removed.
`
args := c.Parse()
if len(args) != 1 {
Expand Down
12 changes: 12 additions & 0 deletions mox-/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,18 @@ func AccountRemove(ctx context.Context, account string) (rerr error) {
if err := writeDynamic(ctx, log, nc); err != nil {
return fmt.Errorf("writing domains.conf: %w", err)
}

odir := filepath.Join(DataDirPath("accounts"), account)
tmpdir := filepath.Join(DataDirPath("tmp"), "oldaccount-"+account)
if err := os.Rename(odir, tmpdir); err != nil {
log.Errorx("moving old account data directory out of the way", err, slog.String("account", account))
return fmt.Errorf("account removed, but account data directory %q could not be moved out of the way: %v", odir, err)
}
if err := os.RemoveAll(tmpdir); err != nil {
log.Errorx("removing old account data directory", err, slog.String("account", account))
return fmt.Errorf("account removed, its data directory moved to %q, but removing failed: %v", odir, err)
}

log.Info("account removed", slog.String("account", account))
return nil
}
Expand Down
2 changes: 1 addition & 1 deletion webadmin/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -2194,7 +2194,7 @@ const account = async (name) => {
formPassword.reset();
}), dom.br(), RoutesEditor('account-specific', transports, config.Routes || [], async (routes) => await client.AccountRoutesSave(name, routes)), dom.br(), dom.h2('Danger'), dom.clickbutton('Remove account', async function click(e) {
e.preventDefault();
if (!window.confirm('Are you sure you want to remove this account?')) {
if (!window.confirm('Are you sure you want to remove this account? All account data, including messages will be removed.')) {
return;
}
await check(e.target, client.AccountRemove(name));
Expand Down
2 changes: 1 addition & 1 deletion webadmin/admin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ const account = async (name: string) => {
dom.h2('Danger'),
dom.clickbutton('Remove account', async function click(e: MouseEvent) {
e.preventDefault()
if (!window.confirm('Are you sure you want to remove this account?')) {
if (!window.confirm('Are you sure you want to remove this account? All account data, including messages will be removed.')) {
return
}
await check(e.target! as HTMLButtonElement, client.AccountRemove(name))
Expand Down

0 comments on commit 30ac690

Please sign in to comment.