diff --git a/go.mod b/go.mod index d5897ed80..a55be1589 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/KimMachineGun/automemlimit v0.2.6 github.com/Masterminds/semver v1.5.0 github.com/MicahParks/keyfunc v1.5.1 - github.com/Nerzal/gocloak/v13 v13.1.0 + github.com/Nerzal/gocloak/v13 v13.8.0 github.com/bbalet/stopwords v1.0.0 github.com/blevesearch/bleve/v2 v2.3.9 github.com/coreos/go-oidc v2.2.1+incompatible diff --git a/go.sum b/go.sum index 7e41b8342..acf563150 100644 --- a/go.sum +++ b/go.sum @@ -658,8 +658,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Nerzal/gocloak/v13 v13.1.0 h1:ret4pZTIsSQGZHURDMJ4jXnUmHyEoRykBqDTsAKoj8c= -github.com/Nerzal/gocloak/v13 v13.1.0/go.mod h1:rRBtEdh5N0+JlZZEsrfZcB2sRMZWbgSxI2EIv9jpJp4= +github.com/Nerzal/gocloak/v13 v13.8.0 h1:7s9cK8X3vy8OIic+pG4POE9vGy02tSHkMhvWXv0P2m8= +github.com/Nerzal/gocloak/v13 v13.8.0/go.mod h1:rRBtEdh5N0+JlZZEsrfZcB2sRMZWbgSxI2EIv9jpJp4= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= diff --git a/vendor/github.com/Nerzal/gocloak/v13/Dockerfile b/vendor/github.com/Nerzal/gocloak/v13/Dockerfile index 9b8833146..1590f824c 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/Dockerfile +++ b/vendor/github.com/Nerzal/gocloak/v13/Dockerfile @@ -6,6 +6,6 @@ ENV KEYCLOAK_USER=admin ENV KEYCLOAK_PASSWORD=secret ENV KEYCLOAK_ADMIN=admin ENV KEYCLOAK_ADMIN_PASSWORD=secret -ENV KC_FEATURES=account-api,account2,authorization,client-policies,impersonation,docker,scripts,upload_scripts +ENV KC_FEATURES=account-api,account2,authorization,client-policies,impersonation,docker,scripts,upload_scripts,admin-fine-grained-authz RUN /opt/keycloak/bin/kc.sh import --file /data/import/gocloak-realm.json ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] diff --git a/vendor/github.com/Nerzal/gocloak/v13/Makefile b/vendor/github.com/Nerzal/gocloak/v13/Makefile index 1664ecb46..0409e817d 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/Makefile +++ b/vendor/github.com/Nerzal/gocloak/v13/Makefile @@ -1,6 +1,8 @@ test: ./run-tests.sh -start-keycloak: +start-keycloak: stop-keycloak + docker-compose up -d + +stop-keycloak: docker-compose down - docker-compose up -d \ No newline at end of file diff --git a/vendor/github.com/Nerzal/gocloak/v13/README.md b/vendor/github.com/Nerzal/gocloak/v13/README.md index cd88b7e79..6f4d7c09b 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/README.md +++ b/vendor/github.com/Nerzal/gocloak/v13/README.md @@ -80,7 +80,7 @@ go get github.com/Nerzal/gocloak/v13 panic("Inspection failed:"+ err.Error()) } - if !rptResult.Active { + if !*rptResult.Active { panic("Token is not active") } @@ -280,8 +280,8 @@ type GoCloak interface { ClearUserCache(ctx context.Context, token, realm string) error ClearKeysCache(ctx context.Context, token, realm string) error - GetClientUserSessions(ctx context.Context, token, realm, idOfClient string) ([]*UserSessionRepresentation, error) - GetClientOfflineSessions(ctx context.Context, token, realm, idOfClient string) ([]*UserSessionRepresentation, error) +GetClientUserSessions(ctx context.Context, token, realm, idOfClient string, params ...GetClientUserSessionsParams) ([]*UserSessionRepresentation, error) +GetClientOfflineSessions(ctx context.Context, token, realm, idOfClient string, params ...GetClientUserSessionsParams) ([]*UserSessionRepresentation, error) GetUserSessions(ctx context.Context, token, realm, userID string) ([]*UserSessionRepresentation, error) GetUserOfflineSessionsForClient(ctx context.Context, token, realm, userID, idOfClient string) ([]*UserSessionRepresentation, error) @@ -475,6 +475,18 @@ yields Note that empty parameters are not included, because of the use of ```omitempty``` in the type definitions. +## Examples + +* [Add client role to user](./examples/ADD_CLIENT_ROLE_TO_USER.md) + +* [Create User Federation & Sync](./examples/USER_FEDERATION.md) + +* [Create User Federation & Sync with group ldap mapper](./examples/USER_FEDERATION_GROUP_LDAP_MAPPER.md) + +* [Create User Federation & Sync with role ldap mapper](./examples/USER_FEDERATION_ROLE_LDAP_MAPPER.md) + +* [Create User Federation & Sync with user attribute ldap mapper](./examples/USER_FEDERATION_USER_ATTRIBUTE_LDAP_MAPPER.md) + ## License [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FNerzal%2Fgocloak.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FNerzal%2Fgocloak?ref=badge_large) diff --git a/vendor/github.com/Nerzal/gocloak/v13/client.go b/vendor/github.com/Nerzal/gocloak/v13/client.go index 9967e5330..9f06b215b 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/client.go +++ b/vendor/github.com/Nerzal/gocloak/v13/client.go @@ -32,6 +32,7 @@ type GoCloak struct { authAdminRealms string authRealms string tokenEndpoint string + revokeEndpoint string logoutEndpoint string openIDConnect string attackDetection string @@ -47,7 +48,8 @@ func makeURL(path ...string) string { return strings.Join(path, urlSeparator) } -func (g *GoCloak) getRequest(ctx context.Context) *resty.Request { +// GetRequest returns a request for calling endpoints. +func (g *GoCloak) GetRequest(ctx context.Context) *resty.Request { var err HTTPErrorResponse return injectTracingHeaders( ctx, g.restyClient.R(). @@ -56,27 +58,31 @@ func (g *GoCloak) getRequest(ctx context.Context) *resty.Request { ) } -func (g *GoCloak) getRequestWithBearerAuthNoCache(ctx context.Context, token string) *resty.Request { - return g.getRequest(ctx). +// GetRequestWithBearerAuthNoCache returns a JSON base request configured with an auth token and no-cache header. +func (g *GoCloak) GetRequestWithBearerAuthNoCache(ctx context.Context, token string) *resty.Request { + return g.GetRequest(ctx). SetAuthToken(token). SetHeader("Content-Type", "application/json"). SetHeader("Cache-Control", "no-cache") } -func (g *GoCloak) getRequestWithBearerAuth(ctx context.Context, token string) *resty.Request { - return g.getRequest(ctx). +// GetRequestWithBearerAuth returns a JSON base request configured with an auth token. +func (g *GoCloak) GetRequestWithBearerAuth(ctx context.Context, token string) *resty.Request { + return g.GetRequest(ctx). SetAuthToken(token). SetHeader("Content-Type", "application/json") } -func (g *GoCloak) getRequestWithBearerAuthXMLHeader(ctx context.Context, token string) *resty.Request { - return g.getRequest(ctx). +// GetRequestWithBearerAuthXMLHeader returns an XML base request configured with an auth token. +func (g *GoCloak) GetRequestWithBearerAuthXMLHeader(ctx context.Context, token string) *resty.Request { + return g.GetRequest(ctx). SetAuthToken(token). SetHeader("Content-Type", "application/xml;charset=UTF-8") } -func (g *GoCloak) getRequestWithBasicAuth(ctx context.Context, clientID, clientSecret string) *resty.Request { - req := g.getRequest(ctx). +// GetRequestWithBasicAuth returns a form data base request configured with basic auth. +func (g *GoCloak) GetRequestWithBasicAuth(ctx context.Context, clientID, clientSecret string) *resty.Request { + req := g.GetRequest(ctx). SetHeader("Content-Type", "application/x-www-form-urlencoded") // Public client doesn't require Basic Auth if len(clientID) > 0 && len(clientSecret) > 0 { @@ -88,7 +94,7 @@ func (g *GoCloak) getRequestWithBasicAuth(ctx context.Context, clientID, clientS } func (g *GoCloak) getRequestingParty(ctx context.Context, token string, realm string, options RequestingPartyTokenOptions, res interface{}) (*resty.Response, error) { - return g.getRequestWithBearerAuth(ctx, token). + return g.GetRequestWithBearerAuth(ctx, token). SetFormData(options.FormData()). SetFormDataFromValues(url.Values{"permission": PStringSlice(options.Permissions)}). SetResult(&res). @@ -185,6 +191,7 @@ func NewClient(basePath string, options ...func(*GoCloak)) *GoCloak { c.Config.authRealms = makeURL("realms") c.Config.tokenEndpoint = makeURL("protocol", "openid-connect", "token") c.Config.logoutEndpoint = makeURL("protocol", "openid-connect", "logout") + c.Config.revokeEndpoint = makeURL("protocol", "openid-connect", "revoke") c.Config.openIDConnect = makeURL("protocol", "openid-connect") c.Config.attackDetection = makeURL("attack-detection", "brute-force") @@ -252,6 +259,13 @@ func SetTokenEndpoint(url string) func(g *GoCloak) { } } +// SetRevokeEndpoint sets the revoke endpoint +func SetRevokeEndpoint(url string) func(g *GoCloak) { + return func(g *GoCloak) { + g.Config.revokeEndpoint = url + } +} + // SetLogoutEndpoint sets the logout func SetLogoutEndpoint(url string) func(g *GoCloak) { return func(g *GoCloak) { @@ -274,13 +288,13 @@ func SetCertCacheInvalidationTime(duration time.Duration) func(g *GoCloak) { } // GetServerInfo fetches the server info. -func (g *GoCloak) GetServerInfo(ctx context.Context, accessToken string) ([]*ServerInfoRepresentation, error) { +func (g *GoCloak) GetServerInfo(ctx context.Context, accessToken string) (*ServerInfoRepresentation, error) { errMessage := "could not get server info" - var result []*ServerInfoRepresentation + var result *ServerInfoRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). - Get(makeURL(g.basePath, "admin", "realms")) + Get(makeURL(g.basePath, "admin", "serverinfo")) if err := checkForError(resp, err, errMessage); err != nil { return nil, err @@ -294,7 +308,7 @@ func (g *GoCloak) GetUserInfo(ctx context.Context, accessToken, realm string) (* const errMessage = "could not get user info" var result UserInfo - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getRealmURL(realm, g.Config.openIDConnect, "userinfo")) @@ -310,7 +324,7 @@ func (g *GoCloak) GetRawUserInfo(ctx context.Context, accessToken, realm string) const errMessage = "could not get user info" var result map[string]interface{} - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getRealmURL(realm, g.Config.openIDConnect, "userinfo")) @@ -325,7 +339,7 @@ func (g *GoCloak) getNewCerts(ctx context.Context, realm string) (*CertResponse, const errMessage = "could not get newCerts" var result CertResponse - resp, err := g.getRequest(ctx). + resp, err := g.GetRequest(ctx). SetResult(&result). Get(g.getRealmURL(realm, g.Config.openIDConnect, "certs")) @@ -369,7 +383,7 @@ func (g *GoCloak) GetIssuer(ctx context.Context, realm string) (*IssuerResponse, const errMessage = "could not get issuer" var result IssuerResponse - resp, err := g.getRequest(ctx). + resp, err := g.GetRequest(ctx). SetResult(&result). Get(g.getRealmURL(realm)) @@ -385,7 +399,7 @@ func (g *GoCloak) RetrospectToken(ctx context.Context, accessToken, clientID, cl const errMessage = "could not introspect requesting party token" var result IntroSpectTokenResult - resp, err := g.getRequestWithBasicAuth(ctx, clientID, clientSecret). + resp, err := g.GetRequestWithBasicAuth(ctx, clientID, clientSecret). SetFormData(map[string]string{ "token_type_hint": "requesting_party_token", "token": accessToken, @@ -452,9 +466,9 @@ func (g *GoCloak) GetToken(ctx context.Context, realm string, options TokenOptio var req *resty.Request if !NilOrEmpty(options.ClientSecret) { - req = g.getRequestWithBasicAuth(ctx, *options.ClientID, *options.ClientSecret) + req = g.GetRequestWithBasicAuth(ctx, *options.ClientID, *options.ClientSecret) } else { - req = g.getRequest(ctx) + req = g.GetRequest(ctx) } resp, err := req.SetFormData(options.FormData()). @@ -536,12 +550,18 @@ func (g *GoCloak) LoginAdmin(ctx context.Context, username, password, realm stri } // LoginClient performs a login with client credentials -func (g *GoCloak) LoginClient(ctx context.Context, clientID, clientSecret, realm string) (*JWT, error) { - return g.GetToken(ctx, realm, TokenOptions{ +func (g *GoCloak) LoginClient(ctx context.Context, clientID, clientSecret, realm string, scopes ...string) (*JWT, error) { + opts := TokenOptions{ ClientID: &clientID, ClientSecret: &clientSecret, GrantType: StringP("client_credentials"), - }) + } + + if len(scopes) > 0 { + opts.Scope = &scopes[0] + } + + return g.GetToken(ctx, realm, opts) } // LoginClientTokenExchange will exchange the presented token for a user's token @@ -620,7 +640,7 @@ func (g *GoCloak) LoginOtp(ctx context.Context, clientID, clientSecret, realm, u func (g *GoCloak) Logout(ctx context.Context, clientID, clientSecret, realm, refreshToken string) error { const errMessage = "could not logout" - resp, err := g.getRequestWithBasicAuth(ctx, clientID, clientSecret). + resp, err := g.GetRequestWithBasicAuth(ctx, clientID, clientSecret). SetFormData(map[string]string{ "client_id": clientID, "refresh_token": refreshToken, @@ -634,7 +654,7 @@ func (g *GoCloak) Logout(ctx context.Context, clientID, clientSecret, realm, ref func (g *GoCloak) LogoutPublicClient(ctx context.Context, clientID, realm, accessToken, refreshToken string) error { const errMessage = "could not logout public client" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetFormData(map[string]string{ "client_id": clientID, "refresh_token": refreshToken, @@ -648,7 +668,7 @@ func (g *GoCloak) LogoutPublicClient(ctx context.Context, clientID, realm, acces func (g *GoCloak) LogoutAllSessions(ctx context.Context, accessToken, realm, userID string) error { const errMessage = "could not logout" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). Post(g.getAdminRealmURL(realm, "users", userID, "logout")) return checkForError(resp, err, errMessage) @@ -658,7 +678,7 @@ func (g *GoCloak) LogoutAllSessions(ctx context.Context, accessToken, realm, use func (g *GoCloak) RevokeUserConsents(ctx context.Context, accessToken, realm, userID, clientID string) error { const errMessage = "could not revoke consents" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). Delete(g.getAdminRealmURL(realm, "users", userID, "consents", clientID)) return checkForError(resp, err, errMessage) @@ -668,7 +688,7 @@ func (g *GoCloak) RevokeUserConsents(ctx context.Context, accessToken, realm, us func (g *GoCloak) LogoutUserSession(ctx context.Context, accessToken, realm, session string) error { const errMessage = "could not logout" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). Delete(g.getAdminRealmURL(realm, "sessions", session)) return checkForError(resp, err, errMessage) @@ -683,7 +703,7 @@ func (g *GoCloak) ExecuteActionsEmail(ctx context.Context, token, realm string, return errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(params.Actions). SetQueryParams(queryParams). Put(g.getAdminRealmURL(realm, "users", *(params.UserID), "execute-actions-email")) @@ -706,7 +726,7 @@ func (g *GoCloak) SendVerifyEmail(ctx context.Context, token, userID, realm stri } } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetQueryParams(queryParams). Put(g.getAdminRealmURL(realm, "users", userID, "send-verify-email")) @@ -717,7 +737,7 @@ func (g *GoCloak) SendVerifyEmail(ctx context.Context, token, userID, realm stri func (g *GoCloak) CreateGroup(ctx context.Context, token, realm string, group Group) (string, error) { const errMessage = "could not create group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(group). Post(g.getAdminRealmURL(realm, "groups")) @@ -731,7 +751,7 @@ func (g *GoCloak) CreateGroup(ctx context.Context, token, realm string, group Gr func (g *GoCloak) CreateChildGroup(ctx context.Context, token, realm, groupID string, group Group) (string, error) { const errMessage = "could not create child group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(group). Post(g.getAdminRealmURL(realm, "groups", groupID, "children")) @@ -746,7 +766,7 @@ func (g *GoCloak) CreateChildGroup(ctx context.Context, token, realm, groupID st func (g *GoCloak) CreateComponent(ctx context.Context, token, realm string, component Component) (string, error) { const errMessage = "could not create component" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(component). Post(g.getAdminRealmURL(realm, "components")) @@ -761,7 +781,7 @@ func (g *GoCloak) CreateComponent(ctx context.Context, token, realm string, comp func (g *GoCloak) CreateClient(ctx context.Context, accessToken, realm string, newClient Client) (string, error) { const errMessage = "could not create client" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetBody(newClient). Post(g.getAdminRealmURL(realm, "clients")) @@ -778,7 +798,7 @@ func (g *GoCloak) CreateClientRepresentation(ctx context.Context, token, realm s var result Client - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(newClient). Post(g.getRealmURL(realm, "clients-registrations", "default")) @@ -794,7 +814,7 @@ func (g *GoCloak) CreateClientRepresentation(ctx context.Context, token, realm s func (g *GoCloak) CreateClientRole(ctx context.Context, token, realm, idOfClient string, role Role) (string, error) { const errMessage = "could not create client role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(role). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "roles")) @@ -809,7 +829,7 @@ func (g *GoCloak) CreateClientRole(ctx context.Context, token, realm, idOfClient func (g *GoCloak) CreateClientScope(ctx context.Context, token, realm string, scope ClientScope) (string, error) { const errMessage = "could not create client scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(scope). Post(g.getAdminRealmURL(realm, "client-scopes")) @@ -824,7 +844,7 @@ func (g *GoCloak) CreateClientScope(ctx context.Context, token, realm string, sc func (g *GoCloak) CreateClientScopeProtocolMapper(ctx context.Context, token, realm, scopeID string, protocolMapper ProtocolMappers) (string, error) { const errMessage = "could not create client scope protocol mapper" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(protocolMapper). Post(g.getAdminRealmURL(realm, "client-scopes", scopeID, "protocol-mappers", "models")) @@ -842,13 +862,31 @@ func (g *GoCloak) UpdateGroup(ctx context.Context, token, realm string, updatedG if NilOrEmpty(updatedGroup.ID) { return errors.Wrap(errors.New("ID of a group required"), errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(updatedGroup). Put(g.getAdminRealmURL(realm, "groups", PString(updatedGroup.ID))) return checkForError(resp, err, errMessage) } +// UpdateGroupManagementPermissions updates the given group management permissions +func (g *GoCloak) UpdateGroupManagementPermissions(ctx context.Context, accessToken, realm string, idOfGroup string, managementPermissions ManagementPermissionRepresentation) (*ManagementPermissionRepresentation, error) { + const errMessage = "could not update group management permissions" + + var result ManagementPermissionRepresentation + + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). + SetResult(&result). + SetBody(managementPermissions). + Put(g.getAdminRealmURL(realm, "groups", idOfGroup, "management", "permissions")) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return &result, nil +} + // UpdateClient updates the given Client func (g *GoCloak) UpdateClient(ctx context.Context, token, realm string, updatedClient Client) error { const errMessage = "could not update client" @@ -857,7 +895,7 @@ func (g *GoCloak) UpdateClient(ctx context.Context, token, realm string, updated return errors.Wrap(errors.New("ID of a client required"), errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(updatedClient). Put(g.getAdminRealmURL(realm, "clients", PString(updatedClient.ID))) @@ -874,7 +912,7 @@ func (g *GoCloak) UpdateClientRepresentation(ctx context.Context, accessToken, r var result Client - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). SetBody(updatedClient). Put(g.getRealmURL(realm, "clients-registrations", "default", PString(updatedClient.ClientID))) @@ -886,11 +924,29 @@ func (g *GoCloak) UpdateClientRepresentation(ctx context.Context, accessToken, r return &result, nil } +// UpdateClientManagementPermissions updates the given client management permissions +func (g *GoCloak) UpdateClientManagementPermissions(ctx context.Context, accessToken, realm string, idOfClient string, managementPermissions ManagementPermissionRepresentation) (*ManagementPermissionRepresentation, error) { + const errMessage = "could not update client management permissions" + + var result ManagementPermissionRepresentation + + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). + SetResult(&result). + SetBody(managementPermissions). + Put(g.getAdminRealmURL(realm, "clients", idOfClient, "management", "permissions")) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return &result, nil +} + // UpdateRole updates the given role. func (g *GoCloak) UpdateRole(ctx context.Context, token, realm, idOfClient string, role Role) error { const errMessage = "could not update role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(role). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "roles", PString(role.Name))) @@ -901,7 +957,7 @@ func (g *GoCloak) UpdateRole(ctx context.Context, token, realm, idOfClient strin func (g *GoCloak) UpdateClientScope(ctx context.Context, token, realm string, scope ClientScope) error { const errMessage = "could not update client scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(scope). Put(g.getAdminRealmURL(realm, "client-scopes", PString(scope.ID))) @@ -912,7 +968,7 @@ func (g *GoCloak) UpdateClientScope(ctx context.Context, token, realm string, sc func (g *GoCloak) UpdateClientScopeProtocolMapper(ctx context.Context, token, realm, scopeID string, protocolMapper ProtocolMappers) error { const errMessage = "could not update client scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(protocolMapper). Put(g.getAdminRealmURL(realm, "client-scopes", scopeID, "protocol-mappers", "models", PString(protocolMapper.ID))) @@ -923,7 +979,7 @@ func (g *GoCloak) UpdateClientScopeProtocolMapper(ctx context.Context, token, re func (g *GoCloak) DeleteGroup(ctx context.Context, token, realm, groupID string) error { const errMessage = "could not delete group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "groups", groupID)) return checkForError(resp, err, errMessage) @@ -933,7 +989,7 @@ func (g *GoCloak) DeleteGroup(ctx context.Context, token, realm, groupID string) func (g *GoCloak) DeleteClient(ctx context.Context, token, realm, idOfClient string) error { const errMessage = "could not delete client" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient)) return checkForError(resp, err, errMessage) @@ -943,7 +999,7 @@ func (g *GoCloak) DeleteClient(ctx context.Context, token, realm, idOfClient str func (g *GoCloak) DeleteComponent(ctx context.Context, token, realm, componentID string) error { const errMessage = "could not delete component" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "components", componentID)) return checkForError(resp, err, errMessage) @@ -953,7 +1009,7 @@ func (g *GoCloak) DeleteComponent(ctx context.Context, token, realm, componentID func (g *GoCloak) DeleteClientRepresentation(ctx context.Context, accessToken, realm, clientID string) error { const errMessage = "could not delete client representation" - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). Delete(g.getRealmURL(realm, "clients-registrations", "default", clientID)) return checkForError(resp, err, errMessage) @@ -963,7 +1019,7 @@ func (g *GoCloak) DeleteClientRepresentation(ctx context.Context, accessToken, r func (g *GoCloak) DeleteClientRole(ctx context.Context, token, realm, idOfClient, roleName string) error { const errMessage = "could not delete client role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "roles", roleName)) return checkForError(resp, err, errMessage) @@ -973,7 +1029,7 @@ func (g *GoCloak) DeleteClientRole(ctx context.Context, token, realm, idOfClient func (g *GoCloak) DeleteClientScope(ctx context.Context, token, realm, scopeID string) error { const errMessage = "could not delete client scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "client-scopes", scopeID)) return checkForError(resp, err, errMessage) @@ -983,7 +1039,7 @@ func (g *GoCloak) DeleteClientScope(ctx context.Context, token, realm, scopeID s func (g *GoCloak) DeleteClientScopeProtocolMapper(ctx context.Context, token, realm, scopeID, protocolMapperID string) error { const errMessage = "could not delete client scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "client-scopes", scopeID, "protocol-mappers", "models", protocolMapperID)) return checkForError(resp, err, errMessage) @@ -995,7 +1051,7 @@ func (g *GoCloak) GetClient(ctx context.Context, token, realm, idOfClient string var result Client - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient)) @@ -1012,7 +1068,7 @@ func (g *GoCloak) GetClientRepresentation(ctx context.Context, accessToken, real var result Client - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getRealmURL(realm, "clients-registrations", "default", clientID)) @@ -1029,7 +1085,7 @@ func (g *GoCloak) GetAdapterConfiguration(ctx context.Context, accessToken, real var result AdapterConfiguration - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getRealmURL(realm, "clients-registrations", "install", clientID)) @@ -1046,7 +1102,7 @@ func (g *GoCloak) GetClientsDefaultScopes(ctx context.Context, token, realm, idO var result []*ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "default-client-scopes")) @@ -1061,7 +1117,7 @@ func (g *GoCloak) GetClientsDefaultScopes(ctx context.Context, token, realm, idO func (g *GoCloak) AddDefaultScopeToClient(ctx context.Context, token, realm, idOfClient, scopeID string) error { const errMessage = "could not add default scope to client" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "default-client-scopes", scopeID)) return checkForError(resp, err, errMessage) @@ -1071,7 +1127,7 @@ func (g *GoCloak) AddDefaultScopeToClient(ctx context.Context, token, realm, idO func (g *GoCloak) RemoveDefaultScopeFromClient(ctx context.Context, token, realm, idOfClient, scopeID string) error { const errMessage = "could not remove default scope from client" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "default-client-scopes", scopeID)) return checkForError(resp, err, errMessage) @@ -1083,7 +1139,7 @@ func (g *GoCloak) GetClientsOptionalScopes(ctx context.Context, token, realm, id var result []*ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "optional-client-scopes")) @@ -1098,7 +1154,7 @@ func (g *GoCloak) GetClientsOptionalScopes(ctx context.Context, token, realm, id func (g *GoCloak) AddOptionalScopeToClient(ctx context.Context, token, realm, idOfClient, scopeID string) error { const errMessage = "could not add optional scope to client" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "optional-client-scopes", scopeID)) return checkForError(resp, err, errMessage) @@ -1108,7 +1164,7 @@ func (g *GoCloak) AddOptionalScopeToClient(ctx context.Context, token, realm, id func (g *GoCloak) RemoveOptionalScopeFromClient(ctx context.Context, token, realm, idOfClient, scopeID string) error { const errMessage = "could not remove optional scope from client" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "optional-client-scopes", scopeID)) return checkForError(resp, err, errMessage) @@ -1120,7 +1176,7 @@ func (g *GoCloak) GetDefaultOptionalClientScopes(ctx context.Context, token, rea var result []*ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "default-optional-client-scopes")) @@ -1137,7 +1193,7 @@ func (g *GoCloak) GetDefaultDefaultClientScopes(ctx context.Context, token, real var result []*ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "default-default-client-scopes")) @@ -1154,7 +1210,7 @@ func (g *GoCloak) GetClientScope(ctx context.Context, token, realm, scopeID stri var result ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", scopeID)) @@ -1171,7 +1227,7 @@ func (g *GoCloak) GetClientScopes(ctx context.Context, token, realm string) ([]* var result []*ClientScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes")) @@ -1188,7 +1244,7 @@ func (g *GoCloak) GetClientScopeProtocolMappers(ctx context.Context, token, real var result []*ProtocolMappers - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", scopeID, "protocol-mappers", "models")) @@ -1205,7 +1261,7 @@ func (g *GoCloak) GetClientScopeProtocolMapper(ctx context.Context, token, realm var result *ProtocolMappers - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", scopeID, "protocol-mappers", "models", protocolMapperID)) @@ -1222,7 +1278,7 @@ func (g *GoCloak) GetClientScopeMappings(ctx context.Context, token, realm, idOf var result *MappingsRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings")) @@ -1239,7 +1295,7 @@ func (g *GoCloak) GetClientScopeMappingsRealmRoles(ctx context.Context, token, r var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "realm")) @@ -1256,7 +1312,7 @@ func (g *GoCloak) GetClientScopeMappingsRealmRolesAvailable(ctx context.Context, var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "realm", "available")) @@ -1271,7 +1327,7 @@ func (g *GoCloak) GetClientScopeMappingsRealmRolesAvailable(ctx context.Context, func (g *GoCloak) CreateClientScopeMappingsRealmRoles(ctx context.Context, token, realm, idOfClient string, roles []Role) error { const errMessage = "could not create realm-level roles to the client’s scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "realm")) @@ -1282,7 +1338,7 @@ func (g *GoCloak) CreateClientScopeMappingsRealmRoles(ctx context.Context, token func (g *GoCloak) DeleteClientScopeMappingsRealmRoles(ctx context.Context, token, realm, idOfClient string, roles []Role) error { const errMessage = "could not delete realm-level roles from the client’s scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "realm")) @@ -1295,7 +1351,7 @@ func (g *GoCloak) GetClientScopeMappingsClientRoles(ctx context.Context, token, var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "clients", idOfSelectedClient)) @@ -1312,7 +1368,7 @@ func (g *GoCloak) GetClientScopeMappingsClientRolesAvailable(ctx context.Context var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "clients", idOfSelectedClient, "available")) @@ -1327,7 +1383,7 @@ func (g *GoCloak) GetClientScopeMappingsClientRolesAvailable(ctx context.Context func (g *GoCloak) CreateClientScopeMappingsClientRoles(ctx context.Context, token, realm, idOfClient, idOfSelectedClient string, roles []Role) error { const errMessage = "could not create client-level roles from the client’s scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "clients", idOfSelectedClient)) @@ -1338,7 +1394,7 @@ func (g *GoCloak) CreateClientScopeMappingsClientRoles(ctx context.Context, toke func (g *GoCloak) DeleteClientScopeMappingsClientRoles(ctx context.Context, token, realm, idOfClient, idOfSelectedClient string, roles []Role) error { const errMessage = "could not delete client-level roles from the client’s scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "scope-mappings", "clients", idOfSelectedClient)) @@ -1351,7 +1407,7 @@ func (g *GoCloak) GetClientSecret(ctx context.Context, token, realm, idOfClient var result CredentialRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "client-secret")) @@ -1367,7 +1423,7 @@ func (g *GoCloak) GetClientServiceAccount(ctx context.Context, token, realm, idO const errMessage = "could not get client service account" var result User - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "service-account-user")) @@ -1383,7 +1439,7 @@ func (g *GoCloak) RegenerateClientSecret(ctx context.Context, token, realm, idOf const errMessage = "could not regenerate client secret" var result CredentialRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "client-secret")) @@ -1395,12 +1451,23 @@ func (g *GoCloak) RegenerateClientSecret(ctx context.Context, token, realm, idOf } // GetClientOfflineSessions returns offline sessions associated with the client -func (g *GoCloak) GetClientOfflineSessions(ctx context.Context, token, realm, idOfClient string) ([]*UserSessionRepresentation, error) { +func (g *GoCloak) GetClientOfflineSessions(ctx context.Context, token, realm, idOfClient string, params ...GetClientUserSessionsParams) ([]*UserSessionRepresentation, error) { const errMessage = "could not get client offline sessions" - var res []*UserSessionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + + queryParams := map[string]string{} + if params != nil && len(params) > 0 { + var err error + + queryParams, err = GetQueryParams(params[0]) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + } + + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&res). + SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "offline-sessions")) if err := checkForError(resp, err, errMessage); err != nil { @@ -1411,12 +1478,23 @@ func (g *GoCloak) GetClientOfflineSessions(ctx context.Context, token, realm, id } // GetClientUserSessions returns user sessions associated with the client -func (g *GoCloak) GetClientUserSessions(ctx context.Context, token, realm, idOfClient string) ([]*UserSessionRepresentation, error) { +func (g *GoCloak) GetClientUserSessions(ctx context.Context, token, realm, idOfClient string, params ...GetClientUserSessionsParams) ([]*UserSessionRepresentation, error) { const errMessage = "could not get client user sessions" - var res []*UserSessionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + + queryParams := map[string]string{} + if params != nil && len(params) > 0 { + var err error + + queryParams, err = GetQueryParams(params[0]) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + } + + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&res). + SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "user-sessions")) if err := checkForError(resp, err, errMessage); err != nil { @@ -1430,7 +1508,7 @@ func (g *GoCloak) GetClientUserSessions(ctx context.Context, token, realm, idOfC func (g *GoCloak) CreateClientProtocolMapper(ctx context.Context, token, realm, idOfClient string, mapper ProtocolMapperRepresentation) (string, error) { const errMessage = "could not create client protocol mapper" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(mapper). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "protocol-mappers", "models")) @@ -1445,7 +1523,7 @@ func (g *GoCloak) CreateClientProtocolMapper(ctx context.Context, token, realm, func (g *GoCloak) UpdateClientProtocolMapper(ctx context.Context, token, realm, idOfClient, mapperID string, mapper ProtocolMapperRepresentation) error { const errMessage = "could not update client protocol mapper" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(mapper). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "protocol-mappers", "models", mapperID)) @@ -1456,7 +1534,7 @@ func (g *GoCloak) UpdateClientProtocolMapper(ctx context.Context, token, realm, func (g *GoCloak) DeleteClientProtocolMapper(ctx context.Context, token, realm, idOfClient, mapperID string) error { const errMessage = "could not delete client protocol mapper" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "protocol-mappers", "models", mapperID)) return checkForError(resp, err, errMessage) @@ -1467,7 +1545,7 @@ func (g *GoCloak) GetKeyStoreConfig(ctx context.Context, token, realm string) (* const errMessage = "could not get key store config" var result KeyStoreConfig - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "keys")) @@ -1483,7 +1561,7 @@ func (g *GoCloak) GetComponents(ctx context.Context, token, realm string) ([]*Co const errMessage = "could not get components" var result []*Component - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "components")) @@ -1503,7 +1581,7 @@ func (g *GoCloak) GetComponentsWithParams(ctx context.Context, token, realm stri if err != nil { return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "components")) @@ -1522,7 +1600,7 @@ func (g *GoCloak) GetComponent(ctx context.Context, token, realm string, compone componentURL := fmt.Sprintf("components/%s", componentID) - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, componentURL)) @@ -1537,7 +1615,7 @@ func (g *GoCloak) GetComponent(ctx context.Context, token, realm string, compone func (g *GoCloak) UpdateComponent(ctx context.Context, token, realm string, component Component) error { const errMessage = "could not update component" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(component). Put(g.getAdminRealmURL(realm, "components", PString(component.ID))) @@ -1550,7 +1628,7 @@ func (g *GoCloak) GetDefaultGroups(ctx context.Context, token, realm string) ([] var result []*Group - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "default-groups")) @@ -1565,7 +1643,7 @@ func (g *GoCloak) GetDefaultGroups(ctx context.Context, token, realm string) ([] func (g *GoCloak) AddDefaultGroup(ctx context.Context, token, realm, groupID string) error { const errMessage = "could not add default group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Put(g.getAdminRealmURL(realm, "default-groups", groupID)) return checkForError(resp, err, errMessage) @@ -1575,7 +1653,7 @@ func (g *GoCloak) AddDefaultGroup(ctx context.Context, token, realm, groupID str func (g *GoCloak) RemoveDefaultGroup(ctx context.Context, token, realm, groupID string) error { const errMessage = "could not remove default group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "default-groups", groupID)) return checkForError(resp, err, errMessage) @@ -1585,7 +1663,7 @@ func (g *GoCloak) getRoleMappings(ctx context.Context, token, realm, path, objec const errMessage = "could not get role mappings" var result MappingsRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, path, objectID, "role-mappings")) @@ -1612,7 +1690,7 @@ func (g *GoCloak) GetGroup(ctx context.Context, token, realm, groupID string) (* var result Group - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID)) @@ -1629,7 +1707,7 @@ func (g *GoCloak) GetGroupByPath(ctx context.Context, token, realm, groupPath st var result Group - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "group-by-path", groupPath)) @@ -1650,7 +1728,7 @@ func (g *GoCloak) GetGroups(ctx context.Context, token, realm string, params Get return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "groups")) @@ -1662,12 +1740,29 @@ func (g *GoCloak) GetGroups(ctx context.Context, token, realm string, params Get return result, nil } +// GetGroupManagementPermissions returns whether group Authorization permissions have been initialized or not and a reference +// to the managed permissions +func (g *GoCloak) GetGroupManagementPermissions(ctx context.Context, token, realm string, idOfGroup string) (*ManagementPermissionRepresentation, error) { + const errMessage = "could not get management permissions" + + var result ManagementPermissionRepresentation + resp, err := g.GetRequestWithBearerAuth(ctx, token). + SetResult(&result). + Get(g.getAdminRealmURL(realm, "groups", idOfGroup, "management", "permissions")) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return &result, nil +} + // GetGroupsByRole gets groups assigned with a specific role of a realm func (g *GoCloak) GetGroupsByRole(ctx context.Context, token, realm string, roleName string) ([]*Group, error) { const errMessage = "could not get groups" var result []*Group - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles", roleName, "groups")) @@ -1683,7 +1778,7 @@ func (g *GoCloak) GetGroupsByClientRole(ctx context.Context, token, realm string const errMessage = "could not get groups" var result []*Group - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", clientID, "roles", roleName, "groups")) @@ -1703,7 +1798,7 @@ func (g *GoCloak) GetGroupsCount(ctx context.Context, token, realm string, param if err != nil { return 0, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "groups", "count")) @@ -1725,7 +1820,7 @@ func (g *GoCloak) GetGroupMembers(ctx context.Context, token, realm, groupID str return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "groups", groupID, "members")) @@ -1747,7 +1842,7 @@ func (g *GoCloak) GetClientRoles(ctx context.Context, token, realm, idOfClient s return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "roles")) @@ -1764,7 +1859,7 @@ func (g *GoCloak) GetClientRoleByID(ctx context.Context, token, realm, roleID st const errMessage = "could not get client role" var result Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles-by-id", roleID)) @@ -1780,7 +1875,7 @@ func (g *GoCloak) GetClientRolesByUserID(ctx context.Context, token, realm, idOf const errMessage = "could not client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "clients", idOfClient)) @@ -1796,7 +1891,7 @@ func (g *GoCloak) GetClientRolesByGroupID(ctx context.Context, token, realm, idO const errMessage = "could not get client roles by group id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "clients", idOfClient)) @@ -1812,7 +1907,7 @@ func (g *GoCloak) GetCompositeClientRolesByRoleID(ctx context.Context, token, re const errMessage = "could not get composite client roles by role id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles-by-id", roleID, "composites", "clients", idOfClient)) @@ -1828,7 +1923,7 @@ func (g *GoCloak) GetCompositeClientRolesByUserID(ctx context.Context, token, re const errMessage = "could not get composite client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "clients", idOfClient, "composite")) @@ -1844,7 +1939,7 @@ func (g *GoCloak) GetAvailableClientRolesByUserID(ctx context.Context, token, re const errMessage = "could not get available client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "clients", idOfClient, "available")) @@ -1860,7 +1955,7 @@ func (g *GoCloak) GetAvailableClientRolesByGroupID(ctx context.Context, token, r const errMessage = "could not get available client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "clients", idOfClient, "available")) @@ -1876,7 +1971,7 @@ func (g *GoCloak) GetCompositeClientRolesByGroupID(ctx context.Context, token, r const errMessage = "could not get composite client roles by group id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "clients", idOfClient, "composite")) @@ -1892,7 +1987,7 @@ func (g *GoCloak) GetClientRole(ctx context.Context, token, realm, idOfClient, r const errMessage = "could not get client role" var result Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "roles", roleName)) @@ -1912,7 +2007,7 @@ func (g *GoCloak) GetClients(ctx context.Context, token, realm string, params Ge if err != nil { return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients")) @@ -1924,6 +2019,23 @@ func (g *GoCloak) GetClients(ctx context.Context, token, realm string, params Ge return result, nil } +// GetClientManagementPermissions returns whether client Authorization permissions have been initialized or not and a reference +// to the managed permissions +func (g *GoCloak) GetClientManagementPermissions(ctx context.Context, token, realm string, idOfClient string) (*ManagementPermissionRepresentation, error) { + const errMessage = "could not get management permissions" + + var result ManagementPermissionRepresentation + resp, err := g.GetRequestWithBearerAuth(ctx, token). + SetResult(&result). + Get(g.getAdminRealmURL(realm, "clients", idOfClient, "management", "permissions")) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return &result, nil +} + // UserAttributeContains checks if the given attribute value is set func UserAttributeContains(attributes map[string][]string, attribute, value string) bool { for _, item := range attributes[attribute] { @@ -1942,7 +2054,7 @@ func UserAttributeContains(attributes map[string][]string, attribute, value stri func (g *GoCloak) CreateRealmRole(ctx context.Context, token string, realm string, role Role) (string, error) { const errMessage = "could not create realm role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(role). Post(g.getAdminRealmURL(realm, "roles")) @@ -1959,7 +2071,7 @@ func (g *GoCloak) GetRealmRole(ctx context.Context, token, realm, roleName strin var result Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles", roleName)) @@ -1975,7 +2087,7 @@ func (g *GoCloak) GetRealmRoleByID(ctx context.Context, token, realm, roleID str const errMessage = "could not get realm role" var result Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles-by-id", roleID)) @@ -1996,7 +2108,7 @@ func (g *GoCloak) GetRealmRoles(ctx context.Context, token, realm string, params return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "roles")) @@ -2013,7 +2125,7 @@ func (g *GoCloak) GetRealmRolesByUserID(ctx context.Context, token, realm, userI const errMessage = "could not get realm roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "realm")) @@ -2029,7 +2141,7 @@ func (g *GoCloak) GetRealmRolesByGroupID(ctx context.Context, token, realm, grou const errMessage = "could not get realm roles by group id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "realm")) @@ -2044,7 +2156,7 @@ func (g *GoCloak) GetRealmRolesByGroupID(ctx context.Context, token, realm, grou func (g *GoCloak) UpdateRealmRole(ctx context.Context, token, realm, roleName string, role Role) error { const errMessage = "could not update realm role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(role). Put(g.getAdminRealmURL(realm, "roles", roleName)) @@ -2055,7 +2167,7 @@ func (g *GoCloak) UpdateRealmRole(ctx context.Context, token, realm, roleName st func (g *GoCloak) UpdateRealmRoleByID(ctx context.Context, token, realm, roleID string, role Role) error { const errMessage = "could not update realm role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(role). Put(g.getAdminRealmURL(realm, "roles-by-id", roleID)) @@ -2066,7 +2178,7 @@ func (g *GoCloak) UpdateRealmRoleByID(ctx context.Context, token, realm, roleID func (g *GoCloak) DeleteRealmRole(ctx context.Context, token, realm, roleName string) error { const errMessage = "could not delete realm role" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "roles", roleName)) return checkForError(resp, err, errMessage) @@ -2076,7 +2188,7 @@ func (g *GoCloak) DeleteRealmRole(ctx context.Context, token, realm, roleName st func (g *GoCloak) AddRealmRoleToUser(ctx context.Context, token, realm, userID string, roles []Role) error { const errMessage = "could not add realm role to user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "realm")) @@ -2087,7 +2199,7 @@ func (g *GoCloak) AddRealmRoleToUser(ctx context.Context, token, realm, userID s func (g *GoCloak) DeleteRealmRoleFromUser(ctx context.Context, token, realm, userID string, roles []Role) error { const errMessage = "could not delete realm role from user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "realm")) @@ -2098,7 +2210,7 @@ func (g *GoCloak) DeleteRealmRoleFromUser(ctx context.Context, token, realm, use func (g *GoCloak) AddRealmRoleToGroup(ctx context.Context, token, realm, groupID string, roles []Role) error { const errMessage = "could not add realm role to group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "realm")) @@ -2109,7 +2221,7 @@ func (g *GoCloak) AddRealmRoleToGroup(ctx context.Context, token, realm, groupID func (g *GoCloak) DeleteRealmRoleFromGroup(ctx context.Context, token, realm, groupID string, roles []Role) error { const errMessage = "could not delete realm role from group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "realm")) @@ -2120,7 +2232,7 @@ func (g *GoCloak) DeleteRealmRoleFromGroup(ctx context.Context, token, realm, gr func (g *GoCloak) AddRealmRoleComposite(ctx context.Context, token, realm, roleName string, roles []Role) error { const errMessage = "could not add realm role composite" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "roles", roleName, "composites")) @@ -2131,7 +2243,7 @@ func (g *GoCloak) AddRealmRoleComposite(ctx context.Context, token, realm, roleN func (g *GoCloak) DeleteRealmRoleComposite(ctx context.Context, token, realm, roleName string, roles []Role) error { const errMessage = "could not delete realm role composite" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "roles", roleName, "composites")) @@ -2143,7 +2255,7 @@ func (g *GoCloak) GetCompositeRealmRoles(ctx context.Context, token, realm, role const errMessage = "could not get composite realm roles by role" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles", roleName, "composites")) @@ -2159,7 +2271,7 @@ func (g *GoCloak) GetCompositeRolesByRoleID(ctx context.Context, token, realm, r const errMessage = "could not get composite client roles by role id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles-by-id", roleID, "composites")) @@ -2175,7 +2287,7 @@ func (g *GoCloak) GetCompositeRealmRolesByRoleID(ctx context.Context, token, rea const errMessage = "could not get composite client roles by role id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "roles-by-id", roleID, "composites", "realm")) @@ -2191,7 +2303,7 @@ func (g *GoCloak) GetCompositeRealmRolesByUserID(ctx context.Context, token, rea const errMessage = "could not get composite client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "realm", "composite")) @@ -2207,7 +2319,7 @@ func (g *GoCloak) GetCompositeRealmRolesByGroupID(ctx context.Context, token, re const errMessage = "could not get composite client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "realm", "composite")) @@ -2223,7 +2335,7 @@ func (g *GoCloak) GetAvailableRealmRolesByUserID(ctx context.Context, token, rea const errMessage = "could not get available client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "realm", "available")) @@ -2239,7 +2351,7 @@ func (g *GoCloak) GetAvailableRealmRolesByGroupID(ctx context.Context, token, re const errMessage = "could not get available client roles by user id" var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "realm", "available")) @@ -2259,7 +2371,7 @@ func (g *GoCloak) GetRealm(ctx context.Context, token, realm string) (*RealmRepr const errMessage = "could not get realm" var result RealmRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm)) @@ -2275,7 +2387,7 @@ func (g *GoCloak) GetRealms(ctx context.Context, token string) ([]*RealmRepresen const errMessage = "could not get realms" var result []*RealmRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL("")) @@ -2290,7 +2402,7 @@ func (g *GoCloak) GetRealms(ctx context.Context, token string) ([]*RealmRepresen func (g *GoCloak) CreateRealm(ctx context.Context, token string, realm RealmRepresentation) (string, error) { const errMessage = "could not create realm" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(&realm). Post(g.getAdminRealmURL("")) @@ -2304,7 +2416,7 @@ func (g *GoCloak) CreateRealm(ctx context.Context, token string, realm RealmRepr func (g *GoCloak) UpdateRealm(ctx context.Context, token string, realm RealmRepresentation) error { const errMessage = "could not update realm" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(realm). Put(g.getAdminRealmURL(PString(realm.Realm))) @@ -2315,7 +2427,7 @@ func (g *GoCloak) UpdateRealm(ctx context.Context, token string, realm RealmRepr func (g *GoCloak) DeleteRealm(ctx context.Context, token, realm string) error { const errMessage = "could not delete realm" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm)) return checkForError(resp, err, errMessage) @@ -2325,7 +2437,7 @@ func (g *GoCloak) DeleteRealm(ctx context.Context, token, realm string) error { func (g *GoCloak) ClearRealmCache(ctx context.Context, token, realm string) error { const errMessage = "could not clear realm cache" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Post(g.getAdminRealmURL(realm, "clear-realm-cache")) return checkForError(resp, err, errMessage) @@ -2335,7 +2447,7 @@ func (g *GoCloak) ClearRealmCache(ctx context.Context, token, realm string) erro func (g *GoCloak) ClearUserCache(ctx context.Context, token, realm string) error { const errMessage = "could not clear user cache" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Post(g.getAdminRealmURL(realm, "clear-user-cache")) return checkForError(resp, err, errMessage) @@ -2345,7 +2457,7 @@ func (g *GoCloak) ClearUserCache(ctx context.Context, token, realm string) error func (g *GoCloak) ClearKeysCache(ctx context.Context, token, realm string) error { const errMessage = "could not clear keys cache" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Post(g.getAdminRealmURL(realm, "clear-keys-cache")) return checkForError(resp, err, errMessage) @@ -2355,7 +2467,7 @@ func (g *GoCloak) ClearKeysCache(ctx context.Context, token, realm string) error func (g *GoCloak) GetAuthenticationFlows(ctx context.Context, token, realm string) ([]*AuthenticationFlowRepresentation, error) { const errMessage = "could not retrieve authentication flows" var result []*AuthenticationFlowRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "authentication", "flows")) @@ -2369,7 +2481,7 @@ func (g *GoCloak) GetAuthenticationFlows(ctx context.Context, token, realm strin func (g *GoCloak) GetAuthenticationFlow(ctx context.Context, token, realm string, authenticationFlowID string) (*AuthenticationFlowRepresentation, error) { const errMessage = "could not retrieve authentication flows" var result *AuthenticationFlowRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "authentication", "flows", authenticationFlowID)) @@ -2383,7 +2495,7 @@ func (g *GoCloak) GetAuthenticationFlow(ctx context.Context, token, realm string func (g *GoCloak) CreateAuthenticationFlow(ctx context.Context, token, realm string, flow AuthenticationFlowRepresentation) error { const errMessage = "could not create authentication flows" var result []*AuthenticationFlowRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result).SetBody(flow). Post(g.getAdminRealmURL(realm, "authentication", "flows")) @@ -2394,7 +2506,7 @@ func (g *GoCloak) CreateAuthenticationFlow(ctx context.Context, token, realm str func (g *GoCloak) UpdateAuthenticationFlow(ctx context.Context, token, realm string, flow AuthenticationFlowRepresentation, authenticationFlowID string) (*AuthenticationFlowRepresentation, error) { const errMessage = "could not create authentication flows" var result *AuthenticationFlowRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result).SetBody(flow). Put(g.getAdminRealmURL(realm, "authentication", "flows", authenticationFlowID)) @@ -2407,7 +2519,7 @@ func (g *GoCloak) UpdateAuthenticationFlow(ctx context.Context, token, realm str // DeleteAuthenticationFlow deletes a flow in a realm with the given ID func (g *GoCloak) DeleteAuthenticationFlow(ctx context.Context, token, realm, flowID string) error { const errMessage = "could not delete authentication flows" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "authentication", "flows", flowID)) return checkForError(resp, err, errMessage) @@ -2417,7 +2529,7 @@ func (g *GoCloak) DeleteAuthenticationFlow(ctx context.Context, token, realm, fl func (g *GoCloak) GetAuthenticationExecutions(ctx context.Context, token, realm, flow string) ([]*ModifyAuthenticationExecutionRepresentation, error) { const errMessage = "could not retrieve authentication flows" var result []*ModifyAuthenticationExecutionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "authentication", "flows", flow, "executions")) @@ -2430,7 +2542,7 @@ func (g *GoCloak) GetAuthenticationExecutions(ctx context.Context, token, realm, // CreateAuthenticationExecution creates a new execution for the given flow name in the given realm func (g *GoCloak) CreateAuthenticationExecution(ctx context.Context, token, realm, flow string, execution CreateAuthenticationExecutionRepresentation) error { const errMessage = "could not create authentication execution" - resp, err := g.getRequestWithBearerAuth(ctx, token).SetBody(execution). + resp, err := g.GetRequestWithBearerAuth(ctx, token).SetBody(execution). Post(g.getAdminRealmURL(realm, "authentication", "flows", flow, "executions", "execution")) return checkForError(resp, err, errMessage) @@ -2439,7 +2551,7 @@ func (g *GoCloak) CreateAuthenticationExecution(ctx context.Context, token, real // UpdateAuthenticationExecution updates an authentication execution for the given flow in the given realm func (g *GoCloak) UpdateAuthenticationExecution(ctx context.Context, token, realm, flow string, execution ModifyAuthenticationExecutionRepresentation) error { const errMessage = "could not update authentication execution" - resp, err := g.getRequestWithBearerAuth(ctx, token).SetBody(execution). + resp, err := g.GetRequestWithBearerAuth(ctx, token).SetBody(execution). Put(g.getAdminRealmURL(realm, "authentication", "flows", flow, "executions")) return checkForError(resp, err, errMessage) @@ -2448,7 +2560,7 @@ func (g *GoCloak) UpdateAuthenticationExecution(ctx context.Context, token, real // DeleteAuthenticationExecution delete a single execution with the given ID func (g *GoCloak) DeleteAuthenticationExecution(ctx context.Context, token, realm, executionID string) error { const errMessage = "could not delete authentication execution" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "authentication", "executions", executionID)) return checkForError(resp, err, errMessage) @@ -2457,7 +2569,7 @@ func (g *GoCloak) DeleteAuthenticationExecution(ctx context.Context, token, real // CreateAuthenticationExecutionFlow creates a new execution for the given flow name in the given realm func (g *GoCloak) CreateAuthenticationExecutionFlow(ctx context.Context, token, realm, flow string, executionFlow CreateAuthenticationExecutionFlowRepresentation) error { const errMessage = "could not create authentication execution flow" - resp, err := g.getRequestWithBearerAuth(ctx, token).SetBody(executionFlow). + resp, err := g.GetRequestWithBearerAuth(ctx, token).SetBody(executionFlow). Post(g.getAdminRealmURL(realm, "authentication", "flows", flow, "executions", "flow")) return checkForError(resp, err, errMessage) @@ -2473,7 +2585,7 @@ func (g *GoCloak) CreateAuthenticationExecutionFlow(ctx context.Context, token, func (g *GoCloak) CreateUser(ctx context.Context, token, realm string, user User) (string, error) { const errMessage = "could not create user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(user). Post(g.getAdminRealmURL(realm, "users")) @@ -2488,7 +2600,7 @@ func (g *GoCloak) CreateUser(ctx context.Context, token, realm string, user User func (g *GoCloak) DeleteUser(ctx context.Context, token, realm, userID string) error { const errMessage = "could not delete user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "users", userID)) return checkForError(resp, err, errMessage) @@ -2503,7 +2615,7 @@ func (g *GoCloak) GetUserByID(ctx context.Context, accessToken, realm, userID st } var result User - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID)) @@ -2524,7 +2636,7 @@ func (g *GoCloak) GetUserCount(ctx context.Context, token string, realm string, return 0, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "users", "count")) @@ -2546,7 +2658,7 @@ func (g *GoCloak) GetUserGroups(ctx context.Context, token, realm, userID string return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "users", userID, "groups")) @@ -2568,7 +2680,7 @@ func (g *GoCloak) GetUsers(ctx context.Context, token, realm string, params GetU return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "users")) @@ -2590,7 +2702,7 @@ func (g *GoCloak) GetUsersByRoleName(ctx context.Context, token, realm, roleName return nil, errors.Wrap(err, errMessage) } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "roles", roleName, "users")) @@ -2612,7 +2724,7 @@ func (g *GoCloak) GetUsersByClientRoleName(ctx context.Context, token, realm, id return nil, err } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "roles", roleName, "users")) @@ -2629,7 +2741,7 @@ func (g *GoCloak) SetPassword(ctx context.Context, token, userID, realm, passwor const errMessage = "could not set password" requestBody := SetPasswordRequest{Password: &password, Temporary: &temporary, Type: StringP("password")} - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(requestBody). Put(g.getAdminRealmURL(realm, "users", userID, "reset-password")) @@ -2640,7 +2752,7 @@ func (g *GoCloak) SetPassword(ctx context.Context, token, userID, realm, passwor func (g *GoCloak) UpdateUser(ctx context.Context, token, realm string, user User) error { const errMessage = "could not update user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(user). Put(g.getAdminRealmURL(realm, "users", PString(user.ID))) @@ -2651,7 +2763,7 @@ func (g *GoCloak) UpdateUser(ctx context.Context, token, realm string, user User func (g *GoCloak) AddUserToGroup(ctx context.Context, token, realm, userID, groupID string) error { const errMessage = "could not add user to group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Put(g.getAdminRealmURL(realm, "users", userID, "groups", groupID)) return checkForError(resp, err, errMessage) @@ -2661,7 +2773,7 @@ func (g *GoCloak) AddUserToGroup(ctx context.Context, token, realm, userID, grou func (g *GoCloak) DeleteUserFromGroup(ctx context.Context, token, realm, userID, groupID string) error { const errMessage = "could not delete user from group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "users", userID, "groups", groupID)) return checkForError(resp, err, errMessage) @@ -2672,7 +2784,7 @@ func (g *GoCloak) GetUserSessions(ctx context.Context, token, realm, userID stri const errMessage = "could not get user sessions" var res []*UserSessionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&res). Get(g.getAdminRealmURL(realm, "users", userID, "sessions")) @@ -2688,7 +2800,7 @@ func (g *GoCloak) GetUserOfflineSessionsForClient(ctx context.Context, token, re const errMessage = "could not get user offline sessions for client" var res []*UserSessionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&res). Get(g.getAdminRealmURL(realm, "users", userID, "offline-sessions", idOfClient)) @@ -2703,7 +2815,7 @@ func (g *GoCloak) GetUserOfflineSessionsForClient(ctx context.Context, token, re func (g *GoCloak) AddClientRolesToUser(ctx context.Context, token, realm, idOfClient, userID string, roles []Role) error { const errMessage = "could not add client role to user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "clients", idOfClient)) @@ -2721,7 +2833,7 @@ func (g *GoCloak) AddClientRoleToUser(ctx context.Context, token, realm, idOfCli func (g *GoCloak) AddClientRolesToGroup(ctx context.Context, token, realm, idOfClient, groupID string, roles []Role) error { const errMessage = "could not add client role to group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "clients", idOfClient)) @@ -2739,7 +2851,7 @@ func (g *GoCloak) AddClientRoleToGroup(ctx context.Context, token, realm, idOfCl func (g *GoCloak) DeleteClientRolesFromUser(ctx context.Context, token, realm, idOfClient, userID string, roles []Role) error { const errMessage = "could not delete client role from user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "users", userID, "role-mappings", "clients", idOfClient)) @@ -2757,7 +2869,7 @@ func (g *GoCloak) DeleteClientRoleFromUser(ctx context.Context, token, realm, id func (g *GoCloak) DeleteClientRoleFromGroup(ctx context.Context, token, realm, idOfClient, groupID string, roles []Role) error { const errMessage = "could not client role from group" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "groups", groupID, "role-mappings", "clients", idOfClient)) @@ -2768,7 +2880,7 @@ func (g *GoCloak) DeleteClientRoleFromGroup(ctx context.Context, token, realm, i func (g *GoCloak) AddClientRoleComposite(ctx context.Context, token, realm, roleID string, roles []Role) error { const errMessage = "could not add client role composite" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "roles-by-id", roleID, "composites")) @@ -2779,7 +2891,7 @@ func (g *GoCloak) AddClientRoleComposite(ctx context.Context, token, realm, role func (g *GoCloak) DeleteClientRoleComposite(ctx context.Context, token, realm, roleID string, roles []Role) error { const errMessage = "could not delete client role composite" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "roles-by-id", roleID, "composites")) @@ -2791,7 +2903,7 @@ func (g *GoCloak) GetUserFederatedIdentities(ctx context.Context, token, realm, const errMessage = "could not get user federated identities" var res []*FederatedIdentityRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&res). Get(g.getAdminRealmURL(realm, "users", userID, "federated-identity")) @@ -2806,7 +2918,7 @@ func (g *GoCloak) GetUserFederatedIdentities(ctx context.Context, token, realm, func (g *GoCloak) CreateUserFederatedIdentity(ctx context.Context, token, realm, userID, providerID string, federatedIdentityRep FederatedIdentityRepresentation) error { const errMessage = "could not create user federeated identity" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(federatedIdentityRep). Post(g.getAdminRealmURL(realm, "users", userID, "federated-identity", providerID)) @@ -2817,7 +2929,7 @@ func (g *GoCloak) CreateUserFederatedIdentity(ctx context.Context, token, realm, func (g *GoCloak) DeleteUserFederatedIdentity(ctx context.Context, token, realm, userID, providerID string) error { const errMessage = "could not delete user federeated identity" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "users", userID, "federated-identity", providerID)) return checkForError(resp, err, errMessage) @@ -2828,7 +2940,7 @@ func (g *GoCloak) GetUserBruteForceDetectionStatus(ctx context.Context, accessTo const errMessage = "could not brute force detection Status" var result BruteForceStatus - resp, err := g.getRequestWithBearerAuth(ctx, accessToken). + resp, err := g.GetRequestWithBearerAuth(ctx, accessToken). SetResult(&result). Get(g.getAttackDetectionURL(realm, "users", userID)) @@ -2847,7 +2959,7 @@ func (g *GoCloak) GetUserBruteForceDetectionStatus(ctx context.Context, accessTo func (g *GoCloak) CreateIdentityProvider(ctx context.Context, token string, realm string, providerRep IdentityProviderRepresentation) (string, error) { const errMessage = "could not create identity provider" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(providerRep). Post(g.getAdminRealmURL(realm, "identity-provider", "instances")) @@ -2863,7 +2975,7 @@ func (g *GoCloak) GetIdentityProviders(ctx context.Context, token, realm string) const errMessage = "could not get identity providers" var result []*IdentityProviderRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "identity-provider", "instances")) @@ -2879,7 +2991,7 @@ func (g *GoCloak) GetIdentityProvider(ctx context.Context, token, realm, alias s const errMessage = "could not get identity provider" var result IdentityProviderRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "identity-provider", "instances", alias)) @@ -2894,7 +3006,7 @@ func (g *GoCloak) GetIdentityProvider(ctx context.Context, token, realm, alias s func (g *GoCloak) UpdateIdentityProvider(ctx context.Context, token, realm, alias string, providerRep IdentityProviderRepresentation) error { const errMessage = "could not update identity provider" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(providerRep). Put(g.getAdminRealmURL(realm, "identity-provider", "instances", alias)) @@ -2905,7 +3017,7 @@ func (g *GoCloak) UpdateIdentityProvider(ctx context.Context, token, realm, alia func (g *GoCloak) DeleteIdentityProvider(ctx context.Context, token, realm, alias string) error { const errMessage = "could not delete identity provider" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "identity-provider", "instances", alias)) return checkForError(resp, err, errMessage) @@ -2915,7 +3027,7 @@ func (g *GoCloak) DeleteIdentityProvider(ctx context.Context, token, realm, alia func (g *GoCloak) ExportIDPPublicBrokerConfig(ctx context.Context, token, realm, alias string) (*string, error) { const errMessage = "could not get public identity provider configuration" - resp, err := g.getRequestWithBearerAuthXMLHeader(ctx, token). + resp, err := g.GetRequestWithBearerAuthXMLHeader(ctx, token). Get(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "export")) if err := checkForError(resp, err, errMessage); err != nil { @@ -2931,7 +3043,7 @@ func (g *GoCloak) ImportIdentityProviderConfig(ctx context.Context, token, realm const errMessage = "could not import config" result := make(map[string]string) - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(map[string]string{ "fromUrl": fromURL, @@ -2951,7 +3063,7 @@ func (g *GoCloak) ImportIdentityProviderConfigFromFile(ctx context.Context, toke const errMessage = "could not import config" result := make(map[string]string) - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetFileReader("file", fileName, fileBody). SetFormData(map[string]string{ @@ -2970,7 +3082,7 @@ func (g *GoCloak) ImportIdentityProviderConfigFromFile(ctx context.Context, toke func (g *GoCloak) CreateIdentityProviderMapper(ctx context.Context, token, realm, alias string, mapper IdentityProviderMapper) (string, error) { const errMessage = "could not create mapper for identity provider" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(mapper). Post(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers")) @@ -2986,7 +3098,7 @@ func (g *GoCloak) GetIdentityProviderMapper(ctx context.Context, token string, r const errMessage = "could not get identity provider mapper" result := IdentityProviderMapper{} - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers", mapperID)) @@ -3001,7 +3113,7 @@ func (g *GoCloak) GetIdentityProviderMapper(ctx context.Context, token string, r func (g *GoCloak) DeleteIdentityProviderMapper(ctx context.Context, token, realm, alias, mapperID string) error { const errMessage = "could not delete mapper for identity provider" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers", mapperID)) return checkForError(resp, err, errMessage) @@ -3012,7 +3124,7 @@ func (g *GoCloak) GetIdentityProviderMappers(ctx context.Context, token, realm, const errMessage = "could not get identity provider mappers" var result []*IdentityProviderMapper - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers")) @@ -3028,7 +3140,7 @@ func (g *GoCloak) GetIdentityProviderMapperByID(ctx context.Context, token, real const errMessage = "could not get identity provider mappers" var result IdentityProviderMapper - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers", mapperID)) @@ -3043,7 +3155,7 @@ func (g *GoCloak) GetIdentityProviderMapperByID(ctx context.Context, token, real func (g *GoCloak) UpdateIdentityProviderMapper(ctx context.Context, token, realm, alias string, mapper IdentityProviderMapper) error { const errMessage = "could not update identity provider mapper" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(mapper). Put(g.getAdminRealmURL(realm, "identity-provider", "instances", alias, "mappers", PString(mapper.ID))) @@ -3059,7 +3171,7 @@ func (g *GoCloak) GetResource(ctx context.Context, token, realm, idOfClient, res const errMessage = "could not get resource" var result ResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "resource", resourceID)) @@ -3075,7 +3187,7 @@ func (g *GoCloak) GetResourceClient(ctx context.Context, token, realm, resourceI const errMessage = "could not get resource" var result ResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getRealmURL(realm, "authz", "protection", "resource_set", resourceID)) @@ -3098,7 +3210,7 @@ func (g *GoCloak) GetResources(ctx context.Context, token, realm, idOfClient str } var result []*ResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "resource")) @@ -3121,7 +3233,7 @@ func (g *GoCloak) GetResourcesClient(ctx context.Context, token, realm string, p var result []*ResourceRepresentation var resourceIDs []string - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&resourceIDs). SetQueryParams(queryParams). Get(g.getRealmURL(realm, "authz", "protection", "resource_set")) @@ -3140,6 +3252,24 @@ func (g *GoCloak) GetResourcesClient(ctx context.Context, token, realm string, p return result, nil } +// GetResourceServer returns resource server settings. +// The access token must have the realm view_clients role on its service +// account to be allowed to call this endpoint. +func (g *GoCloak) GetResourceServer(ctx context.Context, token, realm, idOfClient string) (*ResourceServerRepresentation, error) { + const errMessage = "could not get resource server settings" + + var result *ResourceServerRepresentation + resp, err := g.GetRequestWithBearerAuth(ctx, token). + SetResult(&result). + Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "settings")) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return result, nil +} + // UpdateResource updates a resource associated with the client, using access token from admin func (g *GoCloak) UpdateResource(ctx context.Context, token, realm, idOfClient string, resource ResourceRepresentation) error { const errMessage = "could not update resource" @@ -3148,7 +3278,7 @@ func (g *GoCloak) UpdateResource(ctx context.Context, token, realm, idOfClient s return errors.New("ID of a resource required") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(resource). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "resource", *(resource.ID))) @@ -3163,7 +3293,7 @@ func (g *GoCloak) UpdateResourceClient(ctx context.Context, token, realm string, return errors.New("ID of a resource required") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(resource). Put(g.getRealmURL(realm, "authz", "protection", "resource_set", *(resource.ID))) @@ -3175,7 +3305,7 @@ func (g *GoCloak) CreateResource(ctx context.Context, token, realm string, idOfC const errMessage = "could not create resource" var result ResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(resource). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "resource")) @@ -3192,7 +3322,7 @@ func (g *GoCloak) CreateResourceClient(ctx context.Context, token, realm string, const errMessage = "could not create resource" var result ResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(resource). Post(g.getRealmURL(realm, "authz", "protection", "resource_set")) @@ -3208,7 +3338,7 @@ func (g *GoCloak) CreateResourceClient(ctx context.Context, token, realm string, func (g *GoCloak) DeleteResource(ctx context.Context, token, realm, idOfClient, resourceID string) error { const errMessage = "could not delete resource" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "resource", resourceID)) return checkForError(resp, err, errMessage) @@ -3218,7 +3348,7 @@ func (g *GoCloak) DeleteResource(ctx context.Context, token, realm, idOfClient, func (g *GoCloak) DeleteResourceClient(ctx context.Context, token, realm, resourceID string) error { const errMessage = "could not delete resource" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getRealmURL(realm, "authz", "protection", "resource_set", resourceID)) return checkForError(resp, err, errMessage) @@ -3229,7 +3359,7 @@ func (g *GoCloak) GetScope(ctx context.Context, token, realm, idOfClient, scopeI const errMessage = "could not get scope" var result ScopeRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "scope", scopeID)) @@ -3249,7 +3379,7 @@ func (g *GoCloak) GetScopes(ctx context.Context, token, realm, idOfClient string return nil, err } var result []*ScopeRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "scope")) @@ -3266,7 +3396,7 @@ func (g *GoCloak) CreateScope(ctx context.Context, token, realm, idOfClient stri const errMessage = "could not create scope" var result ScopeRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(scope). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "scope")) @@ -3278,6 +3408,34 @@ func (g *GoCloak) CreateScope(ctx context.Context, token, realm, idOfClient stri return &result, nil } +// GetPermissionScope gets the permission scope associated with the client +func (g *GoCloak) GetPermissionScope(ctx context.Context, token, realm, idOfClient string, idOfScope string) (*PolicyRepresentation, error) { + const errMessage = "could not get permission scope" + + var result PolicyRepresentation + resp, err := g.GetRequestWithBearerAuth(ctx, token). + SetResult(&result). + SetBody(result). + Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", "scope", idOfScope)) + + if err := checkForError(resp, err, errMessage); err != nil { + return nil, err + } + + return &result, nil +} + +// UpdatePermissionScope updates a permission scope associated with the client +func (g *GoCloak) UpdatePermissionScope(ctx context.Context, token, realm, idOfClient string, idOfScope string, policy PolicyRepresentation) error { + const errMessage = "could not create permission scope" + + resp, err := g.GetRequestWithBearerAuth(ctx, token). + SetBody(policy). + Put(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", "scope", idOfScope)) + + return checkForError(resp, err, errMessage) +} + // UpdateScope updates a scope associated with the client func (g *GoCloak) UpdateScope(ctx context.Context, token, realm, idOfClient string, scope ScopeRepresentation) error { const errMessage = "could not update scope" @@ -3286,7 +3444,7 @@ func (g *GoCloak) UpdateScope(ctx context.Context, token, realm, idOfClient stri return errors.New("ID of a scope required") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(scope). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "scope", *(scope.ID))) @@ -3297,7 +3455,7 @@ func (g *GoCloak) UpdateScope(ctx context.Context, token, realm, idOfClient stri func (g *GoCloak) DeleteScope(ctx context.Context, token, realm, idOfClient, scopeID string) error { const errMessage = "could not delete scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "scope", scopeID)) return checkForError(resp, err, errMessage) @@ -3308,7 +3466,7 @@ func (g *GoCloak) GetPolicy(ctx context.Context, token, realm, idOfClient, polic const errMessage = "could not get policy" var result PolicyRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID)) @@ -3334,7 +3492,7 @@ func (g *GoCloak) GetPolicies(ctx context.Context, token, realm, idOfClient stri } var result []*PolicyRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, path...)) @@ -3355,7 +3513,7 @@ func (g *GoCloak) CreatePolicy(ctx context.Context, token, realm, idOfClient str } var result PolicyRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(policy). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", *(policy.Type))) @@ -3375,7 +3533,7 @@ func (g *GoCloak) UpdatePolicy(ctx context.Context, token, realm, idOfClient str return errors.New("ID of a policy required") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(policy). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", *(policy.Type), *(policy.ID))) @@ -3386,7 +3544,7 @@ func (g *GoCloak) UpdatePolicy(ctx context.Context, token, realm, idOfClient str func (g *GoCloak) DeletePolicy(ctx context.Context, token, realm, idOfClient, policyID string) error { const errMessage = "could not delete policy" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID)) return checkForError(resp, err, errMessage) @@ -3397,7 +3555,7 @@ func (g *GoCloak) GetAuthorizationPolicyAssociatedPolicies(ctx context.Context, const errMessage = "could not get policy associated policies" var result []*PolicyRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID, "associatedPolicies")) @@ -3413,7 +3571,7 @@ func (g *GoCloak) GetAuthorizationPolicyResources(ctx context.Context, token, re const errMessage = "could not get policy resources" var result []*PolicyResourceRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID, "resources")) @@ -3429,7 +3587,7 @@ func (g *GoCloak) GetAuthorizationPolicyScopes(ctx context.Context, token, realm const errMessage = "could not get policy scopes" var result []*PolicyScopeRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID, "scopes")) @@ -3445,7 +3603,7 @@ func (g *GoCloak) GetResourcePolicy(ctx context.Context, token, realm, permissio const errMessage = "could not get resource policy" var result ResourcePolicyRepresentation - resp, err := g.getRequestWithBearerAuthNoCache(ctx, token). + resp, err := g.GetRequestWithBearerAuthNoCache(ctx, token). SetResult(&result). Get(g.getRealmURL(realm, "authz", "protection", "uma-policy", permissionID)) @@ -3466,7 +3624,7 @@ func (g *GoCloak) GetResourcePolicies(ctx context.Context, token, realm string, } var result []*ResourcePolicyRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getRealmURL(realm, "authz", "protection", "uma-policy")) @@ -3483,7 +3641,7 @@ func (g *GoCloak) CreateResourcePolicy(ctx context.Context, token, realm, resour const errMessage = "could not create resource policy" var result ResourcePolicyRepresentation - resp, err := g.getRequestWithBearerAuthNoCache(ctx, token). + resp, err := g.GetRequestWithBearerAuthNoCache(ctx, token). SetResult(&result). SetBody(policy). Post(g.getRealmURL(realm, "authz", "protection", "uma-policy", resourceID)) @@ -3499,7 +3657,7 @@ func (g *GoCloak) CreateResourcePolicy(ctx context.Context, token, realm, resour func (g *GoCloak) UpdateResourcePolicy(ctx context.Context, token, realm, permissionID string, policy ResourcePolicyRepresentation) error { const errMessage = "could not update resource policy" - resp, err := g.getRequestWithBearerAuthNoCache(ctx, token). + resp, err := g.GetRequestWithBearerAuthNoCache(ctx, token). SetBody(policy). Put(g.getRealmURL(realm, "authz", "protection", "uma-policy", permissionID)) @@ -3510,7 +3668,7 @@ func (g *GoCloak) UpdateResourcePolicy(ctx context.Context, token, realm, permis func (g *GoCloak) DeleteResourcePolicy(ctx context.Context, token, realm, permissionID string) error { const errMessage = "could not delete resource policy" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getRealmURL(realm, "authz", "protection", "uma-policy", permissionID)) return checkForError(resp, err, errMessage) @@ -3521,7 +3679,7 @@ func (g *GoCloak) GetPermission(ctx context.Context, token, realm, idOfClient, p const errMessage = "could not get permission" var result PermissionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", permissionID)) @@ -3537,7 +3695,7 @@ func (g *GoCloak) GetDependentPermissions(ctx context.Context, token, realm, idO const errMessage = "could not get permission" var result []*PermissionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "policy", policyID, "dependentPolicies")) @@ -3553,7 +3711,7 @@ func (g *GoCloak) GetPermissionResources(ctx context.Context, token, realm, idOf const errMessage = "could not get permission resource" var result []*PermissionResource - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", permissionID, "resources")) @@ -3569,7 +3727,7 @@ func (g *GoCloak) GetPermissionScopes(ctx context.Context, token, realm, idOfCli const errMessage = "could not get permission scopes" var result []*PermissionScope - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", permissionID, "scopes")) @@ -3595,7 +3753,7 @@ func (g *GoCloak) GetPermissions(ctx context.Context, token, realm, idOfClient s } var result []*PermissionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, path...)) @@ -3636,7 +3794,7 @@ func (g *GoCloak) CreatePermissionTicket(ctx context.Context, token, realm strin } var result PermissionTicketResponseRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(permissions). Post(g.getRealmURL(realm, "authz", "protection", "permission")) @@ -3676,7 +3834,7 @@ func (g *GoCloak) GrantUserPermission(ctx context.Context, token, realm string, var result PermissionGrantResponseRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(permission). Post(g.getRealmURL(realm, "authz", "protection", "permission", "ticket")) @@ -3712,7 +3870,7 @@ func (g *GoCloak) UpdateUserPermission(ctx context.Context, token, realm string, var result PermissionGrantResponseRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(permission). Put(g.getRealmURL(realm, "authz", "protection", "permission", "ticket")) @@ -3738,7 +3896,7 @@ func (g *GoCloak) GetUserPermissions(ctx context.Context, token, realm string, p } var result []*PermissionGrantResponseRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getRealmURL(realm, "authz", "protection", "permission", "ticket")) @@ -3754,7 +3912,7 @@ func (g *GoCloak) GetUserPermissions(ctx context.Context, token, realm string, p func (g *GoCloak) DeleteUserPermission(ctx context.Context, token, realm, ticketID string) error { const errMessage = "could not delete user permission" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getRealmURL(realm, "authz", "protection", "permission", "ticket", ticketID)) return checkForError(resp, err, errMessage) @@ -3769,7 +3927,7 @@ func (g *GoCloak) CreatePermission(ctx context.Context, token, realm, idOfClient } var result PermissionRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetBody(permission). Post(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", *(permission.Type))) @@ -3788,7 +3946,7 @@ func (g *GoCloak) UpdatePermission(ctx context.Context, token, realm, idOfClient if NilOrEmpty(permission.ID) { return errors.New("ID of a permission required") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(permission). Put(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", *permission.Type, *permission.ID)) @@ -3799,7 +3957,7 @@ func (g *GoCloak) UpdatePermission(ctx context.Context, token, realm, idOfClient func (g *GoCloak) DeletePermission(ctx context.Context, token, realm, idOfClient, permissionID string) error { const errMessage = "could not delete permission" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "clients", idOfClient, "authz", "resource-server", "permission", permissionID)) return checkForError(resp, err, errMessage) @@ -3814,7 +3972,7 @@ func (g *GoCloak) GetCredentialRegistrators(ctx context.Context, token, realm st const errMessage = "could not get user credential registrators" var result []string - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "credential-registrators")) @@ -3830,7 +3988,7 @@ func (g *GoCloak) GetConfiguredUserStorageCredentialTypes(ctx context.Context, t const errMessage = "could not get user credential registrators" var result []string - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "configured-user-storage-credential-types")) @@ -3846,7 +4004,7 @@ func (g *GoCloak) GetCredentials(ctx context.Context, token, realm, userID strin const errMessage = "could not get user credentials" var result []*CredentialRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "users", userID, "credentials")) @@ -3861,7 +4019,7 @@ func (g *GoCloak) GetCredentials(ctx context.Context, token, realm, userID strin func (g *GoCloak) DeleteCredentials(ctx context.Context, token, realm, userID, credentialID string) error { const errMessage = "could not delete user credentials" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "users", userID, "credentials", credentialID)) return checkForError(resp, err, errMessage) @@ -3871,7 +4029,7 @@ func (g *GoCloak) DeleteCredentials(ctx context.Context, token, realm, userID, c func (g *GoCloak) UpdateCredentialUserLabel(ctx context.Context, token, realm, userID, credentialID, userLabel string) error { const errMessage = "could not update credential label for a user" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetHeader("Content-Type", "text/plain"). SetBody(userLabel). Put(g.getAdminRealmURL(realm, "users", userID, "credentials", credentialID, "userLabel")) @@ -3883,7 +4041,7 @@ func (g *GoCloak) UpdateCredentialUserLabel(ctx context.Context, token, realm, u func (g *GoCloak) DisableAllCredentialsByType(ctx context.Context, token, realm, userID string, types []string) error { const errMessage = "could not update disable credentials" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(types). Put(g.getAdminRealmURL(realm, "users", userID, "disable-credential-types")) @@ -3894,7 +4052,7 @@ func (g *GoCloak) DisableAllCredentialsByType(ctx context.Context, token, realm, func (g *GoCloak) MoveCredentialBehind(ctx context.Context, token, realm, userID, credentialID, newPreviousCredentialID string) error { const errMessage = "could not move credential" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Post(g.getAdminRealmURL(realm, "users", userID, "credentials", credentialID, "moveAfter", newPreviousCredentialID)) return checkForError(resp, err, errMessage) @@ -3904,7 +4062,7 @@ func (g *GoCloak) MoveCredentialBehind(ctx context.Context, token, realm, userID func (g *GoCloak) MoveCredentialToFirst(ctx context.Context, token, realm, userID, credentialID string) error { const errMessage = "could not move credential" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Post(g.getAdminRealmURL(realm, "users", userID, "credentials", credentialID, "moveToFirst")) return checkForError(resp, err, errMessage) @@ -3920,7 +4078,7 @@ func (g *GoCloak) GetEvents(ctx context.Context, token string, realm string, par } var result []*EventRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). SetQueryParams(queryParams). Get(g.getAdminRealmURL(realm, "events")) @@ -3938,7 +4096,7 @@ func (g *GoCloak) GetClientScopesScopeMappingsRealmRolesAvailable(ctx context.Co var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", clientScopeID, "scope-mappings", "realm", "available")) @@ -3955,7 +4113,7 @@ func (g *GoCloak) GetClientScopesScopeMappingsRealmRoles(ctx context.Context, to var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", clientScopeID, "scope-mappings", "realm")) @@ -3970,7 +4128,7 @@ func (g *GoCloak) GetClientScopesScopeMappingsRealmRoles(ctx context.Context, to func (g *GoCloak) DeleteClientScopesScopeMappingsRealmRoles(ctx context.Context, token, realm, clientScopeID string, roles []Role) error { const errMessage = "could not delete realm-level roles from the client-scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "client-scopes", clientScopeID, "scope-mappings", "realm")) @@ -3981,7 +4139,7 @@ func (g *GoCloak) DeleteClientScopesScopeMappingsRealmRoles(ctx context.Context, func (g *GoCloak) CreateClientScopesScopeMappingsRealmRoles(ctx context.Context, token, realm, clientScopeID string, roles []Role) error { const errMessage = "could not create realm-level roles to the client-scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "client-scopes", clientScopeID, "scope-mappings", "realm")) @@ -3992,7 +4150,7 @@ func (g *GoCloak) CreateClientScopesScopeMappingsRealmRoles(ctx context.Context, func (g *GoCloak) RegisterRequiredAction(ctx context.Context, token string, realm string, requiredAction RequiredActionProviderRepresentation) error { const errMessage = "could not create required action" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(requiredAction). Post(g.getAdminRealmURL(realm, "authentication", "register-required-action")) @@ -4008,7 +4166,7 @@ func (g *GoCloak) GetRequiredActions(ctx context.Context, token string, realm st const errMessage = "could not get required actions" var result []*RequiredActionProviderRepresentation - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "authentication", "required-actions")) @@ -4028,7 +4186,7 @@ func (g *GoCloak) GetRequiredAction(ctx context.Context, token string, realm str return nil, errors.New("alias is required for getting a required action") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "authentication", "required-actions", alias)) @@ -4046,7 +4204,7 @@ func (g *GoCloak) UpdateRequiredAction(ctx context.Context, token string, realm if NilOrEmpty(requiredAction.ProviderID) { return errors.New("providerId is required for updating a required action") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(requiredAction). Put(g.getAdminRealmURL(realm, "authentication", "required-actions", *requiredAction.ProviderID)) @@ -4060,7 +4218,7 @@ func (g *GoCloak) DeleteRequiredAction(ctx context.Context, token string, realm if alias == "" { return errors.New("alias is required for deleting a required action") } - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). Delete(g.getAdminRealmURL(realm, "authentication", "required-actions", alias)) if err := checkForError(resp, err, errMessage); err != nil { @@ -4076,7 +4234,7 @@ func (g *GoCloak) CreateClientScopesScopeMappingsClientRoles( ) error { const errMessage = "could not create client-level roles to the client-scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Post(g.getAdminRealmURL(realm, "client-scopes", idOfClientScope, "scope-mappings", "clients", idOfClient)) @@ -4091,7 +4249,7 @@ func (g *GoCloak) GetClientScopesScopeMappingsClientRolesAvailable(ctx context.C var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", idOfClientScope, "scope-mappings", "clients", idOfClient, "available")) @@ -4109,7 +4267,7 @@ func (g *GoCloak) GetClientScopesScopeMappingsClientRoles(ctx context.Context, t var result []*Role - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetResult(&result). Get(g.getAdminRealmURL(realm, "client-scopes", idOfClientScope, "scope-mappings", "clients", idOfClient)) @@ -4125,9 +4283,24 @@ func (g *GoCloak) GetClientScopesScopeMappingsClientRoles(ctx context.Context, t func (g *GoCloak) DeleteClientScopesScopeMappingsClientRoles(ctx context.Context, token, realm, idOfClientScope, idOfClient string, roles []Role) error { const errMessage = "could not delete client-level roles from the client-scope" - resp, err := g.getRequestWithBearerAuth(ctx, token). + resp, err := g.GetRequestWithBearerAuth(ctx, token). SetBody(roles). Delete(g.getAdminRealmURL(realm, "client-scopes", idOfClientScope, "scope-mappings", "clients", idOfClient)) return checkForError(resp, err, errMessage) } + +// RevokeToken revokes the passed token. The token can either be an access or refresh token. +func (g *GoCloak) RevokeToken(ctx context.Context, realm, clientID, clientSecret, refreshToken string) error { + const errMessage = "could not revoke token" + + resp, err := g.GetRequestWithBasicAuth(ctx, clientID, clientSecret). + SetFormData(map[string]string{ + "client_id": clientID, + "client_secret": clientSecret, + "token": refreshToken, + }). + Post(g.getRealmURL(realm, g.Config.revokeEndpoint)) + + return checkForError(resp, err, errMessage) +} diff --git a/vendor/github.com/Nerzal/gocloak/v13/models.go b/vendor/github.com/Nerzal/gocloak/v13/models.go index 17922d9d6..ee0512178 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/models.go +++ b/vendor/github.com/Nerzal/gocloak/v13/models.go @@ -342,11 +342,13 @@ type GroupsCount struct { // GetGroupsParams represents the optional parameters for getting groups type GetGroupsParams struct { - First *int `json:"first,string,omitempty"` - Max *int `json:"max,string,omitempty"` - Search *string `json:"search,omitempty"` - Full *bool `json:"full,string,omitempty"` BriefRepresentation *bool `json:"briefRepresentation,string,omitempty"` + Exact *bool `json:"exact,string,omitempty"` + First *int `json:"first,string,omitempty"` + Full *bool `json:"full,string,omitempty"` + Max *int `json:"max,string,omitempty"` + Q *string `json:"q,omitempty"` + Search *string `json:"search,omitempty"` } // MarshalJSON is a custom json marshaling function to automatically set the Full and BriefRepresentation properties @@ -445,6 +447,7 @@ type ProtocolMappersConfig struct { AttributeName *string `json:"attribute.name,omitempty"` AttributeNameFormat *string `json:"attribute.nameformat,omitempty"` Single *string `json:"single,omitempty"` + Script *string `json:"script,omitempty"` } // Client is a ClientRepresentation @@ -717,120 +720,122 @@ type RolesRepresentation struct { // RealmRepresentation represents a realm type RealmRepresentation struct { - AccessCodeLifespan *int `json:"accessCodeLifespan,omitempty"` - AccessCodeLifespanLogin *int `json:"accessCodeLifespanLogin,omitempty"` - AccessCodeLifespanUserAction *int `json:"accessCodeLifespanUserAction,omitempty"` - AccessTokenLifespan *int `json:"accessTokenLifespan,omitempty"` - AccessTokenLifespanForImplicitFlow *int `json:"accessTokenLifespanForImplicitFlow,omitempty"` - AccountTheme *string `json:"accountTheme,omitempty"` - ActionTokenGeneratedByAdminLifespan *int `json:"actionTokenGeneratedByAdminLifespan,omitempty"` - ActionTokenGeneratedByUserLifespan *int `json:"actionTokenGeneratedByUserLifespan,omitempty"` - AdminEventsDetailsEnabled *bool `json:"adminEventsDetailsEnabled,omitempty"` - AdminEventsEnabled *bool `json:"adminEventsEnabled,omitempty"` - AdminTheme *string `json:"adminTheme,omitempty"` - Attributes *map[string]string `json:"attributes,omitempty"` - AuthenticationFlows *[]interface{} `json:"authenticationFlows,omitempty"` - AuthenticatorConfig *[]interface{} `json:"authenticatorConfig,omitempty"` - BrowserFlow *string `json:"browserFlow,omitempty"` - BrowserSecurityHeaders *map[string]string `json:"browserSecurityHeaders,omitempty"` - BruteForceProtected *bool `json:"bruteForceProtected,omitempty"` - ClientAuthenticationFlow *string `json:"clientAuthenticationFlow,omitempty"` - ClientScopeMappings *map[string]string `json:"clientScopeMappings,omitempty"` - ClientScopes *[]ClientScope `json:"clientScopes,omitempty"` - Clients *[]Client `json:"clients,omitempty"` - Components interface{} `json:"components,omitempty"` - DefaultDefaultClientScopes *[]string `json:"defaultDefaultClientScopes,omitempty"` - DefaultGroups *[]string `json:"defaultGroups,omitempty"` - DefaultLocale *string `json:"defaultLocale,omitempty"` - DefaultOptionalClientScopes *[]string `json:"defaultOptionalClientScopes,omitempty"` - DefaultRole *Role `json:"defaultRole,omitempty"` - DefaultRoles *[]string `json:"defaultRoles,omitempty"` - DefaultSignatureAlgorithm *string `json:"defaultSignatureAlgorithm,omitempty"` - DirectGrantFlow *string `json:"directGrantFlow,omitempty"` - DisplayName *string `json:"displayName,omitempty"` - DisplayNameHTML *string `json:"displayNameHtml,omitempty"` - DockerAuthenticationFlow *string `json:"dockerAuthenticationFlow,omitempty"` - DuplicateEmailsAllowed *bool `json:"duplicateEmailsAllowed,omitempty"` - EditUsernameAllowed *bool `json:"editUsernameAllowed,omitempty"` - EmailTheme *string `json:"emailTheme,omitempty"` - Enabled *bool `json:"enabled,omitempty"` - EnabledEventTypes *[]string `json:"enabledEventTypes,omitempty"` - EventsEnabled *bool `json:"eventsEnabled,omitempty"` - EventsExpiration *int64 `json:"eventsExpiration,omitempty"` - EventsListeners *[]string `json:"eventsListeners,omitempty"` - FailureFactor *int `json:"failureFactor,omitempty"` - FederatedUsers *[]interface{} `json:"federatedUsers,omitempty"` - Groups *[]interface{} `json:"groups,omitempty"` - ID *string `json:"id,omitempty"` - IdentityProviderMappers *[]interface{} `json:"identityProviderMappers,omitempty"` - IdentityProviders *[]interface{} `json:"identityProviders,omitempty"` - InternationalizationEnabled *bool `json:"internationalizationEnabled,omitempty"` - KeycloakVersion *string `json:"keycloakVersion,omitempty"` - LoginTheme *string `json:"loginTheme,omitempty"` - LoginWithEmailAllowed *bool `json:"loginWithEmailAllowed,omitempty"` - MaxDeltaTimeSeconds *int `json:"maxDeltaTimeSeconds,omitempty"` - MaxFailureWaitSeconds *int `json:"maxFailureWaitSeconds,omitempty"` - MinimumQuickLoginWaitSeconds *int `json:"minimumQuickLoginWaitSeconds,omitempty"` - NotBefore *int `json:"notBefore,omitempty"` - OfflineSessionIdleTimeout *int `json:"offlineSessionIdleTimeout,omitempty"` - OfflineSessionMaxLifespan *int `json:"offlineSessionMaxLifespan,omitempty"` - OfflineSessionMaxLifespanEnabled *bool `json:"offlineSessionMaxLifespanEnabled,omitempty"` - OtpPolicyAlgorithm *string `json:"otpPolicyAlgorithm,omitempty"` - OtpPolicyDigits *int `json:"otpPolicyDigits,omitempty"` - OtpPolicyInitialCounter *int `json:"otpPolicyInitialCounter,omitempty"` - OtpPolicyLookAheadWindow *int `json:"otpPolicyLookAheadWindow,omitempty"` - OtpPolicyPeriod *int `json:"otpPolicyPeriod,omitempty"` - OtpPolicyType *string `json:"otpPolicyType,omitempty"` - OtpSupportedApplications *[]string `json:"otpSupportedApplications,omitempty"` - PasswordPolicy *string `json:"passwordPolicy,omitempty"` - PermanentLockout *bool `json:"permanentLockout,omitempty"` - ProtocolMappers *[]interface{} `json:"protocolMappers,omitempty"` - QuickLoginCheckMilliSeconds *int64 `json:"quickLoginCheckMilliSeconds,omitempty"` - Realm *string `json:"realm,omitempty"` - RefreshTokenMaxReuse *int `json:"refreshTokenMaxReuse,omitempty"` - RegistrationAllowed *bool `json:"registrationAllowed,omitempty"` - RegistrationEmailAsUsername *bool `json:"registrationEmailAsUsername,omitempty"` - RegistrationFlow *string `json:"registrationFlow,omitempty"` - RememberMe *bool `json:"rememberMe,omitempty"` - RequiredActions *[]interface{} `json:"requiredActions,omitempty"` - ResetCredentialsFlow *string `json:"resetCredentialsFlow,omitempty"` - ResetPasswordAllowed *bool `json:"resetPasswordAllowed,omitempty"` - RevokeRefreshToken *bool `json:"revokeRefreshToken,omitempty"` - Roles *RolesRepresentation `json:"roles,omitempty"` - ScopeMappings *[]interface{} `json:"scopeMappings,omitempty"` - SMTPServer *map[string]string `json:"smtpServer,omitempty"` - SslRequired *string `json:"sslRequired,omitempty"` - SsoSessionIdleTimeout *int `json:"ssoSessionIdleTimeout,omitempty"` - SsoSessionIdleTimeoutRememberMe *int `json:"ssoSessionIdleTimeoutRememberMe,omitempty"` - SsoSessionMaxLifespan *int `json:"ssoSessionMaxLifespan,omitempty"` - SsoSessionMaxLifespanRememberMe *int `json:"ssoSessionMaxLifespanRememberMe,omitempty"` - SupportedLocales *[]string `json:"supportedLocales,omitempty"` - UserFederationMappers *[]interface{} `json:"userFederationMappers,omitempty"` - UserFederationProviders *[]interface{} `json:"userFederationProviders,omitempty"` - UserManagedAccessAllowed *bool `json:"userManagedAccessAllowed,omitempty"` - Users *[]User `json:"users,omitempty"` - VerifyEmail *bool `json:"verifyEmail,omitempty"` - WaitIncrementSeconds *int `json:"waitIncrementSeconds,omitempty"` - WebAuthnPolicyAcceptableAaguids *[]string `json:"webAuthnPolicyAcceptableAaguids,omitempty"` - WebAuthnPolicyAttestationConveyancePreference *string `json:"webAuthnPolicyAttestationConveyancePreference,omitempty"` - WebAuthnPolicyAuthenticatorAttachment *string `json:"webAuthnPolicyAuthenticatorAttachment,omitempty"` - WebAuthnPolicyAvoidSameAuthenticatorRegister *bool `json:"webAuthnPolicyAvoidSameAuthenticatorRegister,omitempty"` - WebAuthnPolicyCreateTimeout *int `json:"webAuthnPolicyCreateTimeout,omitempty"` - WebAuthnPolicyPasswordlessAcceptableAaguids *[]string `json:"webAuthnPolicyPasswordlessAcceptableAaguids,omitempty"` - WebAuthnPolicyPasswordlessAttestationConveyancePreference *string `json:"webAuthnPolicyPasswordlessAttestationConveyancePreference,omitempty"` - WebAuthnPolicyPasswordlessAuthenticatorAttachment *string `json:"webAuthnPolicyPasswordlessAuthenticatorAttachment,omitempty"` - WebAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister *bool `json:"webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister,omitempty"` - WebAuthnPolicyPasswordlessCreateTimeout *int `json:"webAuthnPolicyPasswordlessCreateTimeout,omitempty"` - WebAuthnPolicyPasswordlessRequireResidentKey *string `json:"webAuthnPolicyPasswordlessRequireResidentKey,omitempty"` - WebAuthnPolicyPasswordlessRpEntityName *string `json:"webAuthnPolicyPasswordlessRpEntityName,omitempty"` - WebAuthnPolicyPasswordlessRpID *string `json:"webAuthnPolicyPasswordlessRpId,omitempty"` - WebAuthnPolicyPasswordlessSignatureAlgorithms *[]string `json:"webAuthnPolicyPasswordlessSignatureAlgorithms,omitempty"` - WebAuthnPolicyPasswordlessUserVerificationRequirement *string `json:"webAuthnPolicyPasswordlessUserVerificationRequirement,omitempty"` - WebAuthnPolicyRequireResidentKey *string `json:"webAuthnPolicyRequireResidentKey,omitempty"` - WebAuthnPolicyRpEntityName *string `json:"webAuthnPolicyRpEntityName,omitempty"` - WebAuthnPolicyRpID *string `json:"webAuthnPolicyRpId,omitempty"` - WebAuthnPolicySignatureAlgorithms *[]string `json:"webAuthnPolicySignatureAlgorithms,omitempty"` - WebAuthnPolicyUserVerificationRequirement *string `json:"webAuthnPolicyUserVerificationRequirement,omitempty"` + AccessCodeLifespan *int `json:"accessCodeLifespan,omitempty"` + AccessCodeLifespanLogin *int `json:"accessCodeLifespanLogin,omitempty"` + AccessCodeLifespanUserAction *int `json:"accessCodeLifespanUserAction,omitempty"` + AccessTokenLifespan *int `json:"accessTokenLifespan,omitempty"` + AccessTokenLifespanForImplicitFlow *int `json:"accessTokenLifespanForImplicitFlow,omitempty"` + AccountTheme *string `json:"accountTheme,omitempty"` + ActionTokenGeneratedByAdminLifespan *int `json:"actionTokenGeneratedByAdminLifespan,omitempty"` + ActionTokenGeneratedByUserLifespan *int `json:"actionTokenGeneratedByUserLifespan,omitempty"` + AdminEventsDetailsEnabled *bool `json:"adminEventsDetailsEnabled,omitempty"` + AdminEventsEnabled *bool `json:"adminEventsEnabled,omitempty"` + AdminTheme *string `json:"adminTheme,omitempty"` + Attributes *map[string]string `json:"attributes,omitempty"` + AuthenticationFlows *[]interface{} `json:"authenticationFlows,omitempty"` + AuthenticatorConfig *[]interface{} `json:"authenticatorConfig,omitempty"` + BrowserFlow *string `json:"browserFlow,omitempty"` + BrowserSecurityHeaders *map[string]string `json:"browserSecurityHeaders,omitempty"` + BruteForceProtected *bool `json:"bruteForceProtected,omitempty"` + ClientAuthenticationFlow *string `json:"clientAuthenticationFlow,omitempty"` + ClientPolicies *map[string][]interface{} `json:"clientPolicies,omitempty"` + ClientProfiles *map[string][]interface{} `json:"clientProfiles,omitempty"` + ClientScopeMappings *map[string][]interface{} `json:"clientScopeMappings,omitempty"` + ClientScopes *[]ClientScope `json:"clientScopes,omitempty"` + Clients *[]Client `json:"clients,omitempty"` + Components interface{} `json:"components,omitempty"` + DefaultDefaultClientScopes *[]string `json:"defaultDefaultClientScopes,omitempty"` + DefaultGroups *[]string `json:"defaultGroups,omitempty"` + DefaultLocale *string `json:"defaultLocale,omitempty"` + DefaultOptionalClientScopes *[]string `json:"defaultOptionalClientScopes,omitempty"` + DefaultRole *Role `json:"defaultRole,omitempty"` + DefaultRoles *[]string `json:"defaultRoles,omitempty"` + DefaultSignatureAlgorithm *string `json:"defaultSignatureAlgorithm,omitempty"` + DirectGrantFlow *string `json:"directGrantFlow,omitempty"` + DisplayName *string `json:"displayName,omitempty"` + DisplayNameHTML *string `json:"displayNameHtml,omitempty"` + DockerAuthenticationFlow *string `json:"dockerAuthenticationFlow,omitempty"` + DuplicateEmailsAllowed *bool `json:"duplicateEmailsAllowed,omitempty"` + EditUsernameAllowed *bool `json:"editUsernameAllowed,omitempty"` + EmailTheme *string `json:"emailTheme,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + EnabledEventTypes *[]string `json:"enabledEventTypes,omitempty"` + EventsEnabled *bool `json:"eventsEnabled,omitempty"` + EventsExpiration *int64 `json:"eventsExpiration,omitempty"` + EventsListeners *[]string `json:"eventsListeners,omitempty"` + FailureFactor *int `json:"failureFactor,omitempty"` + FederatedUsers *[]interface{} `json:"federatedUsers,omitempty"` + Groups *[]interface{} `json:"groups,omitempty"` + ID *string `json:"id,omitempty"` + IdentityProviderMappers *[]interface{} `json:"identityProviderMappers,omitempty"` + IdentityProviders *[]interface{} `json:"identityProviders,omitempty"` + InternationalizationEnabled *bool `json:"internationalizationEnabled,omitempty"` + KeycloakVersion *string `json:"keycloakVersion,omitempty"` + LoginTheme *string `json:"loginTheme,omitempty"` + LoginWithEmailAllowed *bool `json:"loginWithEmailAllowed,omitempty"` + MaxDeltaTimeSeconds *int `json:"maxDeltaTimeSeconds,omitempty"` + MaxFailureWaitSeconds *int `json:"maxFailureWaitSeconds,omitempty"` + MinimumQuickLoginWaitSeconds *int `json:"minimumQuickLoginWaitSeconds,omitempty"` + NotBefore *int `json:"notBefore,omitempty"` + OfflineSessionIdleTimeout *int `json:"offlineSessionIdleTimeout,omitempty"` + OfflineSessionMaxLifespan *int `json:"offlineSessionMaxLifespan,omitempty"` + OfflineSessionMaxLifespanEnabled *bool `json:"offlineSessionMaxLifespanEnabled,omitempty"` + OtpPolicyAlgorithm *string `json:"otpPolicyAlgorithm,omitempty"` + OtpPolicyDigits *int `json:"otpPolicyDigits,omitempty"` + OtpPolicyInitialCounter *int `json:"otpPolicyInitialCounter,omitempty"` + OtpPolicyLookAheadWindow *int `json:"otpPolicyLookAheadWindow,omitempty"` + OtpPolicyPeriod *int `json:"otpPolicyPeriod,omitempty"` + OtpPolicyType *string `json:"otpPolicyType,omitempty"` + OtpSupportedApplications *[]string `json:"otpSupportedApplications,omitempty"` + PasswordPolicy *string `json:"passwordPolicy,omitempty"` + PermanentLockout *bool `json:"permanentLockout,omitempty"` + ProtocolMappers *[]interface{} `json:"protocolMappers,omitempty"` + QuickLoginCheckMilliSeconds *int64 `json:"quickLoginCheckMilliSeconds,omitempty"` + Realm *string `json:"realm,omitempty"` + RefreshTokenMaxReuse *int `json:"refreshTokenMaxReuse,omitempty"` + RegistrationAllowed *bool `json:"registrationAllowed,omitempty"` + RegistrationEmailAsUsername *bool `json:"registrationEmailAsUsername,omitempty"` + RegistrationFlow *string `json:"registrationFlow,omitempty"` + RememberMe *bool `json:"rememberMe,omitempty"` + RequiredActions *[]interface{} `json:"requiredActions,omitempty"` + ResetCredentialsFlow *string `json:"resetCredentialsFlow,omitempty"` + ResetPasswordAllowed *bool `json:"resetPasswordAllowed,omitempty"` + RevokeRefreshToken *bool `json:"revokeRefreshToken,omitempty"` + Roles *RolesRepresentation `json:"roles,omitempty"` + ScopeMappings *[]interface{} `json:"scopeMappings,omitempty"` + SMTPServer *map[string]string `json:"smtpServer,omitempty"` + SslRequired *string `json:"sslRequired,omitempty"` + SsoSessionIdleTimeout *int `json:"ssoSessionIdleTimeout,omitempty"` + SsoSessionIdleTimeoutRememberMe *int `json:"ssoSessionIdleTimeoutRememberMe,omitempty"` + SsoSessionMaxLifespan *int `json:"ssoSessionMaxLifespan,omitempty"` + SsoSessionMaxLifespanRememberMe *int `json:"ssoSessionMaxLifespanRememberMe,omitempty"` + SupportedLocales *[]string `json:"supportedLocales,omitempty"` + UserFederationMappers *[]interface{} `json:"userFederationMappers,omitempty"` + UserFederationProviders *[]interface{} `json:"userFederationProviders,omitempty"` + UserManagedAccessAllowed *bool `json:"userManagedAccessAllowed,omitempty"` + Users *[]User `json:"users,omitempty"` + VerifyEmail *bool `json:"verifyEmail,omitempty"` + WaitIncrementSeconds *int `json:"waitIncrementSeconds,omitempty"` + WebAuthnPolicyAcceptableAaguids *[]string `json:"webAuthnPolicyAcceptableAaguids,omitempty"` + WebAuthnPolicyAttestationConveyancePreference *string `json:"webAuthnPolicyAttestationConveyancePreference,omitempty"` + WebAuthnPolicyAuthenticatorAttachment *string `json:"webAuthnPolicyAuthenticatorAttachment,omitempty"` + WebAuthnPolicyAvoidSameAuthenticatorRegister *bool `json:"webAuthnPolicyAvoidSameAuthenticatorRegister,omitempty"` + WebAuthnPolicyCreateTimeout *int `json:"webAuthnPolicyCreateTimeout,omitempty"` + WebAuthnPolicyPasswordlessAcceptableAaguids *[]string `json:"webAuthnPolicyPasswordlessAcceptableAaguids,omitempty"` + WebAuthnPolicyPasswordlessAttestationConveyancePreference *string `json:"webAuthnPolicyPasswordlessAttestationConveyancePreference,omitempty"` + WebAuthnPolicyPasswordlessAuthenticatorAttachment *string `json:"webAuthnPolicyPasswordlessAuthenticatorAttachment,omitempty"` + WebAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister *bool `json:"webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister,omitempty"` + WebAuthnPolicyPasswordlessCreateTimeout *int `json:"webAuthnPolicyPasswordlessCreateTimeout,omitempty"` + WebAuthnPolicyPasswordlessRequireResidentKey *string `json:"webAuthnPolicyPasswordlessRequireResidentKey,omitempty"` + WebAuthnPolicyPasswordlessRpEntityName *string `json:"webAuthnPolicyPasswordlessRpEntityName,omitempty"` + WebAuthnPolicyPasswordlessRpID *string `json:"webAuthnPolicyPasswordlessRpId,omitempty"` + WebAuthnPolicyPasswordlessSignatureAlgorithms *[]string `json:"webAuthnPolicyPasswordlessSignatureAlgorithms,omitempty"` + WebAuthnPolicyPasswordlessUserVerificationRequirement *string `json:"webAuthnPolicyPasswordlessUserVerificationRequirement,omitempty"` + WebAuthnPolicyRequireResidentKey *string `json:"webAuthnPolicyRequireResidentKey,omitempty"` + WebAuthnPolicyRpEntityName *string `json:"webAuthnPolicyRpEntityName,omitempty"` + WebAuthnPolicyRpID *string `json:"webAuthnPolicyRpId,omitempty"` + WebAuthnPolicySignatureAlgorithms *[]string `json:"webAuthnPolicySignatureAlgorithms,omitempty"` + WebAuthnPolicyUserVerificationRequirement *string `json:"webAuthnPolicyUserVerificationRequirement,omitempty"` } // AuthenticationFlowRepresentation represents an authentication flow of a realm @@ -893,6 +898,29 @@ type MultiValuedHashMap struct { Threshold *int32 `json:"threshold,omitempty"` } +// AuthorizationParameters represents the options to obtain get an authorization +type AuthorizationParameters struct { + ResponseType *string `json:"code,omitempty"` + ClientID *string `json:"client_id,omitempty"` + Scope *string `json:"scope,omitempty"` + RedirectURI *string `json:"redirect_uri,omitempty"` + State *string `json:"state,omitempty"` + Nonce *string `json:"nonce,omitempty"` + IDTokenHint *string `json:"id_token_hint,omitempty"` +} + +// FormData returns a map of options to be used in SetFormData function +func (p *AuthorizationParameters) FormData() map[string]string { + m, _ := json.Marshal(p) + var res map[string]string + _ = json.Unmarshal(m, &res) + return res +} + +// AuthorizationResponse represents the response to an authorization request. +type AuthorizationResponse struct { +} + // TokenOptions represents the options to obtain a token type TokenOptions struct { ClientID *string `json:"client_id,omitempty"` @@ -1380,6 +1408,20 @@ type RequiredActionProviderRepresentation struct { ProviderID *string `json:"providerId,omitempty"` } +// ManagementPermissionRepresentation is a representation of management permissions +// v18: https://www.keycloak.org/docs-api/18.0/rest-api/#_managementpermissionreference +type ManagementPermissionRepresentation struct { + Enabled *bool `json:"enabled,omitempty"` + Resource *string `json:"resource,omitempty"` + ScopePermissions *map[string]string `json:"scopePermissions,omitempty"` +} + +// GetClientUserSessionsParams represents the optional parameters for getting user sessions associated with the client +type GetClientUserSessionsParams struct { + First *int `json:"first,string,omitempty"` + Max *int `json:"max,string,omitempty"` +} + // prettyStringStruct returns struct formatted into pretty string func prettyStringStruct(t interface{}) string { json, err := json.MarshalIndent(t, "", "\t") @@ -1473,3 +1515,4 @@ func (v *GetResourcePoliciesParams) String() string { return pre func (v *CredentialRepresentation) String() string { return prettyStringStruct(v) } func (v *RequiredActionProviderRepresentation) String() string { return prettyStringStruct(v) } func (v *BruteForceStatus) String() string { return prettyStringStruct(v) } +func (v *GetClientUserSessionsParams) String() string { return prettyStringStruct(v) } diff --git a/vendor/github.com/Nerzal/gocloak/v13/run-tests.sh b/vendor/github.com/Nerzal/gocloak/v13/run-tests.sh index ed2de6ce2..57875f8e7 100644 --- a/vendor/github.com/Nerzal/gocloak/v13/run-tests.sh +++ b/vendor/github.com/Nerzal/gocloak/v13/run-tests.sh @@ -3,7 +3,17 @@ docker-compose down docker-compose up -d -sleep 10 +keycloakServer=http://localhost:8080 +url="${keycloakServer}/health" +echo "Checking service availability at $url (CTRL+C to exit)" +while true; do + response=$(curl -s -o /dev/null -w "%{http_code}" $url) + if [ $response -eq 200 ]; then + break + fi + sleep 1 +done +echo "Service is now available at ${keycloakServer}" ARGS=() if [ $# -gt 0 ]; then @@ -13,4 +23,4 @@ fi go test -failfast -race -cover -coverprofile=coverage.out -covermode=atomic -p 10 -cpu 1,2 -bench . -benchmem ${ARGS[@]} -docker-compose down \ No newline at end of file +docker-compose down diff --git a/vendor/modules.txt b/vendor/modules.txt index 2e52b0a79..53f22492b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -32,7 +32,7 @@ github.com/MicahParks/keyfunc github.com/Microsoft/go-winio github.com/Microsoft/go-winio/internal/socket github.com/Microsoft/go-winio/pkg/guid -# github.com/Nerzal/gocloak/v13 v13.1.0 +# github.com/Nerzal/gocloak/v13 v13.8.0 ## explicit; go 1.18 github.com/Nerzal/gocloak/v13 github.com/Nerzal/gocloak/v13/pkg/jwx