1package libkb
2
3import (
4	"errors"
5)
6
7func CancelResetPipeline(mctx MetaContext) (err error) {
8	defer mctx.Trace("CancelResetPipeline", &err)()
9	_, err = mctx.G().API.Post(mctx, APIArg{
10		Endpoint:    "autoreset/cancel",
11		SessionType: APISessionTypeREQUIRED,
12		Args: HTTPArgs{
13			"src": S{Val: "app"},
14		},
15	})
16	return err
17}
18
19func ResetAccount(mctx MetaContext, username NormalizedUsername, passphrase string) (err error) {
20	defer mctx.Trace("ResetAccount", &err)()
21	return resetOrDeleteAccount(mctx, username, &passphrase, "nuke")
22}
23
24func DeleteAccount(mctx MetaContext, username NormalizedUsername, passphrase *string) (err error) {
25	defer mctx.Trace("DeleteAccount", &err)()
26	return resetOrDeleteAccount(mctx, username, passphrase, "delete")
27}
28
29func resetOrDeleteAccount(mctx MetaContext, username NormalizedUsername, passphrase *string, endpoint string) (err error) {
30	defer mctx.Trace("resetOrDeleteAccount", &err)()
31
32	arg := APIArg{
33		Endpoint:    endpoint,
34		SessionType: APISessionTypeREQUIRED,
35		Args:        NewHTTPArgs(),
36	}
37
38	if passphrase != nil {
39		// If passphrase is provided, create pdpka to authenticate the request.
40		// Otherwise, NIST authentication can be used (so no extra work for the
41		// client besides providing valid NIST token), but that only works for
42		// deleting random_pw accounts.
43		mctx = mctx.WithNewProvisionalLoginContext()
44		err = PassphraseLoginNoPrompt(mctx, username.String(), *passphrase)
45		if err != nil {
46			return err
47		}
48		pps := mctx.PassphraseStream()
49		if pps == nil {
50			return errors.New("unexpected nil passphrase stream")
51		}
52
53		pdpka, err := ComputeLoginPackage2(mctx, pps)
54		if err != nil {
55			return err
56		}
57
58		pdpka.PopulateArgs(&arg.Args)
59	}
60	_, err = mctx.G().API.Post(mctx, arg)
61	return err
62}
63