Files
certmanager/internal/logic/service.go
Олег Бородин 57353fc4ce certmanager updated
2024-08-06 20:37:59 +02:00

251 lines
6.6 KiB
Go

package logic
import (
"context"
"fmt"
cmapi "certmanager/api/certmanagercontrol"
"certmanager/internal/descriptor"
"certmanager/pkg/cm509"
)
func (lg *Logic) CreateServicePair(ctx context.Context, params *cmapi.CreateServicePairParams) (*cmapi.CreateServicePairResult, error) {
var err error
res := &cmapi.CreateServicePairResult{}
var issuerDescr *descriptor.Issuer
var issuerExists bool
switch {
case params.IssuerID != 0:
issuerExists, issuerDescr, err = lg.db.GetIssuerByID(ctx, params.IssuerID)
if !issuerExists {
err := fmt.Errorf("No signer with id %d was found", params.IssuerID)
if err != nil {
return res, err
}
}
case params.IssuerName != "":
issuerExists, issuerDescr, err = lg.db.GetIssuerByName(ctx, params.IssuerName)
if !issuerExists {
err := fmt.Errorf("No signer with name %s was found", params.IssuerName)
if err != nil {
return res, err
}
}
default:
err := fmt.Errorf("Issuer id or name is not specified")
if err != nil {
return res, err
}
}
if issuerDescr == nil {
err := fmt.Errorf("Issuer descriptor is nil")
if err != nil {
return res, err
}
}
if issuerDescr.Revoked {
err := fmt.Errorf("The issuer revoked")
if err != nil {
return res, err
}
}
createServicePairParams := &cm509.CreateServicePairParams{
CommonName: params.ServiceCommonName,
IssuerKey: issuerDescr.Key,
IssuerCert: issuerDescr.Cert,
IPAddresses: params.InetAddresses,
DNSNames: params.Hostnames,
}
createSericePairRes, err := cm509.CreateServicePair(createServicePairParams)
if err != nil {
return res, err
}
serviceDescr := &descriptor.Service{
Name: createSericePairRes.Name,
IssuerID: issuerDescr.ID,
IssuerName: issuerDescr.Name,
Cert: createSericePairRes.Cert,
Key: createSericePairRes.Key,
}
serviceID, err := lg.db.InsertService(ctx, serviceDescr)
if err != nil {
return res, err
}
res.ServiceName = createSericePairRes.Name
res.ServiceID = serviceID
res.Certificate = createSericePairRes.Cert
res.Key = createSericePairRes.Key
res.IssuerID = issuerDescr.ID
res.IssuerName = issuerDescr.Name
res.IssuerCertificate = issuerDescr.Cert
return res, err
}
func (lg *Logic) GetServicePair(ctx context.Context, params *cmapi.GetServicePairParams) (*cmapi.GetServicePairResult, error) {
var err error
res := &cmapi.GetServicePairResult{}
var serviceDescr *descriptor.Service
var serviceExists bool
switch {
case params.ServiceID != 0:
serviceExists, serviceDescr, err = lg.db.GetServiceByID(ctx, params.ServiceID)
if !serviceExists {
err := fmt.Errorf("No service was found for id %d", params.ServiceID)
if err != nil {
return res, err
}
}
case params.ServiceName != "":
serviceExists, serviceDescr, err = lg.db.GetServiceByName(ctx, params.ServiceName)
if !serviceExists {
err := fmt.Errorf("No service was found for name %s", params.ServiceName)
if err != nil {
return res, err
}
}
default:
err := fmt.Errorf("Service ID or name is not specified")
if err != nil {
return res, err
}
}
if serviceDescr == nil {
err := fmt.Errorf("Service descriptor is nil")
if err != nil {
return res, err
}
}
issuerExists, issuerDescr, err := lg.db.GetIssuerByID(ctx, serviceDescr.IssuerID)
if !issuerExists {
err := fmt.Errorf("No issuer for serice was found")
if err != nil {
return res, err
}
}
res.Certificate = serviceDescr.Cert
res.Key = serviceDescr.Key
res.IssuerID = serviceDescr.IssuerID
res.IssuerName = serviceDescr.IssuerName
res.Revoked = serviceDescr.Revoked
res.IssuerCertificate = issuerDescr.Cert
return res, err
}
func (lg *Logic) ListServicePairs(ctx context.Context, params *cmapi.ListServicePairsParams) (*cmapi.ListServicePairsResult, error) {
var err error
res := &cmapi.ListServicePairsResult{
Services: make([]*cmapi.ServiceShortDescriptor, 0),
}
listServices, err := lg.db.ListServices(ctx)
if err != nil {
return res, err
}
for _, service := range listServices {
serviceShortDescr := cmapi.ServiceShortDescriptor{
ServiceID: service.ID,
IssuerID: service.IssuerID,
IssuerName: service.IssuerName,
Name: service.Name,
Revoked: service.Revoked,
}
res.Services = append(res.Services, &serviceShortDescr)
}
return res, err
}
func (lg *Logic) RevokeServicePair(ctx context.Context, params *cmapi.RevokeServicePairParams) (*cmapi.RevokeServicePairResult, error) {
var err error
res := &cmapi.RevokeServicePairResult{}
var serviceDescr *descriptor.Service
var serviceExists bool
switch {
case params.ServiceID != 0:
serviceExists, serviceDescr, err = lg.db.GetServiceByID(ctx, params.ServiceID)
if !serviceExists {
err := fmt.Errorf("No signer with id %d was found", params.ServiceID)
if err != nil {
return res, err
}
}
case params.ServiceName != "":
serviceExists, serviceDescr, err = lg.db.GetServiceByName(ctx, params.ServiceName)
if !serviceExists {
err := fmt.Errorf("No signer with name %s was found", params.ServiceName)
if err != nil {
return res, err
}
}
default:
err := fmt.Errorf("Service ID or name is not specified")
if err != nil {
return res, err
}
}
if serviceDescr == nil {
err := fmt.Errorf("Service descriptor is nil")
if err != nil {
return res, err
}
}
if !serviceDescr.Revoked {
serviceDescr.Revoked = true
err = lg.db.UpdateServiceByID(ctx, serviceDescr.ID, serviceDescr)
if err != nil {
return res, err
}
}
return res, err
}
func (lg *Logic) UnrevokeServicePair(ctx context.Context, params *cmapi.UnrevokeServicePairParams) (*cmapi.UnrevokeServicePairResult, error) {
var err error
res := &cmapi.UnrevokeServicePairResult{}
var serviceDescr *descriptor.Service
var serviceExists bool
switch {
case params.ServiceID != 0:
serviceExists, serviceDescr, err = lg.db.GetServiceByID(ctx, params.ServiceID)
if !serviceExists {
err := fmt.Errorf("No signer with id %d was found", params.ServiceID)
if err != nil {
return res, err
}
}
case params.ServiceName != "":
serviceExists, serviceDescr, err = lg.db.GetServiceByName(ctx, params.ServiceName)
if !serviceExists {
err := fmt.Errorf("No signer with name %s was found", params.ServiceName)
if err != nil {
return res, err
}
}
default:
err := fmt.Errorf("Service ID or name is not specified")
if err != nil {
return res, err
}
}
if serviceDescr == nil {
err := fmt.Errorf("Service descriptor is nil")
if err != nil {
return res, err
}
}
if serviceDescr.Revoked {
serviceDescr.Revoked = false
err = lg.db.UpdateServiceByID(ctx, serviceDescr.ID, serviceDescr)
if err != nil {
return res, err
}
}
return res, err
}