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 := &registerRequest{
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