Skip to content
16 changes: 16 additions & 0 deletions cmd/api/src/api/v2/ad_entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@ package v2

import (
"fmt"
"log/slog"
"net/http"

"github.com/specterops/bloodhound/cmd/api/src/api"
"github.com/specterops/bloodhound/cmd/api/src/auth"
bhCtx "github.com/specterops/bloodhound/cmd/api/src/ctx"
adAnalysis "github.com/specterops/bloodhound/packages/go/analysis/ad"
"github.com/specterops/bloodhound/packages/go/analysis/tiering"
"github.com/specterops/bloodhound/packages/go/bhlog/attr"
"github.com/specterops/bloodhound/packages/go/graphschema/ad"
"github.com/specterops/bloodhound/packages/go/graphschema/common"
"github.com/specterops/dawgs/graph"
Expand Down Expand Up @@ -64,10 +68,22 @@ func (s *Resources) PatchDomain(response http.ResponseWriter, request *http.Requ
}

func (s *Resources) handleAdEntityInfoQuery(response http.ResponseWriter, request *http.Request, entityType graph.Kind, countQueries map[string]any) {
user, isUser := auth.GetUserFromAuthCtx(bhCtx.FromRequest(request).AuthCtx)
if !isUser {
slog.Error("Unable to get user from auth context")
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusInternalServerError, api.ErrorResponseDetailsInternalServerError, request), response)
return
}

if includeCounts, err := api.ParseOptionalBool(request.URL.Query().Get(api.QueryParameterIncludeCounts), true); err != nil {
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusBadRequest, api.ErrorResponseDetailsBadQueryParameterFilters, request), response)
} else if objectId, err := GetEntityObjectIDFromRequestPath(request); err != nil {
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusBadRequest, fmt.Sprintf("error reading objectid: %v", err), request), response)
} else if hasAccess, err := CheckUserHasAccessToNodeById(request.Context(), s.DB, s.GraphQuery, s.DogTags, user, objectId, entityType); err != nil {
slog.ErrorContext(request.Context(), "Error checking if user has access to node for ETAC", attr.Error(err))
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusInternalServerError, api.ErrorResponseDetailsInternalServerError, request), response)
} else if !hasAccess {
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusForbidden, api.ErrorResponseDetailsForbidden, request), response)
} else if node, err := s.GraphQuery.GetEntityByObjectId(request.Context(), objectId, entityType); err != nil {
if graph.IsErrNotFound(err) {
api.WriteErrorResponse(request.Context(), api.BuildErrorResponse(http.StatusNotFound, "node not found", request), response)
Expand Down
Loading