{"record":{"id":"1fdb082694535cf6","repo":"AlistGo/alist","slug":"generate-totp-code-failed-w","errorCode":null,"errorMessage":"generate totp code failed: %w","messagePattern":"generate totp code failed: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/mega/driver.go","lineNumber":42,"sourceCode":"\tAddition\n\tc *mega.Mega\n}\n\nfunc (d *Mega) Config() driver.Config {\n\treturn config\n}\n\nfunc (d *Mega) GetAddition() driver.Additional {\n\treturn &d.Addition\n}\n\nfunc (d *Mega) Init(ctx context.Context) error {\n\tvar twoFACode = d.TwoFACode\n\td.c = mega.New()\n\tif d.TwoFASecret != \"\" {\n\t\tcode, err := totp.GenerateCode(d.TwoFASecret, time.Now())\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"generate totp code failed: %w\", err)\n\t\t}\n\t\ttwoFACode = code\n\t}\n\treturn d.c.MultiFactorLogin(d.Email, d.Password, twoFACode)\n}\n\nfunc (d *Mega) Drop(ctx context.Context) error {\n\treturn nil\n}\n\nfunc (d *Mega) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {\n\tif node, ok := dir.(*MegaNode); ok {\n\t\tnodes, err := d.c.FS.GetChildren(node.n)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfn := make(map[string]model.Obj)\n\t\tfor i := range nodes {","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/mega/driver.go#L24-L60","documentation":"During Mega driver Init, totp.GenerateCode failed on the configured TwoFACecret — the secret is not a valid base32 TOTP key, so no 6-digit code could be derived. This happens before any network login attempt; MultiFactorLogin is never reached. The %w wraps encoding/base32 or key-length errors from the TOTP library.","triggerScenarios":"TwoFASecret set to the raw non-base32 string (e.g. copied from a URL's otpauth parameter without decoding); secret containing spaces, dashes, or lowercase characters that break strict base32; empty-after-trim secret; secret from a different scheme (hex) pasted by mistake.","commonSituations":"Users copying the 2FA secret shown during Mega account setup but including formatting; secrets exported from another authenticator in hex; trailing whitespace/newline from copy-paste into the driver config; secret regenerated on Mega's side so the stored value is stale.","solutions":["Re-copy the base32 secret exactly as Mega showed it (typically uppercase A-Z and 2-7, no separators) and strip whitespace/newlines","If the secret came from an otpauth:// URL, use only the secret= parameter value, URL-decoded","Verify the secret decodes: base32-decode it locally or with a TOTP test tool before configuring the driver","If the account's 2FA was reset, regenerate and store the new secret; or clear TwoFASecret if 2FA is now disabled"],"exampleFix":"// before\ncode, err := totp.GenerateCode(d.TwoFASecret, time.Now())\nif err != nil {\n    return fmt.Errorf(\"generate totp code failed: %w\", err)\n}\n\n// after\nsecret := strings.TrimSpace(strings.ToUpper(d.TwoFASecret))\nsecret = strings.ReplaceAll(secret, \" \", \"\")\ncode, err := totp.GenerateCode(secret, time.Now())\nif err != nil {\n    return fmt.Errorf(\"generate totp code failed (secret must be base32): %w\", err)\n}","handlingStrategy":"validation","validationCode":"// Validate base32 secret shape before Init\nsecret := strings.NewReplacer(\" \", \"\", \"\\n\", \"\", \"-\", \"\").Replace(strings.TrimSpace(d.TwoFASecret))\nif secret != \"\" {\n    if _, err := base32.StdEncoding.WithPadding(base32.NoPadding).DecodeString(strings.ToUpper(secret)); err != nil {\n        return fmt.Errorf(\"TwoFASecret is not valid base32: %w\", err)\n    }\n}","typeGuard":null,"tryCatchPattern":"// Surface the wrapped error verbatim; it names the base32 problem\nif err := megaDriver.Init(ctx); err != nil {\n    if strings.Contains(err.Error(), \"totp\") {\n        // fix the stored secret, not the code\n        return fmt.Errorf(\"invalid 2FA secret in storage config: %w\", err)\n    }\n    return err\n}","preventionTips":["Store only the raw base32 secret (A-Z, 2-7), no separators or whitespace","If extracting from otpauth://, URL-decode the secret parameter first","Test the secret in any authenticator app before configuring the driver"],"tags":["mega","totp","two-factor","config","go"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}