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}