// Copyright 2025 The Forgejo Authors. All rights reserved.// SPDX-License-Identifier: MIT package cmd import ( "context" "fmt" auth_model "forgejo.org/models/auth" user_model "forgejo.org/models/user" "github.com/urfave/cli/v3") func microcmdUserResetMFA() *cli.Command { return &cli.Command{ Name: "reset-mfa", Usage: "Remove all two-factor authentication configurations for a user", Action: runResetMFA, Flags: []cli.Flag{ &cli.StringFlag{ Name: "username", Aliases: []string{"u"}, Value: "", Usage: "The user to update", }, }, }} func runResetMFA(ctx context.Context, c *cli.Command) error { if err := argsSet(c, "username"); err != nil { return err } ctx, cancel := installSignals(ctx) defer cancel() if err := initDB(ctx); err != nil { return err } user, err := user_model.GetUserByName(ctx, c.String("username")) if err != nil { return err } webAuthnList, err := auth_model.GetWebAuthnCredentialsByUID(ctx, user.ID) if err != nil { return err } for _, credential := range webAuthnList { if _, err := auth_model.DeleteCredential(ctx, credential.ID, user.ID); err != nil { return err } } tfaModes, err := auth_model.GetTwoFactorByUID(ctx, user.ID) if err == nil && tfaModes != nil { if err := auth_model.DeleteTwoFactorByID(ctx, tfaModes.ID, user.ID); err != nil { return err } } else { if _, is := err.(auth_model.ErrTwoFactorNotEnrolled); !is { return err } } fmt.Printf("%s's two-factor authentication settings have been removed!\n", user.Name) return nil}
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package cmd
import (
"context"
"fmt"
auth_model "forgejo.org/models/auth"
user_model "forgejo.org/models/user"
"github.com/urfave/cli/v3"
)
func microcmdUserResetMFA() *cli.Command {
return &cli.Command{
Name: "reset-mfa",
Usage: "Remove all two-factor authentication configurations for a user",
Action: runResetMFA,
Flags: []cli.Flag{
&cli.StringFlag{
Name: "username",
Aliases: []string{"u"},
Value: "",
Usage: "The user to update",
},
},
}
}
func runResetMFA(ctx context.Context, c *cli.Command) error {
if err := argsSet(c, "username"); err != nil {
return err
}
ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
return err
}
user, err := user_model.GetUserByName(ctx, c.String("username"))
if err != nil {
return err
}
webAuthnList, err := auth_model.GetWebAuthnCredentialsByUID(ctx, user.ID)
if err != nil {
return err
}
for _, credential := range webAuthnList {
if _, err := auth_model.DeleteCredential(ctx, credential.ID, user.ID); err != nil {
return err
}
}
tfaModes, err := auth_model.GetTwoFactorByUID(ctx, user.ID)
if err == nil && tfaModes != nil {
if err := auth_model.DeleteTwoFactorByID(ctx, tfaModes.ID, user.ID); err != nil {
return err
}
} else {
if _, is := err.(auth_model.ErrTwoFactorNotEnrolled); !is {
return err
}
}
fmt.Printf("%s's two-factor authentication settings have been removed!\n", user.Name)
return nil
}