|
1 | 1 | package desktop |
2 | 2 |
|
3 | | -import ( |
4 | | - "context" |
5 | | - "log/slog" |
6 | | - "os" |
7 | | - "os/exec" |
8 | | - "time" |
9 | | - |
10 | | - "github.com/golang-jwt/jwt/v5" |
11 | | -) |
| 3 | +import "context" |
12 | 4 |
|
13 | 5 | type DockerHubInfo struct { |
14 | 6 | Username string `json:"id"` |
15 | 7 | Email string `json:"email,omitempty"` |
16 | 8 | } |
17 | 9 |
|
18 | 10 | func GetToken(ctx context.Context) string { |
19 | | - token := fetchToken(ctx) |
20 | | - |
21 | | - if token == "" || !isTokenExpired(token) { |
22 | | - return token |
23 | | - } |
24 | | - |
25 | | - if os.Getenv("EXPERIMENTAL_DOCKER_TOKEN_REFRESH") != "1" { |
26 | | - return token |
27 | | - } |
28 | | - |
29 | | - slog.Debug("Token expired, attempting docker login to refresh") |
30 | | - if err := runDockerLogin(ctx); err != nil { |
31 | | - slog.Debug("docker login failed", "error", err) |
32 | | - return token |
33 | | - } |
34 | | - |
35 | | - slog.Debug("docker login succeeded, fetching new token") |
36 | | - return fetchToken(ctx) |
37 | | -} |
38 | | - |
39 | | -func fetchToken(ctx context.Context) string { |
40 | 11 | var token string |
41 | 12 | _ = ClientBackend.Get(ctx, "/registry/token", &token) |
42 | 13 | return token |
43 | 14 | } |
44 | 15 |
|
45 | | -func isTokenExpired(token string) bool { |
46 | | - parsed, _, err := jwt.NewParser().ParseUnverified(token, jwt.MapClaims{}) |
47 | | - if err != nil { |
48 | | - slog.Debug("Failed to parse JWT", "error", err) |
49 | | - return false |
50 | | - } |
51 | | - |
52 | | - exp, err := parsed.Claims.GetExpirationTime() |
53 | | - if err != nil || exp == nil { |
54 | | - slog.Debug("Failed to get expiration time from JWT", "error", err) |
55 | | - return false |
56 | | - } |
57 | | - |
58 | | - return exp.Before(time.Now()) |
59 | | -} |
60 | | - |
61 | | -func runDockerLogin(ctx context.Context) error { |
62 | | - cmd := exec.CommandContext(ctx, "docker", "login") |
63 | | - cmd.Stdin = os.Stdin |
64 | | - cmd.Stdout = os.Stdout |
65 | | - cmd.Stderr = os.Stderr |
66 | | - return cmd.Run() |
67 | | -} |
68 | | - |
69 | 16 | func GetUserInfo(ctx context.Context) DockerHubInfo { |
70 | 17 | var info DockerHubInfo |
71 | 18 | _ = ClientBackend.Get(ctx, "/registry/username", &info) |
|
0 commit comments