1package probeservices 2 3import ( 4 "context" 5 6 "github.com/ooni/probe-cli/v3/internal/engine/internal/randx" 7) 8 9type registerRequest struct { 10 Metadata 11 Password string `json:"password"` 12} 13 14type registerResult struct { 15 ClientID string `json:"client_id"` 16} 17 18// MaybeRegister registers this client if not already registered 19func (c Client) MaybeRegister(ctx context.Context, metadata Metadata) error { 20 if !metadata.Valid() { 21 return ErrInvalidMetadata 22 } 23 state := c.StateFile.Get() 24 if state.Credentials() != nil { 25 return nil // we're already good 26 } 27 c.RegisterCalls.Add(1) 28 pwd := randx.Letters(64) 29 req := ®isterRequest{ 30 Metadata: metadata, 31 Password: pwd, 32 } 33 var resp registerResult 34 if err := c.Client.PostJSON(ctx, "/api/v1/register", req, &resp); err != nil { 35 return err 36 } 37 state.ClientID = resp.ClientID 38 state.Password = pwd 39 return c.StateFile.Set(state) 40} 41