ntfy/auth/auth.go

65 lines
1.4 KiB
Go
Raw Normal View History

2022-01-23 00:02:16 -05:00
package auth
import "errors"
2022-01-23 00:54:18 -05:00
// Auther is a generic interface to implement password-based authentication and authorization
type Auther interface {
2022-01-23 00:02:16 -05:00
Authenticate(user, pass string) (*User, error)
Authorize(user *User, topic string, perm Permission) error
}
2022-01-23 00:54:18 -05:00
type Manager interface {
AddUser(username, password string, role Role) error
RemoveUser(username string) error
2022-01-23 23:02:39 -05:00
Users() ([]*User, error)
User(username string) (*User, error)
2022-01-23 00:54:18 -05:00
ChangePassword(username, password string) error
2022-01-23 15:30:30 -05:00
ChangeRole(username string, role Role) error
2022-01-24 00:54:28 -05:00
DefaultAccess() (read bool, write bool)
2022-01-23 15:30:30 -05:00
AllowAccess(username string, topic string, read bool, write bool) error
ResetAccess(username string, topic string) error
2022-01-23 00:54:18 -05:00
}
2022-01-23 00:02:16 -05:00
type User struct {
2022-01-23 23:02:39 -05:00
Name string
2022-01-25 21:57:28 -05:00
Hash string // password hash (bcrypt)
2022-01-23 23:02:39 -05:00
Role Role
Grants []Grant
}
type Grant struct {
Topic string
Read bool
Write bool
2022-01-23 00:02:16 -05:00
}
type Permission int
const (
PermissionRead = Permission(1)
PermissionWrite = Permission(2)
)
type Role string
const (
2022-01-24 00:54:28 -05:00
RoleAdmin = Role("admin")
RoleUser = Role("user")
RoleAnonymous = Role("anonymous")
2022-01-23 00:02:16 -05:00
)
2022-01-24 00:54:28 -05:00
const (
Everyone = "*"
)
2022-01-23 15:30:30 -05:00
func AllowedRole(role Role) bool {
return role == RoleUser || role == RoleAdmin
}
2022-01-23 23:02:39 -05:00
var (
2022-01-25 21:57:28 -05:00
ErrUnauthenticated = errors.New("unauthenticated")
ErrUnauthorized = errors.New("unauthorized")
ErrInvalidArgument = errors.New("invalid argument")
ErrNotFound = errors.New("not found")
2022-01-23 23:02:39 -05:00
)