mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-04 04:04:17 +08:00
* feat: api access tokens
* revoke all user tokens
* redefine access token api routes, add auto egress option to enrollment keys
* add server settings apis, add db table for settigs
* handle server settings updates
* switch to using settings from DB
* fix sever settings migration
* revet force migration for settings
* fix server settings database write
* fix revoked tokens to be unauthorized
* remove unused functions
* convert access token to sql schema
* switch access token to sql schema
* fix merge conflicts
* fix server settings types
* bypass basic auth setting for super admin
* add TODO comment
* feat(go): add types for idp package;
* feat(go): import azure sdk;
* feat(go): add stub for google workspace client;
* feat(go): implement azure ad client;
* feat(go): sync users and groups using idp client;
* publish peer update on settings update
* feat(go): read creds from env vars;
* feat(go): add api endpoint to trigger idp sync;
* fix(go): sync member changes;
* fix(go): handle error;
* fix(go): set correct response type;
* feat(go): support disabling user accounts;
1. Add api endpoints to enable and disable user accounts.
2. Add checks in authenticators to prevent disabled users from logging in.
3. Add checks in middleware to prevent api usage by disabled users.
* feat(go): use string slice for group members;
* feat(go): sync user account status from idp;
* feat(go): import google admin sdk;
* feat(go): add support for google workspace idp;
* feat(go): initialize idp client on sync;
* feat(go): sync from idp periodically;
* feat(go): improvements for google idp;
1. Use the impersonate package to authenticate.
2. Use Pages method to get all data.
* chore(go): import style changes from migration branch;
1. Singular file names for table schema.
2. No table name method.
3. Use .Model instead of .Table.
4. No unnecessary tagging.
* remove nat check on egress gateway request
* Revert "remove nat check on egress gateway request"
This reverts commit 0aff12a189
.
* feat(go): add db middleware;
* feat(go): restore method;
* feat(go): add user access token schema;
* fix user auth api:
* re initalise oauth and email config
* feat(go): fetch idp creds from server settings;
* feat(go): add filters for users and groups;
* feat(go): skip sync from idp if disabled;
* feat(go): add endpoint to remove idp integration;
* feat(go): import all users if no filters;
* feat(go): assign service-user role on sync;
* feat(go): remove microsoft-go-sdk;
* feat(go): add display name field for user;
* fix(go): set account disabled correctly;
* fix(go): update user if display name changes;
* fix(go): remove auth provider when removing idp integration;
* fix(go): ignore display name if empty;
* feat(go): add idp sync interval setting;
* fix(go): error on invalid auth provider;
* fix(go): no error if no user on group delete;
* fix(go): check superadmin using platform role id;
* feat(go): add display name and account disabled to return user as well;
* feat(go): tidy go mod after merge;
* feat(go): reinitialize auth provider and idp sync hook;
* fix(go): merge error;
* fix(go): merge error;
* feat(go): use id as the external provider id;
* fix(go): comments;
* feat(go): add function to return pending users;
* feat(go): prevent external id erasure;
* fix(go): user and group sync errors;
* chore(go): cleanup;
* fix(go): delete only oauth users;
* feat(go): use uuid group id;
* export ipd id to in rest api
* feat(go): don't use uuid for default groups;
* feat(go): migrate group only if id not uuid;
* chore(go): go mod tidy;
---------
Co-authored-by: abhishek9686 <abhi281342@gmail.com>
Co-authored-by: Abhishek K <abhishek@netmaker.io>
Co-authored-by: the_aceix <aceixsmartx@gmail.com>
225 lines
8.3 KiB
Go
225 lines
8.3 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
jwt "github.com/golang-jwt/jwt/v4"
|
|
)
|
|
|
|
type NetworkID string
|
|
type RsrcType string
|
|
type RsrcID string
|
|
type UserRoleID string
|
|
type UserGroupID string
|
|
type AuthType string
|
|
type TokenType string
|
|
|
|
var (
|
|
BasicAuth AuthType = "basic_auth"
|
|
OAuth AuthType = "oauth"
|
|
)
|
|
|
|
func (r RsrcType) String() string {
|
|
return string(r)
|
|
}
|
|
|
|
func (rid RsrcID) String() string {
|
|
return string(rid)
|
|
}
|
|
|
|
func GetRAGRoleName(netID, hostName string) string {
|
|
return fmt.Sprintf("netID-%s-rag-%s", netID, hostName)
|
|
}
|
|
|
|
func GetRAGRoleID(netID, hostID string) UserRoleID {
|
|
return UserRoleID(fmt.Sprintf("netID-%s-rag-%s", netID, hostID))
|
|
}
|
|
|
|
func (t TokenType) String() string {
|
|
return string(t)
|
|
}
|
|
|
|
var (
|
|
UserIDTokenType TokenType = "user_id_token"
|
|
AccessTokenType TokenType = "access_token"
|
|
)
|
|
|
|
var RsrcTypeMap = map[RsrcType]struct{}{
|
|
HostRsrc: {},
|
|
RelayRsrc: {},
|
|
RemoteAccessGwRsrc: {},
|
|
ExtClientsRsrc: {},
|
|
InetGwRsrc: {},
|
|
EgressGwRsrc: {},
|
|
NetworkRsrc: {},
|
|
EnrollmentKeysRsrc: {},
|
|
UserRsrc: {},
|
|
AclRsrc: {},
|
|
DnsRsrc: {},
|
|
FailOverRsrc: {},
|
|
}
|
|
|
|
const AllNetworks NetworkID = "all_networks"
|
|
const (
|
|
HostRsrc RsrcType = "hosts"
|
|
RelayRsrc RsrcType = "relays"
|
|
RemoteAccessGwRsrc RsrcType = "remote_access_gw"
|
|
ExtClientsRsrc RsrcType = "extclients"
|
|
InetGwRsrc RsrcType = "inet_gw"
|
|
EgressGwRsrc RsrcType = "egress"
|
|
NetworkRsrc RsrcType = "networks"
|
|
EnrollmentKeysRsrc RsrcType = "enrollment_key"
|
|
UserRsrc RsrcType = "users"
|
|
AclRsrc RsrcType = "acl"
|
|
TagRsrc RsrcType = "tag"
|
|
DnsRsrc RsrcType = "dns"
|
|
FailOverRsrc RsrcType = "fail_over"
|
|
MetricRsrc RsrcType = "metrics"
|
|
)
|
|
|
|
const (
|
|
AllHostRsrcID RsrcID = "all_host"
|
|
AllRelayRsrcID RsrcID = "all_relay"
|
|
AllRemoteAccessGwRsrcID RsrcID = "all_remote_access_gw"
|
|
AllExtClientsRsrcID RsrcID = "all_extclients"
|
|
AllInetGwRsrcID RsrcID = "all_inet_gw"
|
|
AllEgressGwRsrcID RsrcID = "all_egress"
|
|
AllNetworkRsrcID RsrcID = "all_network"
|
|
AllEnrollmentKeysRsrcID RsrcID = "all_enrollment_key"
|
|
AllUserRsrcID RsrcID = "all_user"
|
|
AllDnsRsrcID RsrcID = "all_dns"
|
|
AllFailOverRsrcID RsrcID = "all_fail_over"
|
|
AllAclsRsrcID RsrcID = "all_acl"
|
|
AllTagsRsrcID RsrcID = "all_tag"
|
|
)
|
|
|
|
// Pre-Defined User Roles
|
|
|
|
const (
|
|
SuperAdminRole UserRoleID = "super-admin"
|
|
AdminRole UserRoleID = "admin"
|
|
ServiceUser UserRoleID = "service-user"
|
|
PlatformUser UserRoleID = "platform-user"
|
|
NetworkAdmin UserRoleID = "network-admin"
|
|
NetworkUser UserRoleID = "network-user"
|
|
)
|
|
|
|
func (r UserRoleID) String() string {
|
|
return string(r)
|
|
}
|
|
|
|
func (g UserGroupID) String() string {
|
|
return string(g)
|
|
}
|
|
|
|
func (n NetworkID) String() string {
|
|
return string(n)
|
|
}
|
|
|
|
type RsrcPermissionScope struct {
|
|
Create bool `json:"create"`
|
|
Read bool `json:"read"`
|
|
Update bool `json:"update"`
|
|
Delete bool `json:"delete"`
|
|
VPNaccess bool `json:"vpn_access"`
|
|
SelfOnly bool `json:"self_only"`
|
|
}
|
|
|
|
type UserRolePermissionTemplate struct {
|
|
ID UserRoleID `json:"id"`
|
|
Name string `json:"name"`
|
|
Default bool `json:"default"`
|
|
MetaData string `json:"meta_data"`
|
|
DenyDashboardAccess bool `json:"deny_dashboard_access"`
|
|
FullAccess bool `json:"full_access"`
|
|
NetworkID NetworkID `json:"network_id"`
|
|
NetworkLevelAccess map[RsrcType]map[RsrcID]RsrcPermissionScope `json:"network_level_access"`
|
|
GlobalLevelAccess map[RsrcType]map[RsrcID]RsrcPermissionScope `json:"global_level_access"`
|
|
}
|
|
|
|
type CreateGroupReq struct {
|
|
Group UserGroup `json:"user_group"`
|
|
Members []string `json:"members"`
|
|
}
|
|
|
|
type UserGroup struct {
|
|
ID UserGroupID `json:"id"`
|
|
ExternalIdentityProviderID string `json:"external_identity_provider_id"`
|
|
Default bool `json:"default"`
|
|
Name string `json:"name"`
|
|
NetworkRoles map[NetworkID]map[UserRoleID]struct{} `json:"network_roles"`
|
|
MetaData string `json:"meta_data"`
|
|
}
|
|
|
|
// User struct - struct for Users
|
|
type User struct {
|
|
UserName string `json:"username" bson:"username" validate:"min=3,in_charset|email"`
|
|
ExternalIdentityProviderID string `json:"external_identity_provider_id"`
|
|
DisplayName string `json:"display_name"`
|
|
AccountDisabled bool `json:"account_disabled"`
|
|
Password string `json:"password" bson:"password" validate:"required,min=5"`
|
|
IsAdmin bool `json:"isadmin" bson:"isadmin"` // deprecated
|
|
IsSuperAdmin bool `json:"issuperadmin"` // deprecated
|
|
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
|
AuthType AuthType `json:"auth_type"`
|
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
|
PlatformRoleID UserRoleID `json:"platform_role_id"`
|
|
NetworkRoles map[NetworkID]map[UserRoleID]struct{} `json:"network_roles"`
|
|
LastLoginTime time.Time `json:"last_login_time"`
|
|
}
|
|
|
|
type ReturnUserWithRolesAndGroups struct {
|
|
ReturnUser
|
|
PlatformRole UserRolePermissionTemplate `json:"platform_role"`
|
|
UserGroups map[UserGroupID]UserGroup `json:"user_group_ids"`
|
|
}
|
|
|
|
// ReturnUser - return user struct
|
|
type ReturnUser struct {
|
|
UserName string `json:"username"`
|
|
ExternalIdentityProviderID string `json:"external_identity_provider_id"`
|
|
DisplayName string `json:"display_name"`
|
|
AccountDisabled bool `json:"account_disabled"`
|
|
IsAdmin bool `json:"isadmin"`
|
|
IsSuperAdmin bool `json:"issuperadmin"`
|
|
AuthType AuthType `json:"auth_type"`
|
|
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
|
PlatformRoleID UserRoleID `json:"platform_role_id"`
|
|
NetworkRoles map[NetworkID]map[UserRoleID]struct{} `json:"network_roles"`
|
|
LastLoginTime time.Time `json:"last_login_time"`
|
|
}
|
|
|
|
// UserAuthParams - user auth params struct
|
|
type UserAuthParams struct {
|
|
UserName string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// UserClaims - user claims struct
|
|
type UserClaims struct {
|
|
Role UserRoleID
|
|
UserName string
|
|
Api string
|
|
TokenType TokenType
|
|
RacAutoDisable bool
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
type InviteUsersReq struct {
|
|
UserEmails []string `json:"user_emails"`
|
|
PlatformRoleID string `json:"platform_role_id"`
|
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
|
NetworkRoles map[NetworkID]map[UserRoleID]struct{} `json:"network_roles"`
|
|
}
|
|
|
|
// UserInvite - model for user invite
|
|
type UserInvite struct {
|
|
Email string `json:"email"`
|
|
PlatformRoleID string `json:"platform_role_id"`
|
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
|
NetworkRoles map[NetworkID]map[UserRoleID]struct{} `json:"network_roles"`
|
|
InviteCode string `json:"invite_code"`
|
|
InviteURL string `json:"invite_url"`
|
|
}
|