diff --git a/cache/advertise.go b/cache/advertise.go index 0c9ce49a5..71b4937b7 100644 --- a/cache/advertise.go +++ b/cache/advertise.go @@ -271,7 +271,7 @@ func getTickerRate(tok string) time.Duration { func LaunchFedTokManager(ctx context.Context, egrp *errgroup.Group, cache server_structs.XRootDServer) { // Do our initial token fetch+set, then turn things over to the ticker - tok, err := server_utils.GetFedTok(ctx, cache) + tok, err := server_utils.CreateFedTok(ctx, cache) if err != nil { log.Errorf("Failed to get a federation token: %v", err) } @@ -298,7 +298,7 @@ func LaunchFedTokManager(ctx context.Context, egrp *errgroup.Group, cache server case <-fedTokTicker.C: // Time to ask the Director for a new token log.Debugln("Refreshing federation token") - tok, err := server_utils.GetFedTok(ctx, cache) + tok, err := server_utils.CreateFedTok(ctx, cache) if err != nil { log.Errorf("Failed to get a federation token: %v", err) continue diff --git a/director/fed_token.go b/director/fed_token.go index d3d3790fe..2cde14e52 100644 --- a/director/fed_token.go +++ b/director/fed_token.go @@ -48,10 +48,10 @@ func validateFedTokRequest(ginCtx *gin.Context) (rInfo requestInfo, err error) { reqParams := getRequestParameters(ginCtx.Request) hNames, exists := reqParams["host"] if !exists || len(hNames) == 0 { - err = fmt.Errorf("no hostname found in the 'host' url parameter") + err = fmt.Errorf("no hostname found in the 'host' url parameter: %s", ginCtx.Request.URL.String()) return } else if len(hNames) > 1 { - err = fmt.Errorf("multiple hostnames found in the 'host' url parameter") + err = fmt.Errorf("multiple hostnames found in the 'host' url parameter: %s", ginCtx.Request.URL.String()) return } rInfo.Host = hNames[0] @@ -59,15 +59,15 @@ func validateFedTokRequest(ginCtx *gin.Context) (rInfo requestInfo, err error) { sTypes, exists := reqParams["sType"] var sType server_structs.ServerType if !exists || len(sTypes) == 0 { - err = fmt.Errorf("host '%s' generated request with no server type found in the 'sType' url parameter", rInfo.Host) + err = fmt.Errorf("host '%s' generated request with no server type found in the 'sType' url parameter: %s", rInfo.Host, ginCtx.Request.URL.String()) return } else if len(sTypes) > 1 { - err = fmt.Errorf("host '%s' generated request with multiple server types in the 'sType' url parameter", rInfo.Host) + err = fmt.Errorf("host '%s' generated request with multiple server types in the 'sType' url parameter: %s", rInfo.Host, ginCtx.Request.URL.String()) return } valid := sType.SetString(sTypes[0]) if !valid || (sType != server_structs.CacheType && sType != server_structs.OriginType) { - err = fmt.Errorf("host '%s' generated request with invalid server type '%s' as value of 'sType' url parameter", rInfo.Host, sTypes[0]) + err = fmt.Errorf("host '%s' generated request with invalid server type '%s' as value of 'sType' url parameter: %s", rInfo.Host, sTypes[0], ginCtx.Request.URL.String()) return } rInfo.SType = sType diff --git a/e2e_fed_tests/director_test.go b/e2e_fed_tests/director_test.go index 7d6d77b28..0764da923 100644 --- a/e2e_fed_tests/director_test.go +++ b/e2e_fed_tests/director_test.go @@ -233,7 +233,7 @@ func TestDirectorFedTokenCacheAPI(t *testing.T) { ctx := context.Background() ctx, _, _ = test_utils.TestContext(ctx, t) cache := cache.CacheServer{} - tokStr, err := server_utils.GetFedTok(ctx, &cache) + tokStr, err := server_utils.CreateFedTok(ctx, &cache) require.NoError(t, err, "Failed to get cache's advertisement token") require.NotEmpty(t, tokStr, "Got an empty token") diff --git a/server_utils/server_utils.go b/server_utils/server_utils.go index ebe1d9136..648606536 100644 --- a/server_utils/server_utils.go +++ b/server_utils/server_utils.go @@ -356,7 +356,7 @@ func GetAdvertisementTok(ctx context.Context, server server_structs.XRootDServer // GetFedTok retrieves a federation token from the Director, which can be passed to other // federation services as proof of federation membership. -func GetFedTok(ctx context.Context, server server_structs.XRootDServer) (string, error) { +func CreateFedTok(ctx context.Context, server server_structs.XRootDServer) (string, error) { // Set up the request to the Director fInfo, err := config.GetFederation(ctx) if err != nil { @@ -444,17 +444,16 @@ func SetFedTok(ctx context.Context, server server_structs.XRootDServer, tok stri dir := filepath.Dir(tokLoc) if err := os.MkdirAll(dir, 0755); err != nil { - if !os.IsExist(err) { - return errors.Wrap(err, "failed to create fed token directories") - } + return errors.Wrap(err, "failed to create fed token directories") } // Create a temporary file for storing the token. Later we'll do an atomic rename - tmpName := filepath.Join(dir, fmt.Sprintf(".fedtoken.%d", time.Now().UnixNano())) - tmpFile, err := os.OpenFile(tmpName, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) + filenamePattern := fmt.Sprintf(".fedtoken.%d.*", time.Now().UnixNano()) + tmpFile, err := os.CreateTemp(dir, filenamePattern) if err != nil { return errors.Wrap(err, "failed to create temporary token file") } + tmpName := tmpFile.Name() defer func() { tmpFile.Close() @@ -472,7 +471,7 @@ func SetFedTok(ctx context.Context, server server_structs.XRootDServer, tok stri } if err := os.Chown(tmpName, uid, gid); err != nil { - return errors.Wrap(err, "failed to change token file ownership") + return errors.Wrapf(err, "failed to change token file ownership of %s to %d:%d", tmpName, uid, gid) } if _, err := tmpFile.WriteString(tok); err != nil {