|
4 | 4 | "crypto/rand" |
5 | 5 | "encoding/hex" |
6 | 6 | "fmt" |
| 7 | + "log" |
7 | 8 | "net" |
8 | 9 | "net/http" |
9 | 10 | "qpi/internal/config" |
@@ -58,6 +59,50 @@ func getCurrentUser(re *core.RequestEvent) (*db.User, error) { |
58 | 59 | return &user, nil |
59 | 60 | } |
60 | 61 |
|
| 62 | + if re.HasSuperuserAuth() && re.Auth != nil { |
| 63 | + usersCol, err := re.App.FindCollectionByNameOrId("users") |
| 64 | + if err != nil { |
| 65 | + return nil, re.Error(http.StatusInternalServerError, "users collection not found", err) |
| 66 | + } |
| 67 | + |
| 68 | + record, err := re.App.FindFirstRecordByData("users", "email", re.Auth.Email()) |
| 69 | + if err != nil { |
| 70 | + // Proxy user does not exist, so create one for superuser |
| 71 | + record = core.NewRecord(usersCol) |
| 72 | + // Let PocketBase auto-generate the ID |
| 73 | + record.Set("email", re.Auth.Email()) |
| 74 | + username := re.Auth.Id |
| 75 | + if len(username) > 5 { |
| 76 | + username = username[:5] |
| 77 | + } |
| 78 | + record.Set("username", "admin_" + username) |
| 79 | + record.Set("qpu_seconds", 999999999.0) |
| 80 | + |
| 81 | + if err := re.App.SaveNoValidate(record); err != nil { |
| 82 | + log.Printf("Failed to create proxy user: %v", err) |
| 83 | + return nil, re.Error(http.StatusInternalServerError, "failed to provision proxy user", err) |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + var user db.User |
| 88 | + err = user.RefreshFromRecord(record) |
| 89 | + if err != nil { |
| 90 | + return nil, err |
| 91 | + } |
| 92 | + |
| 93 | + // Ensure superuser has practically infinite QPU seconds |
| 94 | + if user.QPUSeconds < 999999999.0 { |
| 95 | + record.Set("qpu_seconds", 999999999.0) |
| 96 | + if err := re.App.SaveNoValidate(record); err != nil { |
| 97 | + log.Printf("Failed to update proxy user quota: %v", err) |
| 98 | + return nil, re.Error(http.StatusInternalServerError, "failed to update proxy user quota", err) |
| 99 | + } |
| 100 | + user.QPUSeconds = 999999999.0 |
| 101 | + } |
| 102 | + |
| 103 | + return &user, nil |
| 104 | + } |
| 105 | + |
61 | 106 | token := getToken(re) |
62 | 107 | user, err := db.GetUserByToken(re.App, token) |
63 | 108 | if err != nil { |
|
0 commit comments