Skip to content

Commit

Permalink
fix: v2 auth client and models (SSHcom#161)
Browse files Browse the repository at this point in the history
* v2 auth client and models
  • Loading branch information
iljaSL committed Nov 28, 2024
1 parent 31e8e66 commit 92f84ff
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 130 deletions.
154 changes: 77 additions & 77 deletions api/auth/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
package auth

import (
"net/url"

"github.com/SSHcom/privx-sdk-go/common"
"github.com/SSHcom/privx-sdk-go/api/filters"
"github.com/SSHcom/privx-sdk-go/api/response"
"github.com/SSHcom/privx-sdk-go/restapi"
)

Expand All @@ -18,171 +17,172 @@ type Auth struct {
api restapi.Connector
}

// New creates a new auth client instance, using the
// argument SDK API client.
// New auth client constructor.
func New(api restapi.Connector) *Auth {
return &Auth{api: api}
}

// AuthStatus get microservice status
func (store *Auth) AuthStatus() (*common.ServiceStatus, error) {
status := &common.ServiceStatus{}
// MARK: Status
// Status get auth microservice status.
func (c *Auth) Status() (*response.ServiceStatus, error) {
status := &response.ServiceStatus{}

_, err := store.api.
_, err := c.api.
URL("/auth/api/v1/status").
Get(status)

return status, err
}

// MARK: Identity Provider
// CreateIdpClient creates a new identity provider client configuration.
func (store *Auth) CreateIdpClient(idpClient *IDPClient) (IDstruct, error) {
idpClientId := IDstruct{}
func (c *Auth) CreateIdpClient(idpClient *IdpClient) (response.Identifier, error) {
idpClientResponse := response.Identifier{}

_, err := store.api.
_, err := c.api.
URL("/auth/api/v1/idp/clients").
Post(&idpClient, &idpClientId)
Post(&idpClient, &idpClientResponse)

return idpClientId, err
return idpClientResponse, err
}

// UpdateIdpClient updates existing identity provider client configuration definition.
func (store *Auth) UpdateIdpClient(idpClient *IDPClient, idpID string) error {

_, err := store.api.
URL("/auth/api/v1/idp/clients/%s", idpID).
func (c *Auth) UpdateIdpClient(idpClient *IdpClient, idpId string) error {
_, err := c.api.
URL("/auth/api/v1/idp/clients/%s", idpId).
Put(&idpClient)

return err
}

// IdpClient fetches existing identity provider client configuration.
func (store *Auth) IdpClient(idpID string) (*IDPClient, error) {
idpClient := &IDPClient{}
// GetIdpClient get existing identity provider client configuration.
func (c *Auth) GetIdpClient(idpId string) (*IdpClient, error) {
idpClient := &IdpClient{}

_, err := store.api.
URL("/auth/api/v1/idp/clients/%s", idpID).
_, err := c.api.
URL("/auth/api/v1/idp/clients/%s", idpId).
Get(&idpClient)

return idpClient, err
}

// DeleteIdpClient delete identity provider client configuration by ID.
func (store *Auth) DeleteIdpClient(idpID string) error {

_, err := store.api.
URL("/auth/api/v1/idp/clients/%s", idpID).
// DeleteIdpClient delete identity provider client configuration by Id.
func (c *Auth) DeleteIdpClient(idpId string) error {
_, err := c.api.
URL("/auth/api/v1/idp/clients/%s", idpId).
Delete()

return err
}

// RegenerateIdpClientConfig regenerates client_id and client_secret
// for OIDC identity provider client configuration.
func (store *Auth) RegenerateIdpClientConfig(idpID string) (*IdpClientConfig, error) {
func (c *Auth) RegenerateIdpClientConfig(idpId string) (*IdpClientConfig, error) {
clientConfig := &IdpClientConfig{}

_, err := store.api.
URL("/auth/api/v1/idp/clients/%s/regenerate", url.PathEscape(idpID)).
_, err := c.api.
URL("/auth/api/v1/idp/clients/%s/regenerate", idpId).
Post(nil, &clientConfig)

return clientConfig, err
}

// UserSessions fetches valid sessions by userID.
func (store *Auth) UserSessions(offset, limit int, sortkey, sortdir, userID string) (*sessionsResult, error) {
filters := Params{
Offset: offset,
Limit: limit,
Sortkey: sortkey,
Sortdir: sortdir,
// MARK: Session Storage
// GetUserSessions get valid sessions by userID.
func (c *Auth) GetUserSessions(userId string, opts ...filters.Option) (*response.ResultSet[Session], error) {
userSessions := &response.ResultSet[Session]{}
params := filters.Default()

for _, opt := range opts {
opt(&params)
}
userSessions := &sessionsResult{}

_, err := store.api.
URL("/auth/api/v1/sessionstorage/users/%s/sessions", userID).
Query(&filters).
_, err := c.api.
URL("/auth/api/v1/sessionstorage/users/%s/sessions", userId).
Query(params).
Get(&userSessions)

return userSessions, err
}

// SourceSessions fetches valid sessions by sourceID.
func (store *Auth) SourceSessions(offset, limit int, sortkey, sortdir, sourceID string) (*sessionsResult, error) {
filters := Params{
Offset: offset,
Limit: limit,
Sortkey: sortkey,
Sortdir: sortdir,
// GetSourceSessions get valid sessions by sourceID.
func (c *Auth) GetSourceSessions(sourceId string, opts ...filters.Option) (*response.ResultSet[Session], error) {
sourceSessions := &response.ResultSet[Session]{}
params := filters.Default()

for _, opt := range opts {
opt(&params)
}
sourceSessions := &sessionsResult{}

_, err := store.api.
URL("/auth/api/v1/sessionstorage/sources/%s/sessions", sourceID).
Query(&filters).
_, err := c.api.
URL("/auth/api/v1/sessionstorage/sources/%s/sessions", sourceId).
Query(params).
Get(&sourceSessions)

return sourceSessions, err
}

// SearchSessions searches for sessions
func (store *Auth) SearchSessions(offset, limit int, sortkey, sortdir string, search *SearchParams) (*sessionsResult, error) {
filters := Params{
Offset: offset,
Limit: limit,
Sortkey: sortkey,
Sortdir: sortdir,
func (c *Auth) SearchSessions(search *SessionSearch, opts ...filters.Option) (*response.ResultSet[Session], error) {
sessions := &response.ResultSet[Session]{}
params := filters.Default()

for _, opt := range opts {
opt(&params)
}
sessions := &sessionsResult{}

_, err := store.api.
_, err := c.api.
URL("/auth/api/v1/sessionstorage/sessions/search").
Query(&filters).
Query(params).
Post(search, &sessions)

return sessions, err
}

// TerminateSession terminates single session by ID.
func (store *Auth) TerminateSession(sessionID string) error {

_, err := store.api.
URL("/auth/api/v1/sessionstorage/sessions/%s/terminate", sessionID).
// TerminateSession terminates single session by Id.
func (c *Auth) TerminateSession(sessionId string) error {
_, err := c.api.
URL("/auth/api/v1/sessionstorage/sessions/%s/terminate", sessionId).
Post(nil)

return err
}

// TerminateUserSessions terminates all sessions for a user.
func (store *Auth) TerminateUserSessions(userID string) error {

func (store *Auth) TerminateUserSessions(userId string) error {
_, err := store.api.
URL("/auth/api/v1/sessionstorage/users/%s/sessions/terminate", userID).
URL("/auth/api/v1/sessionstorage/users/%s/sessions/terminate", userId).
Post(nil)

return err
}

// Logout logs out user.
// MARK: Users
// Logout log out user.
func (store *Auth) Logout() error {

_, err := store.api.
URL("/auth/api/v1/logout").
Post(nil)

return err
}

func (store *Auth) GetUserPairedDevices(userID string) (*PairedDevices, error) {
devices := &PairedDevices{}
// MARK: Mobile Gateway
// GetUserPairedDevices get users paired devices.
func (store *Auth) GetUserPairedDevices(userId string) (*response.ResultSet[Device], error) {
devices := &response.ResultSet[Device]{}

_, err := store.api.
URL("/auth/api/v1/users/%s/devices", userID).
URL("/auth/api/v1/users/%s/devices", userId).
Get(devices)

return devices, err
}

func (store *Auth) UnpairUserDevice(userID, deviceID string) error {
// UnpairUserDevice unpair users device.
func (store *Auth) UnpairUserDevice(userId, deviceId string) error {
_, err := store.api.
URL("/auth/api/v1/users/%s/devices/%s", userID, deviceID).
URL("/auth/api/v1/users/%s/devices/%s", userId, deviceId).
Delete()

return err
Expand Down
80 changes: 28 additions & 52 deletions api/auth/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,16 @@ package auth

import "time"

// Params query params definition
type Params struct {
Sortkey string `json:"sortkey,omitempty"`
Sortdir string `json:"sortdir,omitempty"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}

// IDPClient idp client definition
type IDPClient struct {
ID string `json:"id"`
// IdpClient identity provider client definition.
type IdpClient struct {
Id string `json:"id"`
Name string `json:"name"`
Created time.Time `json:"created,omitempty"`
Updated time.Time `json:"updated,omitempty"`
IDPType string `json:"idp_type"`
IdpType string `json:"idp_type"`
OIDCIssuer string `json:"oidc_issuer,omitempty"`
OIDCAudience []string `json:"oidc_audience"`
OIDCClientID string `json:"oidc_client_id,omitempty"`
OIDCClientId string `json:"oidc_client_id,omitempty"`
OIDCClientSecret string `json:"oidc_client_secret,omitempty"`
OIDCScopesEnabled []string `json:"oidc_scopes_enabled"`
OIDCResponseTypesSupported []string `json:"oidc_response_types_supported,omitempty"`
Expand All @@ -45,44 +37,32 @@ type IDPClient struct {
Enabled bool `json:"enabled"`
}

// IDPClientsResult idp client list result definition
type IDPClientsResult struct {
Count int `json:"count"`
Items []IDPClient `json:"items"`
}

// IdpClientConfig config definition with client_id and client_secret
// IdpClientConfig identity provider client config definition.
type IdpClientConfig struct {
ClientId string `json:"client_id"`
ClientSecret string `json:"client_secret"`
}

type IDstruct struct {
ID string `json:"id"`
}

// Session session definition
type Session struct {
ID string `json:"id"`
UserID string `json:"user_id"`
SourceID string `json:"source_id"`
Domain string `json:"domain"`
Username string `json:"username"`
RemoteAddr string `json:"remote_addr"`
UserAgent string `json:"user_agent"`
Type string `json:"type"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Expires time.Time `json:"expires"`
TokenExpires time.Time `json:"token_expires"`
LoggedOut bool `json:"logged_out"`
Current bool `json:"current,omitempty"`
}

type sessionsResult struct {
Items []Session `json:"items"`
Count int `json:"count"`
Id string `json:"id"`
UserId string `json:"user_id"`
SourceId string `json:"source_id"`
Domain string `json:"domain"`
Username string `json:"username"`
RemoteAddr string `json:"remote_addr"`
UserAgent string `json:"user_agent"`
Type string `json:"type"`
ParentSessionId string `json:"parent_session_id,omitempty"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Expires time.Time `json:"expires"`
TokenExpires time.Time `json:"token_expires"`
LoggedOut bool `json:"logged_out"`
Current bool `json:"current,omitempty"`
}

// SessionPasswordPolicy session password policy definition.
type SessionPasswordPolicy struct {
PasswordMinLength int `json:"password_min_length"`
PasswordMaxLength int `json:"password_max_length"`
Expand All @@ -94,23 +74,19 @@ type SessionPasswordPolicy struct {
PasswordStrength string `json:"password_strength,omitempty"`
}

// SearchParams search params definition
type SearchParams struct {
// SessionSearch session search request parameter definition.
type SessionSearch struct {
Keywords string `json:"keywords,omitempty"`
UserID string `json:"user_id,omitempty"`
UserId string `json:"user_id,omitempty"`
Type string `json:"type,omitempty"`
}

// Device paired mobile gateway device definition.
type Device struct {
ID string `json:"id"`
Id string `json:"id"`
OS string `json:"os"`
Name string `json:"name"`
Activated string `json:"activated"`
Updated string `json:"updated"`
LastUsed string `json:"lastUsed"`
}

type PairedDevices struct {
Count int `json:"count"`
Items []Device `json:"items"`
}
Loading

0 comments on commit 92f84ff

Please sign in to comment.