app/dashboard/auth.go (94 lines of code) (raw):
package dashboard
import (
"context"
"ddm-admin-console/router"
"ddm-admin-console/service/codebase"
"ddm-admin-console/service/k8s"
"fmt"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
func (a *App) auth(ctx *gin.Context) (response router.Response, retErr error) {
authCode := ctx.Query("code")
token, _, err := a.oauth.GetTokenClient(ctx, authCode)
if err != nil {
return nil, errors.Wrap(err, "unable to get token client")
}
session := sessions.Default(ctx)
session.Set(router.AuthTokenSessionKey, token)
userCtx := router.ContextWithUserAccessToken(ctx)
user, err := a.openShiftService.GetMe(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to get open shift user")
}
if user.FullName == "" && user.Metadata.Name == "kube:admin" {
session.Set(router.UserNameSessionKey, "kubeadmin")
session.Set(router.UserEmailSessionKey, "kubeadmin@example.com")
} else {
session.Set(router.UserNameSessionKey, user.FullName)
session.Set(router.UserEmailSessionKey, user.Metadata.Name)
}
if err := a.setRegistryPermissionsToSession(userCtx, session); err != nil {
return nil, errors.Wrap(err, "unable to set registry permissions to session")
}
if err := session.Save(); err != nil {
return nil, errors.Wrap(err, "unable to save session")
}
go func() {
if err := a.permService.LoadUserRegistries(ctx); err != nil {
a.logger.Error(err.Error())
}
}()
return router.MakeRedirectResponse(http.StatusFound, "/admin/registry/overview"), nil
}
func (a *App) setRegistryPermissionsToSession(userCtx context.Context, session sessions.Session) error {
k8sService, err := a.k8sService.ServiceForContext(userCtx)
if err != nil {
return errors.Wrap(err, "unable to init k8s service for user")
}
canGetClusterCodebase, err := k8sService.CanI("v2.edp.epam.com", "codebases", "get", a.clusterCodebaseName)
if err != nil {
return errors.Wrap(err, "unable to check access to cluster codebase")
}
session.Set(router.CanViewClusterManagementSessionKey, canGetClusterCodebase)
canListCodebases, err := a.hasAccessToRegistries(k8sService)
if err != nil {
return errors.Wrap(err, "unable to check access to codebases list")
}
session.Set(router.CanViewRegistriesSessionKey, canListCodebases)
canCreate, err := k8sService.CanI("v2.edp.epam.com", "codebases", "create", "*")
if err != nil {
return errors.Wrap(err, "unable to check creation permission")
}
session.Set(router.CanCreateRegistriesSessionKey, canCreate)
return nil
}
func (a *App) hasAccessToRegistries(k8sService k8s.ServiceInterface) (bool, error) {
cbs, err := a.codebaseService.GetAllByType(codebase.RegistryCodebaseType)
if err != nil {
return false, errors.Wrap(err, "")
}
for i := range cbs {
canGet, err := k8sService.CanI("v2.edp.epam.com", "codebases", "get", cbs[i].Name)
if err != nil {
return false, errors.Wrapf(err, "unable to check access for codebase: %s", cbs[i].Name)
}
if canGet {
return true, nil
}
}
return false, nil
}
func (a *App) logout(ctx *gin.Context) (router.Response, error) {
if err := a.permService.DeleteTokenContext(ctx); err != nil {
return nil, fmt.Errorf("unable to delete token: %w", err)
}
session := sessions.Default(ctx)
session.Clear()
if err := session.Save(); err != nil {
return nil, errors.Wrap(err, "unable to save session")
}
return router.MakeRedirectResponse(http.StatusFound, "/"), nil
}