Documentation
¶
Index ¶
- Variables
- func GroupIdEqualsP(a, b *GroupId) bool
- func IdEqualsP(a, b *Id) bool
- type CloseableRepository
- type DeleteOpts
- type EnsureOnHomeDirExist
- func (this EnsureOnHomeDirExist) Clone() EnsureOnHomeDirExist
- func (this EnsureOnHomeDirExist) IsEqualTo(other any) bool
- func (this EnsureOnHomeDirExist) IsZero() bool
- func (this EnsureOnHomeDirExist) MarshalText() (text []byte, err error)
- func (this *EnsureOnHomeDirExist) Set(text string) error
- func (this EnsureOnHomeDirExist) String() string
- func (this *EnsureOnHomeDirExist) UnmarshalText(text []byte) error
- func (this EnsureOnHomeDirExist) Validate() error
- type EnsureOpts
- type EnsureResult
- type Ensurer
- type EtcColonRepository
- func (this *EtcColonRepository) Close() error
- func (this *EtcColonRepository) DeleteById(ctx context.Context, id Id, opts *DeleteOpts) (rErr error)
- func (this *EtcColonRepository) DeleteByName(ctx context.Context, name string, opts *DeleteOpts) (rErr error)
- func (this *EtcColonRepository) DeleteGroupById(ctx context.Context, id GroupId, opts *DeleteOpts) (rErr error)
- func (this *EtcColonRepository) DeleteGroupByName(ctx context.Context, name string, opts *DeleteOpts) (rErr error)
- func (this *EtcColonRepository) Ensure(ctx context.Context, req *Requirement, opts *EnsureOpts) (_ *User, _ EnsureResult, rErr error)
- func (this *EtcColonRepository) EnsureGroup(ctx context.Context, req *GroupRequirement, opts *EnsureOpts) (_ *Group, _ EnsureResult, rErr error)
- func (this *EtcColonRepository) Init(ctx context.Context) error
- func (this *EtcColonRepository) LookupById(ctx context.Context, id Id) (*User, error)
- func (this *EtcColonRepository) LookupByName(ctx context.Context, name string) (*User, error)
- func (this *EtcColonRepository) LookupGroupById(ctx context.Context, id GroupId) (*Group, error)
- func (this *EtcColonRepository) LookupGroupByName(_ context.Context, name string) (*Group, error)
- func (this *EtcColonRepository) ValidatePasswordById(ctx context.Context, id Id, pass string) (bool, error)
- func (this *EtcColonRepository) ValidatePasswordByName(ctx context.Context, name string, pass string) (bool, error)
- type Group
- type GroupId
- type GroupRequirement
- func (this GroupRequirement) Clone() GroupRequirement
- func (this GroupRequirement) IsEqualTo(other any) bool
- func (this GroupRequirement) IsZero() bool
- func (this GroupRequirement) OrDefaults() GroupRequirement
- func (this GroupRequirement) OrDefaultsForUser(user *Requirement) GroupRequirement
- func (this GroupRequirement) String() string
- type GroupRequirements
- type Groups
- type Id
- type Repository
- type RepositoryProvider
- type Requirement
- type SharedRepositoryProvider
- type StringError
- type User
Constants ¶
This section is empty.
Variables ¶
var ( // ErrUserDoesNotFulfilRequirement indicates that a User does not // meet the provided Requirement. ErrUserDoesNotFulfilRequirement = errors.New("user does not fulfill requirement") // ErrGroupDoesNotFulfilRequirement indicates that a Group does not // meet the provided GroupRequirement. ErrGroupDoesNotFulfilRequirement = errors.New("group does not fulfill requirement") )
var ( DefaultFileSystemSyncThreshold = time.Second * 2 DefaultCreateFilesIfAbsent = false DefaultAllowBadName = true DefaultAllowBadLine = true )
var ( // ErrNoSuchUser indicates that a User which was requested // does not exist. ErrNoSuchUser = errors.Newf(errors.Unknown, "no such user") // ErrNoSuchGroup indicates that a Group which was requested // does not exist. ErrNoSuchGroup = errors.Newf(errors.Unknown, "no such group") // DefaultRepositoryProvider holds the default instance of RepositoryProvider. DefaultRepositoryProvider RepositoryProvider = &failingRepositoryProvider{} )
var (
DefaultEtcGroup = "/etc/group"
)
var (
DefaultEtcPasswd = "/etc/passwd"
)
var (
DefaultEtcShadow = "/etc/shadow"
)
Functions ¶
func GroupIdEqualsP ¶
Types ¶
type CloseableRepository ¶
type CloseableRepository interface {
Repository
io.Closer
}
CloseableRepository represents a Repository which needs to be closed after final usage (via Close).
type DeleteOpts ¶
type DeleteOpts struct {
// HomeDir defines if the home directory of the User should be
// deleted or not (does not affect Group). Default: true
HomeDir *bool
// KillProcesses will also kill all running processes of this user
// if any.
KillProcesses *bool
}
DeleteOpts adds some more hints what should happen when Repository.DeleteById or its derivates is used.
func (*DeleteOpts) IsHomeDir ¶
func (this *DeleteOpts) IsHomeDir() bool
func (*DeleteOpts) IsKillProcesses ¶
func (this *DeleteOpts) IsKillProcesses() bool
type EnsureOnHomeDirExist ¶
type EnsureOnHomeDirExist uint8
const ( EnsureOnHomeDirExistUnknown EnsureOnHomeDirExist = iota EnsureOnHomeDirExistFail EnsureOnHomeDirExistTakeover EnsureOnHomeDirExistOverwrite )
func (EnsureOnHomeDirExist) Clone ¶
func (this EnsureOnHomeDirExist) Clone() EnsureOnHomeDirExist
func (EnsureOnHomeDirExist) IsEqualTo ¶
func (this EnsureOnHomeDirExist) IsEqualTo(other any) bool
func (EnsureOnHomeDirExist) IsZero ¶
func (this EnsureOnHomeDirExist) IsZero() bool
func (EnsureOnHomeDirExist) MarshalText ¶
func (this EnsureOnHomeDirExist) MarshalText() (text []byte, err error)
func (*EnsureOnHomeDirExist) Set ¶
func (this *EnsureOnHomeDirExist) Set(text string) error
func (EnsureOnHomeDirExist) String ¶
func (this EnsureOnHomeDirExist) String() string
func (*EnsureOnHomeDirExist) UnmarshalText ¶
func (this *EnsureOnHomeDirExist) UnmarshalText(text []byte) error
func (EnsureOnHomeDirExist) Validate ¶
func (this EnsureOnHomeDirExist) Validate() error
type EnsureOpts ¶
type EnsureOpts struct {
// CreateAllowed defines that a User or Group can be created if not
// already present. Default: true
CreateAllowed *bool
// ModifyAllowed defines that a User or Group can be modified if it
// does not meet the provided requirement. Default: true
ModifyAllowed *bool
// HomeDir defines if the home directory of the User should be
// touched or not (does not affect Group). This will create
// the home directory upon the user is created and move it once
// the home directory of an existing user is changing.
// Default: true
HomeDir *bool
// OnHomeDirExist defines what should happen if the destination of the
// home directory (on creation and move) already exist.
// Default: EnsureOnHomeDirExistOverwrite
OnHomeDirExist EnsureOnHomeDirExist
}
EnsureOpts adds some more hints what should happen when Ensurer.Ensure or Ensurer.EnsureGroup is used.
func (*EnsureOpts) GetOnHomeDirExist ¶
func (this *EnsureOpts) GetOnHomeDirExist() EnsureOnHomeDirExist
func (*EnsureOpts) IsCreateAllowed ¶
func (this *EnsureOpts) IsCreateAllowed() bool
func (*EnsureOpts) IsHomeDir ¶
func (this *EnsureOpts) IsHomeDir() bool
func (*EnsureOpts) IsModifyAllowed ¶
func (this *EnsureOpts) IsModifyAllowed() bool
type EnsureResult ¶
type EnsureResult uint8
const ( EnsureResultUnknown EnsureResult = iota EnsureResultError EnsureResultUnchanged EnsureResultModified EnsureResultCreated )
type Ensurer ¶
type Ensurer interface {
// Ensure ensures that User exists for the given Requirement.
//
// If the User does not exist and EnsureOpts.CreateAllowed is false,
// ErrNoSuchUser will be returned as error.
//
// If the User does exist but does not match the Requirement and
// EnsureOpts.ModifyAllowed is false, ErrUserDoesNotFulfilRequirement
// will be returned as error.
Ensure(context.Context, *Requirement, *EnsureOpts) (*User, EnsureResult, error)
// EnsureGroup ensures that Group exists for the given GroupRequirement.
//
// If the Group does not exist and EnsureOpts.CreateAllowed is false,
// ErrNoSuchUser will be returned as error.
//
// If the Group does exist but does not match the GroupRequirement and
// EnsureOpts.ModifyAllowed is false, ErrGroupDoesNotFulfilRequirement
// will be returned as error.
EnsureGroup(context.Context, *GroupRequirement, *EnsureOpts) (*Group, EnsureResult, error)
}
Ensurer ensures that a User or Group meets the provided requirements.
type EtcColonRepository ¶
type EtcColonRepository struct {
// PasswdFilename defines which file to use for reading the base user
// information from. If empty DefaultEtcPasswd will be used.
PasswdFilename string
// GroupFilename defines which file to use for reading the group
// information from. If empty DefaultEtcGroup will be used.
GroupFilename string
// ShadowFilename defines which file to use for reading the hashed
// password information of a user from.
// If empty DefaultEtcShadow will be used.
ShadowFilename string
// CreateFilesIfAbsent tells the repository to create the related files if
// they do not exist. This only makes in very few amount of cases really
// sense; so: You should now what you're doing.
//
// If empty DefaultCreateFilesIfAbsent will be used.
CreateFilesIfAbsent *bool
// AllowBadName defines that if bad names of users and groups are allowed
// within the files.
//
// It leads to that also other characters than the default ones are
// allowed. Usually are only ^[a-z][-a-z0-9]*$ allowed. As nowadays
// often also . (dots) or @ (ats) are used in usernames, it makes
// sense to enable them. The majority of the current unix systems are
// supporting those username, too.
//
// If empty DefaultAllowBadName will be used.
AllowBadName *bool
// AllowBadLine defines that if malformed lines within the files are
// allowed and will be preserved.
//
// If the repository will neither read nor write those files successfully
// in those cases. If mainly used to work on existing ones, true is
// recommended.
//
// If empty DefaultAllowBadLine will be used.
AllowBadLine *bool
// OnUnhandledAsyncError will be called when in async contexts are errors
// appearing. By default, those errors are leading to a log message and
// that the whole application will exit with code 17.
OnUnhandledAsyncError func(logger log.Logger, err error, detail string)
// FileSystemSyncThreshold ensures that only external changes are accepted
// if there are no more new ones within this duration. This prevents that
// everything is loaded too often. This defaults to
// DefaultFileSystemSyncThreshold.
FileSystemSyncThreshold time.Duration
// Logger will be used to log events to. If empty the
// log.GetLogger("user-repository") will be used.
Logger log.Logger
// contains filtered or unexported fields
}
EtcColonRepository implements Repository based on the /etc/passwd file standard commonly used in Unix operating systems (see Wikipedia article for more information).
This repository does listen to external changes to the underlying files. As a consequence this repository always contain the latest data which are created by itself or externally. There is a lack defined by FileSystemSyncThreshold to ensure that changes are not applied too often.
It is required to call Init before first usage and Close for disposing.
func (*EtcColonRepository) Close ¶
func (this *EtcColonRepository) Close() error
Close disposes this repository after usage.
func (*EtcColonRepository) DeleteById ¶
func (this *EtcColonRepository) DeleteById(ctx context.Context, id Id, opts *DeleteOpts) (rErr error)
DeleteById implements Repository.DeleteById.
func (*EtcColonRepository) DeleteByName ¶
func (this *EtcColonRepository) DeleteByName(ctx context.Context, name string, opts *DeleteOpts) (rErr error)
DeleteByName implements Repository.DeleteByName.
func (*EtcColonRepository) DeleteGroupById ¶
func (this *EtcColonRepository) DeleteGroupById(ctx context.Context, id GroupId, opts *DeleteOpts) (rErr error)
DeleteGroupById implements Repository.DeleteGroupById.
func (*EtcColonRepository) DeleteGroupByName ¶
func (this *EtcColonRepository) DeleteGroupByName(ctx context.Context, name string, opts *DeleteOpts) (rErr error)
DeleteGroupByName implements Repository.DeleteGroupByName.
func (*EtcColonRepository) Ensure ¶
func (this *EtcColonRepository) Ensure(ctx context.Context, req *Requirement, opts *EnsureOpts) (_ *User, _ EnsureResult, rErr error)
Ensure implements Ensurer.Ensure.
func (*EtcColonRepository) EnsureGroup ¶
func (this *EtcColonRepository) EnsureGroup(ctx context.Context, req *GroupRequirement, opts *EnsureOpts) (_ *Group, _ EnsureResult, rErr error)
EnsureGroup implements Ensurer.EnsureGroup.
func (*EtcColonRepository) Init ¶
func (this *EtcColonRepository) Init(ctx context.Context) error
Init will initialize this repository.
func (*EtcColonRepository) LookupById ¶
LookupById implements Repository.LookupById.
func (*EtcColonRepository) LookupByName ¶
LookupByName implements Repository.LookupByName.
func (*EtcColonRepository) LookupGroupById ¶
LookupGroupById implements Repository.LookupGroupById.
func (*EtcColonRepository) LookupGroupByName ¶
LookupGroupByName implements Repository.LookupGroupByName.
func (*EtcColonRepository) ValidatePasswordById ¶
func (this *EtcColonRepository) ValidatePasswordById(ctx context.Context, id Id, pass string) (bool, error)
ValidatePasswordById implements Repository.ValidatePasswordById.
func (*EtcColonRepository) ValidatePasswordByName ¶
func (this *EtcColonRepository) ValidatePasswordByName(ctx context.Context, name string, pass string) (bool, error)
ValidatePasswordByName implements Repository.ValidatePasswordByName.
type GroupRequirement ¶
type GroupRequirement struct {
Gid *GroupId `yaml:"gid,omitempty"`
Name string `yaml:"name,omitempty"`
}
func (GroupRequirement) Clone ¶
func (this GroupRequirement) Clone() GroupRequirement
func (GroupRequirement) IsEqualTo ¶
func (this GroupRequirement) IsEqualTo(other any) bool
func (GroupRequirement) IsZero ¶
func (this GroupRequirement) IsZero() bool
func (GroupRequirement) OrDefaults ¶
func (this GroupRequirement) OrDefaults() GroupRequirement
func (GroupRequirement) OrDefaultsForUser ¶
func (this GroupRequirement) OrDefaultsForUser(user *Requirement) GroupRequirement
func (GroupRequirement) String ¶
func (this GroupRequirement) String() string
type GroupRequirements ¶
type GroupRequirements []GroupRequirement
func (GroupRequirements) Clone ¶
func (this GroupRequirements) Clone() GroupRequirements
func (GroupRequirements) Contains ¶
func (this GroupRequirements) Contains(other *GroupRequirement) bool
func (GroupRequirements) IsEqualTo ¶
func (this GroupRequirements) IsEqualTo(other any) bool
func (GroupRequirements) IsZero ¶
func (this GroupRequirements) IsZero() bool
type Repository ¶
type Repository interface {
Ensurer
// LookupByName is used to look up a user by its name. If the
// user does not exist ErrNoSuchUser is returned.
LookupByName(context.Context, string) (*User, error)
// LookupById is used to look up a user by its Id. If the
// user does not exist ErrNoSuchUser is returned.
LookupById(context.Context, Id) (*User, error)
// LookupGroupByName is used to look up a group by its name. If
// the group does not exist ErrNoSuchGroup is returned.
LookupGroupByName(context.Context, string) (*Group, error)
// LookupGroupById is used to look up a group by its GroupId.
// If the group does not exist ErrNoSuchGroup is returned.
LookupGroupById(context.Context, GroupId) (*Group, error)
// DeleteById will delete the user by the given Id. If the
// user does not exist ErrNoSuchUser is returned.
DeleteById(context.Context, Id, *DeleteOpts) error
// DeleteByName will delete the user by the given name. If the
// user does not exist ErrNoSuchUser is returned.
DeleteByName(context.Context, string, *DeleteOpts) error
// ValidatePasswordById will validate the given password
// the given user by its Id. It returns true if the given
// password is valid. It will return ErrNoSuchUser if the
// given user does not exist.
ValidatePasswordById(ctx context.Context, id Id, pass string) (bool, error)
// ValidatePasswordByName will validate the given password
// the given user by its name. It returns true if the given
// password is valid. It will return ErrNoSuchUser if the
// given user does not exist.
ValidatePasswordByName(ctx context.Context, name string, pass string) (bool, error)
// DeleteGroupById will delete the group by the given GroupId.
// If the group does not exist ErrNoSuchGroup is returned.
DeleteGroupById(context.Context, GroupId, *DeleteOpts) error
// DeleteGroupByName will delete the group by the given name.
// If the group does not exist ErrNoSuchGroup is returned.
DeleteGroupByName(context.Context, string, *DeleteOpts) error
}
Repository gives access to User and Group objects.
type RepositoryProvider ¶
type RepositoryProvider interface {
// Create provides a working instance of Repository.
//
// It is important to call CloseableRepository.Close after usage.
Create(context.Context) (CloseableRepository, error)
}
RepositoryProvider provides a working instance of Repository.
type Requirement ¶
type Requirement struct {
Name string `yaml:"name,omitempty"`
DisplayName string `yaml:"displayName,omitempty"`
Uid *Id `yaml:"uid,omitempty"`
Group GroupRequirement `yaml:"group,omitempty"`
Groups GroupRequirements `yaml:"groups,omitempty"`
Shell string `yaml:"shell,omitempty"`
HomeDir string `yaml:"homeDir,omitempty"`
Skel string `yaml:"skel,omitempty"`
}
func (Requirement) Clone ¶
func (this Requirement) Clone() Requirement
func (Requirement) IsEqualTo ¶
func (this Requirement) IsEqualTo(other any) bool
func (Requirement) IsZero ¶
func (this Requirement) IsZero() bool
func (Requirement) OrDefaults ¶
func (this Requirement) OrDefaults() Requirement
func (Requirement) String ¶
func (this Requirement) String() string
type SharedRepositoryProvider ¶
type SharedRepositoryProvider[T interface {
CloseableRepository
Init(context.Context) error
}] struct {
// contains filtered or unexported fields
}
func (*SharedRepositoryProvider[T]) Create ¶
func (this *SharedRepositoryProvider[T]) Create(ctx context.Context) (CloseableRepository, error)
type StringError ¶
type StringError string
func (StringError) Error ¶
func (this StringError) Error() string