From 6e765670a7e1b5d200a71aa23f8f7c40d93f4a02 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Mon, 31 Jan 2022 20:00:28 +0500 Subject: [PATCH] :truck: Moved metadata struct from util to domain --- internal/domain/metadata.go | 62 ++++++++++++++++++++++++++++++++ internal/util/http.go | 72 ++----------------------------------- 2 files changed, 65 insertions(+), 69 deletions(-) create mode 100644 internal/domain/metadata.go diff --git a/internal/domain/metadata.go b/internal/domain/metadata.go new file mode 100644 index 0000000..6802471 --- /dev/null +++ b/internal/domain/metadata.go @@ -0,0 +1,62 @@ +package domain + +//nolint: tagliatelle +type Metadata struct { + // The server's issuer identifier. The issuer identifier is a URL that + // uses the "https" scheme and has no query or fragment components. The + // identifier MUST be a prefix of the indieauth-metadata URL. e.g. for + // an indieauth-metadata endpoint + // https://example.com/.well-known/oauth-authorization-server, the + // issuer URL could be https://example.com/, or for a metadata URL of + // https://example.com/wp-json/indieauth/1.0/metadata, the issuer URL + // could be https://example.com/wp-json/indieauth/1.0 + Issuer *URL `json:"issuer"` + + // The Authorization Endpoint. + AuthorizationEndpoint *URL `json:"authorization_endpoint"` + + // The Token Endpoint. + TokenEndpoint *URL `json:"token_endpoint"` + + // JSON array containing scope values supported by the IndieAuth server. + // Servers MAY choose not to advertise some supported scope values even + // when this parameter is used. + ScopesSupported Scopes `json:"scopes_supported,omitempty"` + + // JSON array containing the response_type values supported. This + // differs from RFC8414 in that this parameter is OPTIONAL and that, if + // omitted, the default is code. + ResponseTypesSupported []ResponseType `json:"response_types_supported,omitempty"` + + // JSON array containing grant type values supported. If omitted, the + // default value differs from RFC8414 and is authorization_code. + GrantTypesSupported []GrantType `json:"grant_types_supported,omitempty"` + + // URL of a page containing human-readable information that developers + // might need to know when using the server. This might be a link to the + // IndieAuth spec or something more personal to your implementation. + ServiceDocumentation *URL `json:"service_documentation,omitempty"` + + // JSON array containing the methods supported for PKCE. This parameter + // parameter differs from RFC8414 in that it is not optional as PKCE is + // REQUIRED. + CodeChallengeMethodsSupported []CodeChallengeMethod `json:"code_challenge_methods_supported"` + + // Boolean parameter indicating whether the authorization server + // provides the iss parameter. If omitted, the default value is false. + // As the iss parameter is REQUIRED, this is provided for compatibility + // with OAuth 2.0 servers implementing the parameter. + AuthorizationResponseIssParameterSupported bool `json:"authorization_response_iss_parameter_supported,omitempty"` //nolint: lll + + // The Ticket Endpoint. + // WARN(toby3d): experimental + TicketEndpoint *URL `json:"ticket_endpoint,omitempty"` + + // The Micropub Endpoint. + // WARN(toby3d): experimental + Micropub *URL `json:"micropub,omitempty"` + + // The Microsub Endpoint. + // WARN(toby3d): experimental + Microsub *URL `json:"microsub,omitempty"` +} diff --git a/internal/util/http.go b/internal/util/http.go index 31619bd..397d2b8 100644 --- a/internal/util/http.go +++ b/internal/util/http.go @@ -13,72 +13,6 @@ import ( "source.toby3d.me/website/indieauth/internal/domain" ) -//nolint: tagliatelle -type Metadata struct { - // The server's issuer identifier. The issuer identifier is a - // URL that uses the "https" scheme and has no query or fragment - // components. The identifier MUST be a prefix of the - // indieauth-metadata URL. e.g. for an indieauth-metadata - // endpoint - // https://example.com/.well-known/oauth-authorization-server, - // the issuer URL could be https://example.com/, or for a - // metadata URL of - // https://example.com/wp-json/indieauth/1.0/metadata, the - // issuer URL could be https://example.com/wp-json/indieauth/1.0 - Issuer *domain.URL `json:"issuer"` - - // The Authorization Endpoint. - AuthorizationEndpoint *domain.URL `json:"authorization_endpoint"` - - // The Token Endpoint. - TokenEndpoint *domain.URL `json:"token_endpoint"` - - // JSON array containing scope values supported by the - // IndieAuth server. Servers MAY choose not to advertise some - // supported scope values even when this parameter is used. - ScopesSupported domain.Scopes `json:"scopes_supported,omitempty"` - - // JSON array containing the response_type values supported. - // This differs from RFC8414 in that this parameter is OPTIONAL - // and that, if omitted, the default is code. - ResponseTypesSupported []domain.ResponseType `json:"response_types_supported,omitempty"` - - // JSON array containing grant type values supported. If - // omitted, the default value differs from RFC8414 and is - // authorization_code. - GrantTypesSupported []domain.GrantType `json:"grant_types_supported,omitempty"` - - // URL of a page containing human-readable information that - // developers might need to know when using the server. This - // might be a link to the IndieAuth spec or something more - // personal to your implementation. - ServiceDocumentation *domain.URL `json:"service_documentation,omitempty"` - - // JSON array containing the methods supported for PKCE. This - // parameter differs from RFC8414 in that it is not optional as - // PKCE is REQUIRED. - CodeChallengeMethodsSupported []domain.CodeChallengeMethod `json:"code_challenge_methods_supported"` - - // Boolean parameter indicating whether the authorization server - // provides the iss parameter. If omitted, the default value is - // false. As the iss parameter is REQUIRED, this is provided for - // compatibility with OAuth 2.0 servers implementing the - // parameter. - // - //nolint: lll - AuthorizationResponseIssParameterSupported bool `json:"authorization_response_iss_parameter_supported,omitempty"` - - // WARN(toby3d): experimental - // The Ticket Endpoint. - TicketEndpoint *domain.URL `json:"ticket_endpoint,omitempty"` - - // The Micropub Endpoint. - Micropub *domain.URL `json:"micropub,omitempty"` - - // The Microsub Endpoint. - Microsub *domain.URL `json:"microsub,omitempty"` -} - func ExtractEndpoints(resp *http.Response, rel string) []*domain.URL { results := make([]*domain.URL, 0) @@ -134,9 +68,9 @@ func ExtractEndpointsFromBody(resp *http.Response, rel string) ([]*domain.URL, e return results, nil } -func ExtractMetadata(resp *http.Response, client *http.Client) (*Metadata, error) { +func ExtractMetadata(resp *http.Response, client *http.Client) (*domain.Metadata, error) { endpoints := ExtractEndpoints(resp, "indieauth-metadata") - if endpoints == nil || len(endpoints) == 0 { + if len(endpoints) == 0 { return nil, nil } @@ -145,7 +79,7 @@ func ExtractMetadata(resp *http.Response, client *http.Client) (*Metadata, error return nil, err } - result := new(Metadata) + result := new(domain.Metadata) if err = json.Unmarshal(body, result); err != nil { return nil, err }