Files
ionscale/internal/service/auth_keys.go
T
Johan Siebens 5ad89ff02f initial working version
Signed-off-by: Johan Siebens <johan.siebens@gmail.com>
2022-05-09 21:54:06 +02:00

112 lines
2.7 KiB
Go

package service
import (
"context"
"github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/pkg/gen/api"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"
"time"
)
func (s *Service) ListAuthKeys(ctx context.Context, req *api.ListAuthKeysRequest) (*api.ListAuthKeysResponse, error) {
tailnet, err := s.repository.GetTailnet(ctx, req.TailnetId)
if err != nil {
return nil, err
}
if tailnet == nil {
return nil, status.Error(codes.NotFound, "")
}
authKeys, err := s.repository.ListAuthKeys(ctx, req.TailnetId)
if err != nil {
return nil, err
}
response := api.ListAuthKeysResponse{}
for _, key := range authKeys {
var expiresAt *timestamppb.Timestamp
if key.ExpiresAt != nil {
expiresAt = timestamppb.New(*key.ExpiresAt)
}
response.AuthKeys = append(response.AuthKeys, &api.AuthKey{
Id: key.ID,
Key: key.Key,
Ephemeral: key.Ephemeral,
CreatedAt: timestamppb.New(key.CreatedAt),
ExpiresAt: expiresAt,
Tailnet: &api.Ref{
Id: tailnet.ID,
Name: tailnet.Name,
},
})
}
return &response, nil
}
func (s *Service) CreateAuthKey(ctx context.Context, req *api.CreateAuthKeyRequest) (*api.CreateAuthKeyResponse, error) {
if len(req.Tags) == 0 {
return nil, status.Errorf(codes.InvalidArgument, "at least one tag is required when creating an auth key")
}
tailnet, err := s.repository.GetTailnet(ctx, req.TailnetId)
if err != nil {
return nil, err
}
if tailnet == nil {
return nil, status.Error(codes.NotFound, "")
}
var expiresAt *time.Time
var expiresAtPb *timestamppb.Timestamp
if req.Expiry != nil {
duration := req.Expiry.AsDuration()
e := time.Now().UTC().Add(duration)
expiresAt = &e
expiresAtPb = timestamppb.New(*expiresAt)
}
user, _, err := s.repository.GetOrCreateServiceUser(ctx, tailnet)
if err != nil {
return nil, err
}
tags := domain.SanitizeTags(req.Tags)
v, authKey := domain.CreateAuthKey(tailnet, user, req.Ephemeral, tags, expiresAt)
if err := s.repository.SaveAuthKey(ctx, authKey); err != nil {
return nil, err
}
response := api.CreateAuthKeyResponse{
Value: v,
AuthKey: &api.AuthKey{
Id: authKey.ID,
Key: authKey.Key,
Ephemeral: authKey.Ephemeral,
CreatedAt: timestamppb.New(authKey.CreatedAt),
ExpiresAt: expiresAtPb,
Tailnet: &api.Ref{
Id: tailnet.ID,
Name: tailnet.Name,
},
}}
return &response, nil
}
func (s *Service) DeleteAuthKey(ctx context.Context, req *api.DeleteAuthKeyRequest) (*api.DeleteAuthKeyResponse, error) {
if _, err := s.repository.DeleteAuthKey(ctx, req.AuthKeyId); err != nil {
return nil, err
}
return &api.DeleteAuthKeyResponse{}, nil
}