Fix step-ca root CA access on Linux CI
Host chmod cannot open 0700 dirs owned by UID 1000, so `-f` never sees root_ca.crt. Chmod from inside the container as root while waiting for the cert. Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
@@ -424,18 +424,20 @@ psql: ## Open a psql shell to the postgres container
|
|||||||
$(DOCKER_COMPOSE) exec postgres psql -U probod -d probod
|
$(DOCKER_COMPOSE) exec postgres psql -U probod -d probod
|
||||||
|
|
||||||
compose/step-ca/certs/root_ca.crt:
|
compose/step-ca/certs/root_ca.crt:
|
||||||
# step-ca runs as UID 1000 and creates 0700 dirs; open them for the
|
# step-ca runs as UID 1000 and creates 0700 dirs. On Linux CI the host
|
||||||
# host user so later `go list ./...` can walk the bind mount on Linux.
|
# user cannot traverse them, so `-f` never sees root_ca.crt and a host
|
||||||
|
# chmod cannot fix ownership. Open perms from inside the container.
|
||||||
@$(MKDIR) compose/step-ca
|
@$(MKDIR) compose/step-ca
|
||||||
@chmod a+rwx compose/step-ca
|
@chmod a+rwx compose/step-ca
|
||||||
$(DOCKER_COMPOSE) up -d acme-http-01-proxy step-ca
|
$(DOCKER_COMPOSE) up -d acme-http-01-proxy step-ca
|
||||||
@i=0; \
|
@i=0; \
|
||||||
while [ ! -f $@ ] && [ $$i -lt 60 ]; do \
|
while [ ! -f $@ ] && [ $$i -lt 60 ]; do \
|
||||||
|
$(DOCKER_COMPOSE) exec -T -u 0 step-ca chmod -R a+rX /home/step 2>/dev/null || true; \
|
||||||
sleep 1; \
|
sleep 1; \
|
||||||
i=$$((i + 1)); \
|
i=$$((i + 1)); \
|
||||||
done
|
done
|
||||||
@test -f $@ || ($(DOCKER_COMPOSE) logs step-ca >&2; echo "step-ca root CA not ready" >&2; exit 1)
|
@test -f $@ || ($(DOCKER_COMPOSE) logs step-ca >&2; echo "step-ca root CA not ready" >&2; exit 1)
|
||||||
@chmod -R a+rX compose/step-ca
|
@$(DOCKER_COMPOSE) exec -T -u 0 step-ca chmod -R a+rX /home/step
|
||||||
|
|
||||||
compose/keycloak/certs/cert.pem:
|
compose/keycloak/certs/cert.pem:
|
||||||
$(MKDIR) ./compose/keycloak/certs
|
$(MKDIR) ./compose/keycloak/certs
|
||||||
|
|||||||
@@ -296,6 +296,7 @@ func (h *provisionHandler) skipsDNSChecks(
|
|||||||
}
|
}
|
||||||
|
|
||||||
domain := &coredata.CustomDomain{}
|
domain := &coredata.CustomDomain{}
|
||||||
|
|
||||||
err := domain.LoadByDomain(ctx, conn, coredata.NewNoScope(), hostname)
|
err := domain.LoadByDomain(ctx, conn, coredata.NewNoScope(), hostname)
|
||||||
if errors.Is(err, coredata.ErrResourceNotFound) {
|
if errors.Is(err, coredata.ErrResourceNotFound) {
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ func loadDomains(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var certificateIDs []gid.GID
|
var certificateIDs []gid.GID
|
||||||
|
|
||||||
domainByCertificate := make(map[gid.GID]gid.GID)
|
domainByCertificate := make(map[gid.GID]gid.GID)
|
||||||
|
|
||||||
for _, d := range domains {
|
for _, d := range domains {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ func (s *Service) AddCustomDomain(
|
|||||||
v := validator.New()
|
v := validator.New()
|
||||||
v.Check(compliancePageID, "compliance_page_id", validator.Required(), validator.GID(coredata.TrustCenterEntityType))
|
v.Check(compliancePageID, "compliance_page_id", validator.Required(), validator.GID(coredata.TrustCenterEntityType))
|
||||||
v.Check(domain, "domain", validator.Required(), validator.NotEmpty(), validator.Domain())
|
v.Check(domain, "domain", validator.Required(), validator.NotEmpty(), validator.Domain())
|
||||||
|
|
||||||
if err := v.Error(); err != nil {
|
if err := v.Error(); err != nil {
|
||||||
return nil, fmt.Errorf("invalid request: %w", err)
|
return nil, fmt.Errorf("invalid request: %w", err)
|
||||||
}
|
}
|
||||||
@@ -107,6 +108,7 @@ func (s *Service) RemoveCustomDomain(
|
|||||||
}
|
}
|
||||||
|
|
||||||
compliancePage := &coredata.TrustCenter{}
|
compliancePage := &coredata.TrustCenter{}
|
||||||
|
|
||||||
err := compliancePage.LoadByDomainID(ctx, tx, customDomainID)
|
err := compliancePage.LoadByDomainID(ctx, tx, customDomainID)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
@@ -181,6 +183,7 @@ func (s *Service) PublicURL(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
publicURL, err = s.PublicURLForCompliancePage(ctx, conn, scope, compliancePage)
|
publicURL, err = s.PublicURLForCompliancePage(ctx, conn, scope, compliancePage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot resolve public url: %w", err)
|
return fmt.Errorf("cannot resolve public url: %w", err)
|
||||||
|
|||||||
@@ -97,7 +97,6 @@ func (s *Service) ListFilesForOrganizationID(
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -124,7 +123,6 @@ func (s *Service) CountFilesForOrganizationID(
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -290,13 +290,10 @@ func (s *Service) generateDocumentPDFOnTheFly(
|
|||||||
fileRecord := &coredata.File{}
|
fileRecord := &coredata.File{}
|
||||||
|
|
||||||
fileErr := s.pg.WithConn(
|
fileErr := s.pg.WithConn(
|
||||||
|
|
||||||
ctx,
|
ctx,
|
||||||
|
|
||||||
func(ctx context.Context, conn pg.Querier) error {
|
func(ctx context.Context, conn pg.Querier) error {
|
||||||
return fileRecord.LoadByID(ctx, conn, scope, *organization.HorizontalLogoFileID)
|
return fileRecord.LoadByID(ctx, conn, scope, *organization.HorizontalLogoFileID)
|
||||||
})
|
})
|
||||||
|
|
||||||
if fileErr == nil {
|
if fileErr == nil {
|
||||||
base64Data, mimeType, logoErr := s.fileManager.GetFileBase64(ctx, fileRecord)
|
base64Data, mimeType, logoErr := s.fileManager.GetFileBase64(ctx, fileRecord)
|
||||||
if logoErr == nil {
|
if logoErr == nil {
|
||||||
|
|||||||
@@ -651,6 +651,7 @@ func NewCIMDClient(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse logo_uri: %w", err)
|
return nil, fmt.Errorf("cannot parse logo_uri: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !u.IsHTTP() {
|
if !u.IsHTTP() {
|
||||||
return nil, fmt.Errorf("logo_uri must be an absolute http or https URL")
|
return nil, fmt.Errorf("logo_uri must be an absolute http or https URL")
|
||||||
}
|
}
|
||||||
@@ -663,6 +664,7 @@ func NewCIMDClient(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse client_uri: %w", err)
|
return nil, fmt.Errorf("cannot parse client_uri: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !u.IsHTTP() {
|
if !u.IsHTTP() {
|
||||||
return nil, fmt.Errorf("client_uri must be an absolute http or https URL")
|
return nil, fmt.Errorf("client_uri must be an absolute http or https URL")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ func AuthorizationURLWithQuery(
|
|||||||
}
|
}
|
||||||
|
|
||||||
merged := u.Query()
|
merged := u.Query()
|
||||||
|
|
||||||
for key, values := range query {
|
for key, values := range query {
|
||||||
for _, value := range values {
|
for _, value := range values {
|
||||||
merged.Add(key, value)
|
merged.Add(key, value)
|
||||||
|
|||||||
@@ -1547,6 +1547,7 @@ func (s *Service) Authorize(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var existingConsent coredata.OAuth2Consent
|
var existingConsent coredata.OAuth2Consent
|
||||||
|
|
||||||
skipConsent = existingConsent.LoadMatchingConsent(
|
skipConsent = existingConsent.LoadMatchingConsent(
|
||||||
ctx,
|
ctx,
|
||||||
tx,
|
tx,
|
||||||
|
|||||||
@@ -686,6 +686,7 @@ func (impl *Implm) Run(
|
|||||||
)
|
)
|
||||||
|
|
||||||
staticCIMDAllow := oauth2.CIMDAllowFromClientIDs(impl.cfg.Auth.OAuth2Server.CIMDAllowedClientIDs)
|
staticCIMDAllow := oauth2.CIMDAllowFromClientIDs(impl.cfg.Auth.OAuth2Server.CIMDAllowedClientIDs)
|
||||||
|
|
||||||
iamService.OAuth2ServerService.SetCIMDAllow(
|
iamService.OAuth2ServerService.SetCIMDAllow(
|
||||||
func(ctx context.Context, clientIDURL string) (oauth2.CIMDAllowance, error) {
|
func(ctx context.Context, clientIDURL string) (oauth2.CIMDAllowance, error) {
|
||||||
host, ok := oauth2.CIMDClientIDHost(clientIDURL)
|
host, ok := oauth2.CIMDClientIDHost(clientIDURL)
|
||||||
@@ -1322,6 +1323,7 @@ func newTrustCenterHTTPRedirectHandler(trustService *visitor.Service, l *log.Log
|
|||||||
}
|
}
|
||||||
|
|
||||||
httpserver.RenderError(w, http.StatusInternalServerError, errors.New("internal server error"))
|
httpserver.RenderError(w, http.StatusInternalServerError, errors.New("internal server error"))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ func NewSessionHostMiddleware(cookieConfig securecookie.Config) func(next http.H
|
|||||||
return http.HandlerFunc(
|
return http.HandlerFunc(
|
||||||
func(w http.ResponseWriter, r *http.Request) {
|
func(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
session := authn.SessionFromContext(ctx)
|
session := authn.SessionFromContext(ctx)
|
||||||
if session == nil {
|
if session == nil {
|
||||||
next.ServeHTTP(w, r)
|
next.ServeHTTP(w, r)
|
||||||
@@ -52,6 +53,7 @@ func NewSessionHostMiddleware(cookieConfig securecookie.Config) func(next http.H
|
|||||||
}
|
}
|
||||||
|
|
||||||
securecookie.Clear(w, cookieConfig)
|
securecookie.Clear(w, cookieConfig)
|
||||||
|
|
||||||
ctx = authn.ContextWithSession(ctx, nil)
|
ctx = authn.ContextWithSession(ctx, nil)
|
||||||
ctx = authn.ContextWithIdentity(ctx, nil)
|
ctx = authn.ContextWithIdentity(ctx, nil)
|
||||||
next.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ func TestSessionHostMiddleware_RejectsMismatchedHost(t *testing.T) {
|
|||||||
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
||||||
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
@@ -80,6 +81,7 @@ func TestSessionHostMiddleware_AllowsMatchingTLSHost(t *testing.T) {
|
|||||||
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
||||||
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
@@ -111,6 +113,7 @@ func TestSessionHostMiddleware_RejectsSpoofedHostHeader(t *testing.T) {
|
|||||||
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
handler := NewSessionHostMiddleware(securecookie.Config{Name: "ssid"})(
|
||||||
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
authenticated = authn.IdentityFromContext(r.Context()) != nil
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ func (h *brandLogoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fileID *gid.GID
|
var fileID *gid.GID
|
||||||
|
|
||||||
switch h.variant {
|
switch h.variant {
|
||||||
case brandLogoVariantLogo:
|
case brandLogoVariantLogo:
|
||||||
fileID = compliancePage.LogoFileID
|
fileID = compliancePage.LogoFileID
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ func (h *OAuthCallbackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
code := r.URL.Query().Get("code")
|
code := r.URL.Query().Get("code")
|
||||||
|
|
||||||
stateToken := r.URL.Query().Get("state")
|
stateToken := r.URL.Query().Get("state")
|
||||||
if code == "" || stateToken == "" {
|
if code == "" || stateToken == "" {
|
||||||
httpserver.RenderError(w, http.StatusBadRequest, errInvalidOAuthRequest)
|
httpserver.RenderError(w, http.StatusBadRequest, errInvalidOAuthRequest)
|
||||||
@@ -92,6 +93,7 @@ func (h *OAuthCallbackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
portal := complianceportal.CompliancePageFromContext(ctx)
|
portal := complianceportal.CompliancePageFromContext(ctx)
|
||||||
|
|
||||||
portalBaseURL := complianceportal.CompliancePageBaseURLFromContext(ctx)
|
portalBaseURL := complianceportal.CompliancePageBaseURLFromContext(ctx)
|
||||||
if portal == nil || portalBaseURL == nil {
|
if portal == nil || portalBaseURL == nil {
|
||||||
httpserver.RenderError(w, http.StatusNotFound, errNotFound)
|
httpserver.RenderError(w, http.StatusNotFound, errNotFound)
|
||||||
|
|||||||
@@ -105,5 +105,4 @@ func TestMagicLinkHandler_SendHandler_Validation(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, http.StatusBadRequest, rec.Code)
|
assert.Equal(t, http.StatusBadRequest, rec.Code)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ func (r *customDomainResolver) Certificate(ctx context.Context, obj *types.Custo
|
|||||||
}
|
}
|
||||||
|
|
||||||
r.logger.ErrorCtx(ctx, "cannot load certificate", log.Error(err))
|
r.logger.ErrorCtx(ctx, "cannot load certificate", log.Error(err))
|
||||||
|
|
||||||
return nil, gqlutils.Internal(ctx)
|
return nil, gqlutils.Internal(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1204,6 +1205,7 @@ func (r *trustCenterResolver) DefaultDomain(ctx context.Context, obj *types.Trus
|
|||||||
}
|
}
|
||||||
|
|
||||||
r.logger.ErrorCtx(ctx, "cannot load default domain", log.Error(err))
|
r.logger.ErrorCtx(ctx, "cannot load default domain", log.Error(err))
|
||||||
|
|
||||||
return nil, gqlutils.Internal(ctx)
|
return nil, gqlutils.Internal(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1228,6 +1230,7 @@ func (r *trustCenterResolver) CustomDomain(ctx context.Context, obj *types.Trust
|
|||||||
}
|
}
|
||||||
|
|
||||||
r.logger.ErrorCtx(ctx, "cannot load custom domain", log.Error(err))
|
r.logger.ErrorCtx(ctx, "cannot load custom domain", log.Error(err))
|
||||||
|
|
||||||
return nil, gqlutils.Internal(ctx)
|
return nil, gqlutils.Internal(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4953,6 +4953,7 @@ func (r *Resolver) UpdateTrustCenterTool(ctx context.Context, req *mcp.CallToolR
|
|||||||
updateReq.WebsiteURL = UnwrapOmittable(input.WebsiteURL)
|
updateReq.WebsiteURL = UnwrapOmittable(input.WebsiteURL)
|
||||||
updateReq.Email = UnwrapOmittable(input.Email)
|
updateReq.Email = UnwrapOmittable(input.Email)
|
||||||
updateReq.HeadquarterAddress = UnwrapOmittable(input.HeadquarterAddress)
|
updateReq.HeadquarterAddress = UnwrapOmittable(input.HeadquarterAddress)
|
||||||
|
|
||||||
if title := UnwrapOmittable(input.Title); title != nil {
|
if title := UnwrapOmittable(input.Title); title != nil {
|
||||||
updateReq.Title = *title
|
updateReq.Title = *title
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user