1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-04-26 13:48:53 +08:00

117 lines
3.2 KiB
Go
Raw Normal View History

//
2019-07-18 15:01:09 +02:00
// Copyright (c) 2019
// Mainflux
//
// SPDX-License-Identifier: Apache-2.0
//
2018-05-10 23:53:25 +02:00
package users
2019-07-18 15:01:09 +02:00
import (
"context"
"errors"
)
2018-05-10 23:53:25 +02:00
var (
// ErrConflict indicates usage of the existing email during account
// registration.
ErrConflict = errors.New("email already taken")
// ErrMalformedEntity indicates malformed entity specification (e.g.
// invalid username or password).
ErrMalformedEntity = errors.New("malformed entity specification")
// ErrUnauthorizedAccess indicates missing or invalid credentials provided
// when accessing a protected resource.
ErrUnauthorizedAccess = errors.New("missing or invalid credentials provided")
// ErrNotFound indicates a non-existent entity request.
ErrNotFound = errors.New("non-existent entity")
MF-858 Users metadata (#861) * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * run.sh Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata type, add error handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add pause Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * remove extra char Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * retype from string to []byte Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add wait logic for gnatsd Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * few small fixes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix identityRes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert run.sh for now as gnats availability check is solved in other PR Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert changes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata database/sql handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix commit issues Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * small change to errors handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * minor comment change Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com>
2019-09-28 11:15:41 +00:00
// ErrScanMetadata indicates problem with metadata in db
ErrScanMetadata = errors.New("Failed to scan metadata")
2018-05-10 23:53:25 +02:00
)
// Service specifies an API that must be fullfiled by the domain service
// implementation, and all of its decorators (e.g. logging & metrics).
type Service interface {
// Register creates new user account. In case of the failed registration, a
// non-nil error value is returned.
2019-07-18 15:01:09 +02:00
Register(context.Context, User) error
2018-05-10 23:53:25 +02:00
// Login authenticates the user given its credentials. Successful
// authentication generates new access token. Failed invocations are
// identified by the non-nil error values in the response.
2019-07-18 15:01:09 +02:00
Login(context.Context, User) (string, error)
2018-05-10 23:53:25 +02:00
// Identify validates user's token. If token is valid, user's id
// is returned. If token is invalid, or invocation failed for some
// other reason, non-nil error values are returned in response.
Identify(string) (string, error)
MF-858 Users metadata (#861) * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * run.sh Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata type, add error handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add pause Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * remove extra char Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * retype from string to []byte Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add wait logic for gnatsd Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * few small fixes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix identityRes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert run.sh for now as gnats availability check is solved in other PR Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert changes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata database/sql handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix commit issues Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * small change to errors handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * minor comment change Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com>
2019-09-28 11:15:41 +00:00
// Get authenticated user info for the given token.
UserInfo(ctx context.Context, token string) (User, error)
2018-05-10 23:53:25 +02:00
}
2018-05-11 01:00:10 +02:00
var _ Service = (*usersService)(nil)
type usersService struct {
users UserRepository
hasher Hasher
idp IdentityProvider
}
// New instantiates the users service implementation.
func New(users UserRepository, hasher Hasher, idp IdentityProvider) Service {
return &usersService{users: users, hasher: hasher, idp: idp}
}
2019-07-18 15:01:09 +02:00
func (svc usersService) Register(ctx context.Context, user User) error {
2018-05-11 01:00:10 +02:00
hash, err := svc.hasher.Hash(user.Password)
if err != nil {
return ErrMalformedEntity
}
user.Password = hash
2019-07-18 15:01:09 +02:00
return svc.users.Save(ctx, user)
2018-05-11 01:00:10 +02:00
}
2019-07-18 15:01:09 +02:00
func (svc usersService) Login(ctx context.Context, user User) (string, error) {
dbUser, err := svc.users.RetrieveByID(ctx, user.Email)
2018-05-11 01:00:10 +02:00
if err != nil {
return "", ErrUnauthorizedAccess
}
if err := svc.hasher.Compare(user.Password, dbUser.Password); err != nil {
return "", ErrUnauthorizedAccess
}
return svc.idp.TemporaryKey(user.Email)
}
func (svc usersService) Identify(token string) (string, error) {
id, err := svc.idp.Identity(token)
if err != nil {
return "", ErrUnauthorizedAccess
}
return id, nil
}
MF-858 Users metadata (#861) * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * run.sh Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add metadata to users Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add default value for metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * when metadata is not set dont save 'null' string Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata type, add error handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add pause Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * remove extra char Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * retype from string to []byte Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add wait logic for gnatsd Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * few small fixes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix identityRes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * add users metadata Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert run.sh for now as gnats availability check is solved in other PR Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * revert changes Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * change metadata database/sql handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * fix commit issues Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * small change to errors handling Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com> * minor comment change Signed-off-by: Mirko Teodorovic <mirko.teodorovic@gmail.com>
2019-09-28 11:15:41 +00:00
func (svc usersService) UserInfo(ctx context.Context, token string) (User, error) {
id, err := svc.idp.Identity(token)
if err != nil {
return User{}, ErrUnauthorizedAccess
}
dbUser, err := svc.users.RetrieveByID(ctx, id)
if err != nil {
return User{}, ErrUnauthorizedAccess
}
return User{
Email: id,
Password: "",
Metadata: dbUser.Metadata,
}, nil
}