浏览代码

use timestamp from challenge, fallback to local time

Michael Yang 10 月之前
父节点
当前提交
70d31c1e9a
共有 2 个文件被更改,包括 15 次插入7 次删除
  1. 5 4
      server/auth.go
  2. 10 3
      server/images.go

+ 5 - 4
server/auth.go

@@ -20,9 +20,10 @@ import (
 )
 
 type registryChallenge struct {
-	Realm   string
-	Service string
-	Scope   string
+	Realm     string
+	Service   string
+	Scope     string
+	Timestamp time.Time
 }
 
 func (r registryChallenge) URL() (*url.URL, error) {
@@ -37,7 +38,7 @@ func (r registryChallenge) URL() (*url.URL, error) {
 		values.Add("scope", s)
 	}
 
-	values.Add("ts", strconv.FormatInt(time.Now().Unix(), 10))
+	values.Add("ts", strconv.FormatInt(r.Timestamp.Unix(), 10))
 
 	nonce, err := auth.NewNonce(rand.Reader, 16)
 	if err != nil {

+ 10 - 3
server/images.go

@@ -21,6 +21,7 @@ import (
 	"slices"
 	"strconv"
 	"strings"
+	"time"
 
 	"github.com/ollama/ollama/api"
 	"github.com/ollama/ollama/auth"
@@ -1111,10 +1112,16 @@ func getValue(header, key string) string {
 func parseRegistryChallenge(authStr string) registryChallenge {
 	authStr = strings.TrimPrefix(authStr, "Bearer ")
 
+	s, err := strconv.ParseInt(getValue(authStr, "timestamp"), 10, 64)
+	if err != nil {
+		s = time.Now().Unix()
+	}
+
 	return registryChallenge{
-		Realm:   getValue(authStr, "realm"),
-		Service: getValue(authStr, "service"),
-		Scope:   getValue(authStr, "scope"),
+		Realm:     getValue(authStr, "realm"),
+		Service:   getValue(authStr, "service"),
+		Scope:     getValue(authStr, "scope"),
+		Timestamp: time.Unix(s, 0),
 	}
 }