Skip to content

Commit b314fa3

Browse files
committed
Fixed logs for file requests and fixed some tests
1 parent 315fb51 commit b314fa3

File tree

10 files changed

+69
-57
lines changed

10 files changed

+69
-57
lines changed

internal/logging/Logging.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,17 @@ func LogEdit(file models.File, user models.User) {
126126

127127
// LogCreateFileRequest adds a log entry when a file request was added. Non-Blocking
128128
func LogCreateFileRequest(fr models.FileRequest, user models.User) {
129-
createLogEntry(categoryEdit, fmt.Sprintf("File request #%d %s created by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
129+
createLogEntry(categoryEdit, fmt.Sprintf("File request %s (%s) created by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
130130
}
131131

132132
// LogEditFileRequest adds a log entry when a file request was edited. Non-Blocking
133133
func LogEditFileRequest(fr models.FileRequest, user models.User) {
134-
createLogEntry(categoryEdit, fmt.Sprintf("File request #%d %s created by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
134+
createLogEntry(categoryEdit, fmt.Sprintf("File request %s (%s) created by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
135135
}
136136

137137
// LogDeleteFileRequest adds a log entry when a file request was deleted. Non-Blocking
138138
func LogDeleteFileRequest(fr models.FileRequest, user models.User) {
139-
createLogEntry(categoryEdit, fmt.Sprintf("File request #%d %s and associated files deleted by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
139+
createLogEntry(categoryEdit, fmt.Sprintf("File request %s (%s) and associated files deleted by %s (user #%d)", fr.Id, fr.Name, user.Name, user.Id), false)
140140
}
141141

142142
// LogReplace adds a log entry when an upload was replaced. Non-Blocking

internal/models/ApiKey_test.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -127,21 +127,6 @@ func TestApiPermAllNoApiMod(t *testing.T) {
127127
}
128128
}
129129

130-
func TestApiPermAll(t *testing.T) {
131-
key := &ApiKey{}
132-
key.GrantPermission(ApiPermAll)
133-
if !key.HasPermission(ApiPermView) ||
134-
!key.HasPermission(ApiPermUpload) ||
135-
!key.HasPermission(ApiPermDelete) ||
136-
!key.HasPermission(ApiPermApiMod) ||
137-
!key.HasPermission(ApiPermEdit) ||
138-
!key.HasPermission(ApiPermReplace) ||
139-
!key.HasPermission(ApiPermManageUsers) ||
140-
!key.HasPermission(ApiPermManageLogs) {
141-
t.Errorf("expected all permissions to be set")
142-
}
143-
}
144-
145130
// Helper function to check only one permission is set
146131
func checkOnlyPermissionSet(t *testing.T, key *ApiKey, perm ApiPermission) {
147132
allPermissions := []struct {

internal/models/FileList_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func TestToJsonResult(t *testing.T) {
3232
UnlimitedTime: true,
3333
PendingDeletion: 100,
3434
}
35-
test.IsEqualString(t, file.ToJsonResult("serverurl/", false), `{"Result":"OK","FileInfo":{"Id":"testId","Name":"testName","Size":"10 B","HotlinkId":"hotlinkid","ContentType":"text/html","ExpireAtString":"2025-06-25 11:48:28","UrlDownload":"serverurl/d?id=testId","UrlHotlink":"","UploadDate":1748180908,"ExpireAt":1750852108,"SizeBytes":10,"DownloadsRemaining":1,"DownloadCount":3,"UnlimitedDownloads":true,"UnlimitedTime":true,"RequiresClientSideDecryption":true,"IsEncrypted":true,"IsEndToEndEncrypted":false,"IsPasswordProtected":true,"IsSavedOnLocalStorage":false,"IsPendingDeletion":true,"UploaderId":2},"IncludeFilename":false}`)
36-
test.IsEqualString(t, file.ToJsonResult("serverurl/", true), `{"Result":"OK","FileInfo":{"Id":"testId","Name":"testName","Size":"10 B","HotlinkId":"hotlinkid","ContentType":"text/html","ExpireAtString":"2025-06-25 11:48:28","UrlDownload":"serverurl/d/testId/testName","UrlHotlink":"","UploadDate":1748180908,"ExpireAt":1750852108,"SizeBytes":10,"DownloadsRemaining":1,"DownloadCount":3,"UnlimitedDownloads":true,"UnlimitedTime":true,"RequiresClientSideDecryption":true,"IsEncrypted":true,"IsEndToEndEncrypted":false,"IsPasswordProtected":true,"IsSavedOnLocalStorage":false,"IsPendingDeletion":true,"UploaderId":2},"IncludeFilename":true}`)
35+
test.IsEqualString(t, file.ToJsonResult("serverurl/", false), `{"Result":"OK","FileInfo":{"Id":"testId","Name":"testName","Size":"10 B","HotlinkId":"hotlinkid","ContentType":"text/html","ExpireAtString":"2025-06-25 11:48:28","UrlDownload":"serverurl/d?id=testId","UrlHotlink":"","FileRequestId":"","UploadDate":1748180908,"ExpireAt":1750852108,"SizeBytes":10,"DownloadsRemaining":1,"DownloadCount":3,"UnlimitedDownloads":true,"UnlimitedTime":true,"RequiresClientSideDecryption":true,"IsEncrypted":true,"IsEndToEndEncrypted":false,"IsPasswordProtected":true,"IsSavedOnLocalStorage":false,"IsPendingDeletion":true,"IsFileRequest":false,"UploaderId":2},"IncludeFilename":false}`)
36+
test.IsEqualString(t, file.ToJsonResult("serverurl/", true), `{"Result":"OK","FileInfo":{"Id":"testId","Name":"testName","Size":"10 B","HotlinkId":"hotlinkid","ContentType":"text/html","ExpireAtString":"2025-06-25 11:48:28","UrlDownload":"serverurl/d/testId/testName","UrlHotlink":"","FileRequestId":"","UploadDate":1748180908,"ExpireAt":1750852108,"SizeBytes":10,"DownloadsRemaining":1,"DownloadCount":3,"UnlimitedDownloads":true,"UnlimitedTime":true,"RequiresClientSideDecryption":true,"IsEncrypted":true,"IsEndToEndEncrypted":false,"IsPasswordProtected":true,"IsSavedOnLocalStorage":false,"IsPendingDeletion":true,"IsFileRequest":false,"UploaderId":2},"IncludeFilename":true}`)
3737
}
3838

3939
func TestIsLocalStorage(t *testing.T) {

internal/models/User_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,5 +249,5 @@ func TestUser_ToJson(t *testing.T) {
249249
Password: "1234",
250250
ResetPassword: true,
251251
}
252-
test.IsEqualString(t, user.ToJson(), `{"id":4,"name":"Test User","permissions":255,"userLevel":1,"lastOnline":1337,"resetPassword":true}`)
252+
test.IsEqualString(t, user.ToJson(), `{"id":4,"name":"Test User","permissions":511,"userLevel":1,"lastOnline":1337,"resetPassword":true}`)
253253
}

internal/storage/FileServing_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ func TestServeFile(t *testing.T) {
554554
test.IsEqualBool(t, result, true)
555555
r := httptest.NewRequest("GET", "/", nil)
556556
w := httptest.NewRecorder()
557-
ServeFile(file, w, r, true)
557+
ServeFile(file, w, r, true, true)
558558
_, result = GetFile(idNewFile)
559559
test.IsEqualBool(t, result, false)
560560

@@ -575,7 +575,7 @@ func TestServeFile(t *testing.T) {
575575
w = httptest.NewRecorder()
576576
file, result = GetFile("awsTest1234567890123")
577577
test.IsEqualBool(t, result, true)
578-
ServeFile(file, w, r, false)
578+
ServeFile(file, w, r, false, true)
579579
if aws.IsMockApi {
580580
test.ResponseBodyContains(t, w, "https://redirect.url")
581581
} else {
@@ -600,7 +600,7 @@ func TestServeFile(t *testing.T) {
600600
file.Encryption.Nonce = nonce
601601
r = httptest.NewRequest("GET", "/", nil)
602602
w = httptest.NewRecorder()
603-
ServeFile(file, w, r, true)
603+
ServeFile(file, w, r, true, true)
604604
test.ResponseBodyContains(t, w, "Error decrypting file")
605605
}
606606

internal/storage/filesystem/s3filesystem/aws/Aws_mock.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ package aws
55
import (
66
"bytes"
77
"errors"
8-
"github.com/forceu/gokapi/internal/models"
98
"io"
109
"net/http"
1110
"os"
1211
"strconv"
1312
"strings"
13+
14+
"github.com/forceu/gokapi/internal/models"
1415
)
1516

1617
var uploadedFiles []models.File
@@ -199,3 +200,20 @@ func IsCorsCorrectlySet(bucket, gokapiUrl string) (bool, error) {
199200
func GetDefaultBucketName() string {
200201
return bucketName
201202
}
203+
204+
// Stream downloads a file from AWS sequentially, used for saving to a Zip file
205+
func Stream(writer io.Writer, file models.File) (int64, error) {
206+
if !isValidCredentials() {
207+
return 0, errors.New("invalid credentials / invalid bucket / invalid region")
208+
}
209+
210+
if isUploaded(file) {
211+
data, err := os.Open("data/" + file.SHA1)
212+
if err != nil {
213+
return 0, err
214+
}
215+
defer data.Close()
216+
return io.Copy(writer, data)
217+
}
218+
return 0, errors.New("file not found")
219+
}

internal/storage/filesystem/s3filesystem/aws/Aws_slim.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ package aws
44

55
import (
66
"errors"
7-
"github.com/forceu/gokapi/internal/models"
87
"io"
98
"net/http"
9+
10+
"github.com/forceu/gokapi/internal/models"
1011
)
1112

1213
const errorString = "AWS not supported in this build"
@@ -82,3 +83,8 @@ func IsCorsCorrectlySet(bucket, gokapiUrl string) (bool, error) {
8283
func GetDefaultBucketName() string {
8384
return ""
8485
}
86+
87+
// Stream downloads a file from AWS sequentially, used for saving to a Zip file
88+
func Stream(writer io.Writer, file models.File) (int64, error) {
89+
return 0, errors.New(errorString)
90+
}

internal/test/testconfiguration/TestConfiguration.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,36 +262,36 @@ func writeApiKeys() {
262262
database.SaveApiKey(models.ApiKey{
263263
Id: "validkey",
264264
FriendlyName: "First Key",
265-
Permissions: models.ApiPermAll, // TODO
265+
Permissions: models.ApiPermNone,
266266
UserId: 5,
267267
PublicId: "taiyeo6uLie6nu6eip0ieweiM5mahv",
268268
})
269269
database.SaveApiKey(models.ApiKey{
270270
Id: "validkeyid7",
271271
FriendlyName: "Key for uid 7",
272-
Permissions: models.ApiPermAll, // TODO
272+
Permissions: models.ApiPermNone,
273273
UserId: 7,
274274
PublicId: "vu0eemi8eehaisuth3pahDai2eo6ze",
275275
})
276276
database.SaveApiKey(models.ApiKey{
277277
Id: "GAh1IhXDvYnqfYLazWBqMB9HSFmNPO",
278278
FriendlyName: "Second Key",
279279
LastUsed: 1620671580,
280-
Permissions: models.ApiPermAll, // TODO
280+
Permissions: models.ApiPermNone,
281281
UserId: 5,
282282
PublicId: "yaeVohng1ohNohsh1vailizeil5ka5",
283283
})
284284
database.SaveApiKey(models.ApiKey{
285285
Id: "jiREglQJW0bOqJakfjdVfe8T1EM8n8",
286286
FriendlyName: "Unnamed Key",
287-
Permissions: models.ApiPermAll, // TODO
287+
Permissions: models.ApiPermNone,
288288
UserId: 5,
289289
PublicId: "ahYie4ophoo5OoGhahCe1neic6thah",
290290
})
291291
database.SaveApiKey(models.ApiKey{
292292
Id: "okeCMWqhVMZSpt5c1qpCWhKvJJPifb",
293293
FriendlyName: "Unnamed Key",
294-
Permissions: models.ApiPermAll, // TODO
294+
Permissions: models.ApiPermNone,
295295
UserId: 5,
296296
PublicId: "ugoo0roowoanahthei7ohSail5OChu",
297297
})

internal/webserver/api/Api_test.go

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ func generateTestData() {
7373
Id: idApiKeyAdmin,
7474
PublicId: idApiKeyAdmin,
7575
FriendlyName: "Admin",
76-
Permissions: models.ApiPermAll,
76+
Permissions: models.ApiPermNone,
7777
UserId: idAdmin,
7878
})
7979
database.SaveApiKey(models.ApiKey{
8080
Id: idApiKeySuperAdmin,
8181
PublicId: idPublicApiKeySuperAdmin,
8282
FriendlyName: "SuperAdmin",
83-
Permissions: models.ApiPermAll,
83+
Permissions: models.ApiPermNone,
8484
UserId: idSuperAdmin,
8585
})
8686
database.SaveMetaData(models.File{
@@ -120,7 +120,6 @@ func getRecorderWithBody(url, apikey, method string, headers []test.Header, body
120120
}
121121

122122
func testAuthorisation(t *testing.T, url string, requiredPermission models.ApiPermission) models.ApiKey {
123-
t.Helper()
124123
w, r := getRecorder(url, "", []test.Header{{}})
125124
Process(w, r)
126125
test.IsEqualBool(t, w.Code != 200, true)
@@ -131,13 +130,13 @@ func testAuthorisation(t *testing.T, url string, requiredPermission models.ApiPe
131130
test.IsEqualBool(t, w.Code != 200, true)
132131
test.ResponseBodyContains(t, w, `{"Result":"error","ErrorMessage":"Unauthorized"}`)
133132

134-
newApiKeyUser := generateNewKey(false, idUser, "")
133+
newApiKeyUser := generateNewKey(false, idUser, "", "")
135134
w, r = getRecorder(url, newApiKeyUser.Id, []test.Header{{}})
136135
Process(w, r)
137136
test.IsEqualBool(t, w.Code != 200, true)
138137
test.ResponseBodyContains(t, w, `{"Result":"error","ErrorMessage":"Unauthorized"}`)
139138

140-
for _, permission := range getAvailableApiPermissions(t) {
139+
for _, permission := range getAvailableApiPermissions() {
141140
if permission == requiredPermission {
142141
continue
143142
}
@@ -148,7 +147,7 @@ func testAuthorisation(t *testing.T, url string, requiredPermission models.ApiPe
148147
test.ResponseBodyContains(t, w, `{"Result":"error","ErrorMessage":"Unauthorized"}`)
149148
removePermissionApikey(t, newApiKeyUser.Id, permission)
150149
}
151-
newApiKeyUser.Permissions = models.ApiPermAll
150+
newApiKeyUser.Permissions = getPermissionAll()
152151
newApiKeyUser.RemovePermission(requiredPermission)
153152
database.SaveApiKey(newApiKeyUser)
154153
w, r = getRecorder(url, newApiKeyUser.Id, []test.Header{{}})
@@ -432,7 +431,7 @@ func testDeleteUserCall(t *testing.T, apiKey string, mode int) {
432431
database.SaveSession("sessionApiDelete", session)
433432
_, ok = database.GetSession("sessionApiDelete")
434433
test.IsEqualBool(t, ok, true)
435-
userApiKey := generateNewKey(false, retrievedUser.Id, "")
434+
userApiKey := generateNewKey(false, retrievedUser.Id, "", "")
436435
_, ok = database.GetApiKey(userApiKey.Id)
437436
test.IsEqualBool(t, ok, true)
438437
testFile := models.File{
@@ -699,16 +698,16 @@ func TestIsValidApiKey(t *testing.T) {
699698
test.IsEqualBool(t, ok, true)
700699
test.IsEqualBool(t, key.LastUsed == 0, false)
701700

702-
newApiKey := generateNewKey(false, 5, "")
701+
newApiKey := generateNewKey(false, 5, "", "")
703702
user, _, isValid = isValidApiKey(newApiKey.Id, true, models.ApiPermNone)
704703
test.IsEqualBool(t, isValid, true)
705-
for _, permission := range getAvailableApiPermissions(t) {
704+
for _, permission := range getAvailableApiPermissions() {
706705
_, _, isValid = isValidApiKey(newApiKey.Id, true, permission)
707706
test.IsEqualBool(t, isValid, false)
708707
}
709-
for _, newPermission := range getAvailableApiPermissions(t) {
708+
for _, newPermission := range getAvailableApiPermissions() {
710709
setPermissionApikey(t, newApiKey.Id, newPermission)
711-
for _, permission := range getAvailableApiPermissions(t) {
710+
for _, permission := range getAvailableApiPermissions() {
712711
_, _, isValid = isValidApiKey(newApiKey.Id, true, permission)
713712
test.IsEqualBool(t, isValid, permission == newPermission)
714713
}
@@ -717,7 +716,7 @@ func TestIsValidApiKey(t *testing.T) {
717716
setPermissionApikey(t, newApiKey.Id, models.ApiPermEdit|models.ApiPermDelete)
718717
_, _, isValid = isValidApiKey(newApiKey.Id, true, models.ApiPermEdit)
719718
test.IsEqualBool(t, isValid, true)
720-
_, _, isValid = isValidApiKey(newApiKey.Id, true, models.ApiPermAll)
719+
_, _, isValid = isValidApiKey(newApiKey.Id, true, getPermissionAll())
721720
test.IsEqualBool(t, isValid, false)
722721
_, _, isValid = isValidApiKey(newApiKey.Id, true, models.ApiPermView)
723722
test.IsEqualBool(t, isValid, false)
@@ -736,7 +735,7 @@ func removePermissionApikey(t *testing.T, key string, newPermission models.ApiPe
736735
database.SaveApiKey(apiKey)
737736
}
738737

739-
func getAvailableApiPermissions(t *testing.T) []models.ApiPermission {
738+
func getAvailableApiPermissions() []models.ApiPermission {
740739
result := []models.ApiPermission{
741740
models.ApiPermView,
742741
models.ApiPermUpload,
@@ -745,17 +744,21 @@ func getAvailableApiPermissions(t *testing.T) []models.ApiPermission {
745744
models.ApiPermEdit,
746745
models.ApiPermReplace,
747746
models.ApiPermManageUsers,
748-
models.ApiPermManageLogs}
749-
sum := 0
750-
for _, perm := range result {
751-
sum = sum + int(perm)
752-
}
753-
if sum != int(models.ApiPermAll) {
754-
t.Fatal("List of permissions are incorrect")
747+
models.ApiPermManageLogs,
748+
models.ApiPermManageFileRequests,
749+
models.ApiPermDownload,
755750
}
756751
return result
757752
}
758753

754+
func getPermissionAll() models.ApiPermission {
755+
allPermissions := models.ApiPermNone
756+
for _, permission := range getAvailableApiPermissions() {
757+
allPermissions += permission
758+
}
759+
return allPermissions
760+
}
761+
759762
func getApiPermMap(t *testing.T) map[models.ApiPermission]string {
760763
result := make(map[models.ApiPermission]string)
761764
result[models.ApiPermView] = "PERM_VIEW"
@@ -766,12 +769,14 @@ func getApiPermMap(t *testing.T) map[models.ApiPermission]string {
766769
result[models.ApiPermReplace] = "PERM_REPLACE"
767770
result[models.ApiPermManageUsers] = "PERM_MANAGE_USERS"
768771
result[models.ApiPermManageLogs] = "PERM_MANAGE_LOGS"
772+
result[models.ApiPermManageFileRequests] = "PERM_MANAGE_FILE_REQUESTS"
773+
result[models.ApiPermDownload] = "PERM_DOWNLOAD"
769774

770775
sum := 0
771776
for perm := range result {
772777
sum = sum + int(perm)
773778
}
774-
if sum != int(models.ApiPermAll) {
779+
if sum != int(getPermissionAll()) {
775780
t.Fatal("List of permissions are incorrect")
776781
}
777782

@@ -1291,7 +1296,7 @@ func uploadNewFile(t *testing.T) (models.Result, *bytes.Buffer) {
12911296
test.IsNil(t, err)
12921297
err = writer.Close()
12931298
test.IsNil(t, err)
1294-
newApiKeyUser := generateNewKey(true, idUser, "")
1299+
newApiKeyUser := generateNewKey(true, idUser, "", "")
12951300
w, r := test.GetRecorder("POST", "/api/files/add", nil, []test.Header{{
12961301
Name: "apikey",
12971302
Value: newApiKeyUser.Id,

internal/webserver/web/templates/html_public_upload.tmpl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ const COMPLETE_URL = "./api/chunk/uploadRequestComplete";
1414
const FILE_REQUEST_ID = "{{ .FileRequestId }}";
1515
const API_KEY = "{{ .ApiKey }}";
1616

17-
function generateUUID() {
18-
return crypto.randomUUID();
19-
}
2017

2118
async function startUpload() {
2219
const files = document.getElementById("fileInput").files;
@@ -36,7 +33,7 @@ async function startUpload() {
3633
const progressBar = fileDiv.querySelector("progress");
3734
const progressText = fileDiv.querySelector(".progressText");
3835

39-
const uuid = generateUUID();
36+
const uuid = getUuid();
4037
let offset = 0;
4138

4239
while (offset < file.size) {
@@ -98,6 +95,7 @@ function encodeFilename(name) {
9895
return "base64:" + btoa(unescape(encodeURIComponent(name)));
9996
}
10097
</script>
98+
<script src="./js/min/uuid.min.js"></script>
10199

102100
{{ template "pagename" "PublicUpload"}}
103101
{{ template "customjs" .}}

0 commit comments

Comments
 (0)