mirror of
https://github.com/pomerium/pomerium.git
synced 2025-04-28 09:56:31 +02:00
95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
package proxy
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
"sync"
|
|
|
|
"github.com/pomerium/pomerium/config"
|
|
"github.com/pomerium/pomerium/internal/handlers"
|
|
"github.com/pomerium/pomerium/internal/httputil"
|
|
"github.com/pomerium/pomerium/internal/log"
|
|
"github.com/pomerium/pomerium/proxy/portal"
|
|
"github.com/pomerium/pomerium/ui"
|
|
)
|
|
|
|
func (p *Proxy) routesPortalHTML(w http.ResponseWriter, r *http.Request) error {
|
|
u := p.getUserInfoData(r)
|
|
rs := p.getPortalRoutes(r.Context(), u)
|
|
m := u.ToJSON()
|
|
m["routes"] = rs
|
|
return ui.ServePage(w, r, "Routes", "Routes Portal", m)
|
|
}
|
|
|
|
func (p *Proxy) routesPortalJSON(w http.ResponseWriter, r *http.Request) error {
|
|
u := p.getUserInfoData(r)
|
|
rs := p.getPortalRoutes(r.Context(), u)
|
|
m := map[string]any{}
|
|
m["routes"] = rs
|
|
|
|
b, err := json.Marshal(m)
|
|
if err != nil {
|
|
return httputil.NewError(http.StatusInternalServerError, err)
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(b)
|
|
return nil
|
|
}
|
|
|
|
func (p *Proxy) getPortalRoutes(ctx context.Context, u handlers.UserInfoData) []portal.Route {
|
|
options := p.currentConfig.Load().Options
|
|
pu := p.getPortalUser(u)
|
|
var routes []*config.Policy
|
|
for route := range options.GetAllPolicies() {
|
|
if portal.CheckRouteAccess(pu, route) {
|
|
routes = append(routes, route)
|
|
}
|
|
}
|
|
portalRoutes := portal.RoutesFromConfigRoutes(routes)
|
|
|
|
var wg sync.WaitGroup
|
|
for i, pr := range portalRoutes {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
|
|
r := routes[i]
|
|
for _, to := range r.To {
|
|
if pr.LogoURL == "" {
|
|
var err error
|
|
pr.LogoURL, err = p.logoProvider.GetLogoURL(ctx, pr.From, to.URL.String())
|
|
if err != nil && !errors.Is(err, portal.ErrLogoNotFound) {
|
|
log.Ctx(ctx).Error().
|
|
Err(err).
|
|
Str("from", pr.From).
|
|
Str("to", to.URL.String()).
|
|
Msg("error retrieving logo for route")
|
|
}
|
|
}
|
|
}
|
|
portalRoutes[i] = pr
|
|
}()
|
|
}
|
|
wg.Wait()
|
|
return portalRoutes
|
|
}
|
|
|
|
func (p *Proxy) getPortalUser(u handlers.UserInfoData) portal.User {
|
|
pu := portal.User{}
|
|
pu.SessionID = u.Session.GetId()
|
|
pu.UserID = u.User.GetId()
|
|
pu.Email = u.User.GetEmail()
|
|
for _, dg := range u.DirectoryGroups {
|
|
if v := dg.ID; v != "" {
|
|
pu.Groups = append(pu.Groups, dg.ID)
|
|
}
|
|
if v := dg.Name; v != "" {
|
|
pu.Groups = append(pu.Groups, dg.Name)
|
|
}
|
|
}
|
|
return pu
|
|
}
|