|
@@ -5,7 +5,6 @@ import (
|
|
|
"cmp"
|
|
|
"context"
|
|
|
"crypto/sha256"
|
|
|
- "encoding/base64"
|
|
|
"encoding/hex"
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
@@ -24,14 +23,12 @@ import (
|
|
|
"strings"
|
|
|
|
|
|
"github.com/ollama/ollama/api"
|
|
|
- "github.com/ollama/ollama/auth"
|
|
|
"github.com/ollama/ollama/envconfig"
|
|
|
"github.com/ollama/ollama/format"
|
|
|
"github.com/ollama/ollama/llama"
|
|
|
"github.com/ollama/ollama/llm"
|
|
|
"github.com/ollama/ollama/parser"
|
|
|
"github.com/ollama/ollama/template"
|
|
|
- "github.com/ollama/ollama/types/errtypes"
|
|
|
"github.com/ollama/ollama/types/model"
|
|
|
"github.com/ollama/ollama/version"
|
|
|
)
|
|
@@ -985,37 +982,7 @@ func GetSHA256Digest(r io.Reader) (string, int64) {
|
|
|
|
|
|
var errUnauthorized = errors.New("unauthorized: access denied")
|
|
|
|
|
|
-// getTokenSubject returns the subject of a JWT token, it does not validate the token
|
|
|
-func getTokenSubject(token string) string {
|
|
|
- parts := strings.Split(token, ".")
|
|
|
- if len(parts) != 3 {
|
|
|
- return ""
|
|
|
- }
|
|
|
-
|
|
|
- payload := parts[1]
|
|
|
- payloadBytes, err := base64.RawURLEncoding.DecodeString(payload)
|
|
|
- if err != nil {
|
|
|
- slog.Error(fmt.Sprintf("failed to decode jwt payload: %v", err))
|
|
|
- return ""
|
|
|
- }
|
|
|
-
|
|
|
- var payloadMap map[string]interface{}
|
|
|
- if err := json.Unmarshal(payloadBytes, &payloadMap); err != nil {
|
|
|
- slog.Error(fmt.Sprintf("failed to unmarshal payload JSON: %v", err))
|
|
|
- return ""
|
|
|
- }
|
|
|
-
|
|
|
- sub, ok := payloadMap["sub"]
|
|
|
- if !ok {
|
|
|
- slog.Error("jwt does not contain 'sub' field")
|
|
|
- return ""
|
|
|
- }
|
|
|
-
|
|
|
- return fmt.Sprintf("%s", sub)
|
|
|
-}
|
|
|
-
|
|
|
func makeRequestWithRetry(ctx context.Context, method string, requestURL *url.URL, headers http.Header, body io.ReadSeeker, regOpts *registryOptions) (*http.Response, error) {
|
|
|
- anonymous := true // access will default to anonymous if no user is found associated with the public key
|
|
|
for range 2 {
|
|
|
resp, err := makeRequest(ctx, method, requestURL, headers, body, regOpts)
|
|
|
if err != nil {
|
|
@@ -1036,7 +1003,6 @@ func makeRequestWithRetry(ctx context.Context, method string, requestURL *url.UR
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- anonymous = getTokenSubject(token) == "anonymous"
|
|
|
regOpts.Token = token
|
|
|
if body != nil {
|
|
|
_, err = body.Seek(0, io.SeekStart)
|
|
@@ -1059,16 +1025,6 @@ func makeRequestWithRetry(ctx context.Context, method string, requestURL *url.UR
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if anonymous {
|
|
|
- // no user is associated with the public key, and the request requires non-anonymous access
|
|
|
- pubKey, nestedErr := auth.GetPublicKey()
|
|
|
- if nestedErr != nil {
|
|
|
- slog.Error(fmt.Sprintf("couldn't get public key: %v", nestedErr))
|
|
|
- return nil, errUnauthorized
|
|
|
- }
|
|
|
- return nil, &errtypes.UnknownOllamaKey{Key: pubKey}
|
|
|
- }
|
|
|
- // user is associated with the public key, but is not authorized to make the request
|
|
|
return nil, errUnauthorized
|
|
|
}
|
|
|
|