main
 1package dto
 2
 3import (
 4	"errors"
 5	"net/url"
 6	"time"
 7
 8	"github.com/hashicorp/uuid"
 9)
10
11type ClientInformationResponse struct {
12	ClientId              string `json:"client_id"`
13	ClientSecret          string `json:"client_secret"`
14	ClientIdIssuedAt      int64  `json:"client_id_issued_at"`
15	ClientSecretExpiresAt int64  `json:"client_secret_expires_at"`
16	ClientMetadata
17}
18
19func NewClientInformationResponse(request *ClientRegistrationRequest) *ClientInformationResponse {
20	expiresAt := time.Now().Add(time.Duration(1) * time.Hour)
21	return &ClientInformationResponse{
22		ClientMetadata: ClientMetadata{
23			RedirectUris:            request.RedirectUris,
24			ClientName:              request.ClientName,
25			TokenEndpointAuthMethod: request.TokenEndpointAuthMethod,
26			LogoUri:                 request.LogoUri,
27			JWKSUri:                 request.JWKSUri,
28		},
29		ClientId:              uuid.GenerateUUID(),
30		ClientIdIssuedAt:      time.Now().Unix(),
31		ClientSecret:          uuid.GenerateUUID(),
32		ClientSecretExpiresAt: expiresAt.Unix(),
33	}
34}
35
36type ClientRegistrationError error
37
38var (
39	InvalidClientMetadata       ClientRegistrationError = errors.New("invalid_client_metadata")
40	InvalidRedirectUri                                  = errors.New("invalid_redirect_uri")
41	InvalidSoftwareStatement                            = errors.New("invalid_software_statement")
42	UnapprovedSoftwareStatement                         = errors.New("unapproved_software_statement")
43)
44
45func (x *ClientInformationResponse) Valid() ClientRegistrationError {
46	if x.ClientName == "" {
47		return InvalidClientMetadata
48	}
49	if len(x.RedirectUris) == 0 {
50		return InvalidRedirectUri
51	}
52	for _, item := range x.RedirectUris {
53		if _, err := url.ParseRequestURI(item); err != nil {
54			return InvalidRedirectUri
55		}
56	}
57	return nil
58}