diff --git a/pkg/api/resolver_model_scene.go b/pkg/api/resolver_model_scene.go index dcec7fa86..f657d8371 100644 --- a/pkg/api/resolver_model_scene.go +++ b/pkg/api/resolver_model_scene.go @@ -4,6 +4,7 @@ import ( "context" "github.com/stashapp/stash/pkg/api/urlbuilders" + "github.com/stashapp/stash/pkg/manager/config" "github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/utils" ) @@ -78,6 +79,7 @@ func (r *sceneResolver) File(ctx context.Context, obj *models.Scene) (*models.Sc func (r *sceneResolver) Paths(ctx context.Context, obj *models.Scene) (*models.ScenePathsType, error) { baseURL, _ := ctx.Value(BaseURLCtxKey).(string) builder := urlbuilders.NewSceneURLBuilder(baseURL, obj.ID) + builder.APIKey = config.GetInstance().GetAPIKey() screenshotPath := builder.GetScreenshotURL(obj.UpdatedAt.Timestamp) previewPath := builder.GetStreamPreviewURL() streamPath := builder.GetStreamURL() diff --git a/pkg/api/server.go b/pkg/api/server.go index 26dd34fbe..a59ef4cee 100644 --- a/pkg/api/server.go +++ b/pkg/api/server.go @@ -37,7 +37,10 @@ var uiBox *packr.Box //var legacyUiBox *packr.Box var loginUIBox *packr.Box -const ApiKeyHeader = "ApiKey" +const ( + ApiKeyHeader = "ApiKey" + ApiKeyParameter = "apikey" +) func allowUnauthenticated(r *http.Request) bool { return strings.HasPrefix(r.URL.Path, "/login") || r.URL.Path == "/css" @@ -54,6 +57,11 @@ func authenticateHandler() func(http.Handler) http.Handler { apiKey := r.Header.Get(ApiKeyHeader) var err error + // try getting the api key as a query parameter + if apiKey == "" { + apiKey = r.URL.Query().Get(ApiKeyParameter) + } + if apiKey != "" { // match against configured API and set userID to the // configured username. In future, we'll want to diff --git a/pkg/api/urlbuilders/scene.go b/pkg/api/urlbuilders/scene.go index 5d7af407c..9a31e504f 100644 --- a/pkg/api/urlbuilders/scene.go +++ b/pkg/api/urlbuilders/scene.go @@ -1,6 +1,7 @@ package urlbuilders import ( + "fmt" "strconv" "time" ) @@ -8,6 +9,7 @@ import ( type SceneURLBuilder struct { BaseURL string SceneID string + APIKey string } func NewSceneURLBuilder(baseURL string, sceneID int) SceneURLBuilder { @@ -18,7 +20,11 @@ func NewSceneURLBuilder(baseURL string, sceneID int) SceneURLBuilder { } func (b SceneURLBuilder) GetStreamURL() string { - return b.BaseURL + "/scene/" + b.SceneID + "/stream" + var apiKeyParam string + if b.APIKey != "" { + apiKeyParam = fmt.Sprintf("?apikey=%s", b.APIKey) + } + return fmt.Sprintf("%s/scene/%s/stream%s", b.BaseURL, b.SceneID, apiKeyParam) } func (b SceneURLBuilder) GetStreamPreviewURL() string { diff --git a/ui/v2.5/src/components/Changelog/versions/v070.md b/ui/v2.5/src/components/Changelog/versions/v070.md index 14accf8ab..f005c915a 100644 --- a/ui/v2.5/src/components/Changelog/versions/v070.md +++ b/ui/v2.5/src/components/Changelog/versions/v070.md @@ -4,6 +4,7 @@ * Added scene queue. ### 🎨 Improvements +* Support API key via URL query parameter, and added API key to stream link in Scene File Info. * Revamped setup wizard and migration UI. * Add various `count` filter criteria and sort options. * Scroll to top when changing page number.