diff --git a/go.mod b/go.mod index 078f6682..ca9b5942 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,8 @@ require ( github.com/prometheus/client_golang v1.16.0 github.com/rabbitmq/amqp091-go v1.8.1 github.com/redis/go-redis/v9 v9.0.5 + github.com/rs/xid v1.5.0 + github.com/zeebo/xxh3 v1.0.2 go.opentelemetry.io/otel v1.16.0 go.opentelemetry.io/otel/trace v1.16.0 golang.org/x/crypto v0.12.0 @@ -46,11 +48,9 @@ require ( github.com/prometheus/procfs v0.10.1 // indirect github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 // indirect - github.com/rs/xid v1.5.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/tdewolff/minify/v2 v2.12.8 // indirect github.com/tdewolff/parse/v2 v2.6.7 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect diff --git a/pkg/crud/create.go b/pkg/crud/create.go index ef6bcfc0..3f96e8bf 100644 --- a/pkg/crud/create.go +++ b/pkg/crud/create.go @@ -10,7 +10,6 @@ import ( "github.com/ViBiOh/fibr/pkg/provider" "github.com/ViBiOh/httputils/v4/pkg/model" "github.com/ViBiOh/httputils/v4/pkg/renderer" - "github.com/ViBiOh/httputils/v4/pkg/sha" ) func (a App) Create(w http.ResponseWriter, r *http.Request, request provider.Request) { @@ -68,7 +67,7 @@ func (a App) CreateSavedSearch(w http.ResponseWriter, r *http.Request, request p } if err = a.searchApp.Add(ctx, item, provider.Search{ - ID: sha.New(name), + ID: provider.Hash(name), Name: name, Query: r.URL.RawQuery, }); err != nil { diff --git a/pkg/crud/get.go b/pkg/crud/get.go index 3a7f235f..4eda3e08 100644 --- a/pkg/crud/get.go +++ b/pkg/crud/get.go @@ -88,7 +88,7 @@ func (a App) serveFile(w http.ResponseWriter, r *http.Request, item absto.Item) ctx, end := tracer.StartSpan(r.Context(), a.tracer, "file", trace.WithSpanKind(trace.SpanKindInternal)) defer end(&err) - etag, ok := provider.EtagMatch(w, r, sha.New(item)) + etag, ok := provider.EtagMatch(w, r, provider.Hash(item.String())) if ok { return nil } @@ -191,7 +191,7 @@ func (a App) serveGeoJSON(w http.ResponseWriter, r *http.Request, request provid } else if exifs, err := a.metadataApp.ListDir(ctx, item); err != nil { logger.WithField("item", item.Pathname).Error("list exifs: %s", err) } else { - hash = sha.New(exifs) + hash = provider.RawHash(exifs) } etag, ok := provider.EtagMatch(w, r, hash) diff --git a/pkg/crud/upload_chunk.go b/pkg/crud/upload_chunk.go index c7d767bd..79c9b9f2 100644 --- a/pkg/crud/upload_chunk.go +++ b/pkg/crud/upload_chunk.go @@ -15,7 +15,6 @@ import ( "github.com/ViBiOh/httputils/v4/pkg/cntxt" "github.com/ViBiOh/httputils/v4/pkg/logger" "github.com/ViBiOh/httputils/v4/pkg/model" - "github.com/ViBiOh/httputils/v4/pkg/sha" "github.com/ViBiOh/httputils/v4/pkg/tracer" ) @@ -31,7 +30,7 @@ func (a App) uploadChunk(w http.ResponseWriter, r *http.Request, request provide return } - tempDestination := filepath.Join(a.temporaryFolder, sha.New(fileName)) + tempDestination := filepath.Join(a.temporaryFolder, provider.Hash(fileName)) tempFile := filepath.Join(tempDestination, chunkNumber) if err = os.MkdirAll(tempDestination, absto.DirectoryPerm); err != nil { @@ -77,7 +76,7 @@ func (a App) mergeChunk(w http.ResponseWriter, r *http.Request, request provider return } - tempFolder := filepath.Join(a.temporaryFolder, sha.New(fileName)) + tempFolder := filepath.Join(a.temporaryFolder, provider.Hash(fileName)) tempFile := filepath.Join(tempFolder, fileName) if err := a.mergeChunkFiles(tempFolder, tempFile); err != nil { diff --git a/pkg/provider/util.go b/pkg/provider/util.go index 93a607ea..8b928f0c 100644 --- a/pkg/provider/util.go +++ b/pkg/provider/util.go @@ -3,12 +3,14 @@ package provider import ( "bytes" "context" + "encoding/hex" "errors" "fmt" "io" "net/http" "path" "regexp" + "strconv" "strings" "sync" "time" @@ -17,6 +19,8 @@ import ( absto "github.com/ViBiOh/absto/pkg/model" "github.com/ViBiOh/httputils/v4/pkg/logger" "github.com/ViBiOh/httputils/v4/pkg/request" + "github.com/rs/xid" + "github.com/zeebo/xxh3" "golang.org/x/text/runes" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" @@ -193,3 +197,19 @@ func EtagMatch(w http.ResponseWriter, r *http.Request, hash string) (etag string return } + +func Identifier() string { + return xid.New().String() +} + +func Hash(value string) string { + return strconv.FormatUint(xxh3.HashString(value), 16) +} + +func RawHash(content any) string { + hasher := xxh3.New() + + fmt.Fprintf(hasher, "%v", content) + + return hex.EncodeToString(hasher.Sum(nil)) +} diff --git a/pkg/share/crud.go b/pkg/share/crud.go index 2f34eed1..509bed4b 100644 --- a/pkg/share/crud.go +++ b/pkg/share/crud.go @@ -9,17 +9,11 @@ import ( "github.com/ViBiOh/fibr/pkg/exclusive" "github.com/ViBiOh/fibr/pkg/provider" - "github.com/ViBiOh/httputils/v4/pkg/sha" - "github.com/ViBiOh/httputils/v4/pkg/uuid" ) func (a *App) generateID() (string, error) { for { - id, err := uuid.New() - if err != nil { - return "", err - } - idSha := sha.New(id)[:8] + idSha := provider.Hash(provider.Identifier())[:8] if _, ok := a.shares[idSha]; !ok { return idSha, nil diff --git a/pkg/thumbnail/thumbnail.go b/pkg/thumbnail/thumbnail.go index 2e9f3231..49009791 100644 --- a/pkg/thumbnail/thumbnail.go +++ b/pkg/thumbnail/thumbnail.go @@ -219,7 +219,7 @@ func (a App) List(w http.ResponseWriter, r *http.Request, item absto.Item, items } else if thumbnails, err := a.ListDir(ctx, item); err != nil { logger.WithField("item", item.Pathname).Error("list thumbnails: %s", err) } else { - hash = sha.New(thumbnails) + hash = provider.RawHash(thumbnails) } etag, ok := provider.EtagMatch(w, r, hash) diff --git a/pkg/thumbnail/utils.go b/pkg/thumbnail/utils.go index 1d6cf6a0..318cf246 100644 --- a/pkg/thumbnail/utils.go +++ b/pkg/thumbnail/utils.go @@ -8,7 +8,6 @@ import ( absto "github.com/ViBiOh/absto/pkg/model" "github.com/ViBiOh/fibr/pkg/provider" "github.com/ViBiOh/fibr/pkg/version" - "github.com/ViBiOh/httputils/v4/pkg/sha" "github.com/ViBiOh/httputils/v4/pkg/tracer" "github.com/ViBiOh/vith/pkg/model" ) @@ -81,7 +80,7 @@ func typeOfItem(item absto.Item) model.ItemType { } func redisKey(filename string) string { - return version.Redis("thumbnail:" + sha.New(filename)) + return version.Redis("thumbnail:" + provider.Hash(filename)) } func (a App) Info(ctx context.Context, pathname string) (item absto.Item, err error) { diff --git a/pkg/version/version.go b/pkg/version/version.go index 1d61462f..b2af304e 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -3,11 +3,11 @@ package version import ( "fmt" - "github.com/ViBiOh/httputils/v4/pkg/sha" + "github.com/ViBiOh/fibr/pkg/provider" ) var ( - cacheVersion = sha.New("vibioh/fibr/1")[:8] + cacheVersion = provider.Hash("vibioh/fibr/1")[:8] cachePrefix = "fibr:" + cacheVersion ) diff --git a/pkg/webhook/crud.go b/pkg/webhook/crud.go index 8fb0bea4..34975c7f 100644 --- a/pkg/webhook/crud.go +++ b/pkg/webhook/crud.go @@ -6,17 +6,11 @@ import ( "sort" "github.com/ViBiOh/fibr/pkg/provider" - "github.com/ViBiOh/httputils/v4/pkg/sha" - "github.com/ViBiOh/httputils/v4/pkg/uuid" ) func (a *App) generateID() (string, error) { for { - id, err := uuid.New() - if err != nil { - return "", err - } - idSha := sha.New(id)[:8] + idSha := provider.Hash(provider.Identifier())[:8] if _, ok := a.webhooks[idSha]; !ok { return idSha, nil