43 lines
961 B
Go
43 lines
961 B
Go
package probeservices
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/ooni/probe-cli/v3/internal/randx"
|
|
)
|
|
|
|
type registerRequest struct {
|
|
Metadata
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
type registerResult struct {
|
|
ClientID string `json:"client_id"`
|
|
}
|
|
|
|
// MaybeRegister registers this client if not already registered
|
|
func (c Client) MaybeRegister(ctx context.Context, metadata Metadata) error {
|
|
if !metadata.Valid() {
|
|
return ErrInvalidMetadata
|
|
}
|
|
state := c.StateFile.Get()
|
|
if state.Credentials() != nil {
|
|
return nil // we're already good
|
|
}
|
|
c.RegisterCalls.Add(1)
|
|
// TODO(bassosimone): here we should use a CSRNG
|
|
// (https://github.com/ooni/probe/issues/1502)
|
|
pwd := randx.Letters(64)
|
|
req := ®isterRequest{
|
|
Metadata: metadata,
|
|
Password: pwd,
|
|
}
|
|
var resp registerResult
|
|
if err := c.Client.PostJSON(ctx, "/api/v1/register", req, &resp); err != nil {
|
|
return err
|
|
}
|
|
state.ClientID = resp.ClientID
|
|
state.Password = pwd
|
|
return c.StateFile.Set(state)
|
|
}
|