Skip to content

Commit fe67567

Browse files
committed
Add 'replace files with equal names'
Improve file uploading
1 parent b37191c commit fe67567

7 files changed

Lines changed: 338 additions & 238 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/DataManager-Go/DataManagerServer
33
go 1.14
44

55
require (
6-
github.com/DataManager-Go/libdatamanager v1.3.7
6+
github.com/DataManager-Go/libdatamanager v1.3.8
77
github.com/JojiiOfficial/configService v0.0.0-20200219132202-6e71512e2e28
88
github.com/JojiiOfficial/gaw v1.2.8
99
github.com/JojiiOfficial/shred v1.2.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
22
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3-
github.com/DataManager-Go/libdatamanager v1.3.7 h1:EzS4jlomalvEE8nNZFLFEdUuwZCm1GmlhhY7l0FupQ4=
4-
github.com/DataManager-Go/libdatamanager v1.3.7/go.mod h1:DjxzXo2LkUjUWk6ihkRpdnGkm3jmKC31oNO0KqmgrTc=
3+
github.com/DataManager-Go/libdatamanager v1.3.8 h1:cWMnJqX+4JISVKBobINbbAvSVmEpn78qj96zRVc4KwA=
4+
github.com/DataManager-Go/libdatamanager v1.3.8/go.mod h1:DjxzXo2LkUjUWk6ihkRpdnGkm3jmKC31oNO0KqmgrTc=
55
github.com/JojiiOfficial/configService v0.0.0-20200219132202-6e71512e2e28 h1:nYoIExG+Z/gSLS9Jbpu6lnrh+m6e9gTxQfGhanTsExE=
66
github.com/JojiiOfficial/configService v0.0.0-20200219132202-6e71512e2e28/go.mod h1:j1kHFoYWAbLRPE5nyAAtODwUc0xwd2+ifPZ3uCAgv/g=
77
github.com/JojiiOfficial/gaw v1.2.8 h1:crLd2hrRvTlCClZDtwqnr8AoVKs3uQAk8B2AdOfUCsg=

handlers/FileHandler.go

Lines changed: 0 additions & 226 deletions
Original file line numberDiff line numberDiff line change
@@ -1,246 +1,20 @@
11
package handlers
22

33
import (
4-
"database/sql"
5-
"encoding/base64"
6-
"encoding/json"
74
"io"
85
"net/http"
96
"os"
107
"strconv"
11-
"strings"
128

139
"github.com/DataManager-Go/DataManagerServer/handlers/web"
1410
"github.com/DataManager-Go/DataManagerServer/models"
1511
libdm "github.com/DataManager-Go/libdatamanager"
1612
"github.com/JojiiOfficial/gaw"
17-
"github.com/gabriel-vasile/mimetype"
1813
"github.com/gorilla/mux"
1914
"github.com/h2non/filetype"
20-
log "github.com/sirupsen/logrus"
2115
"gorm.io/gorm"
2216
)
2317

24-
//UploadfileHandler handler for uploading files
25-
func UploadfileHandler(handlerData web.HandlerData, w http.ResponseWriter, r *http.Request) error {
26-
var request libdm.UploadRequestStruct
27-
28-
// Get data from header
29-
requestData := r.Header.Get(libdm.HeaderRequest)
30-
if len(requestData) == 0 {
31-
return RErrBadRequest
32-
}
33-
34-
// Decode header base64
35-
rBaseBytes, err := base64.StdEncoding.DecodeString(requestData)
36-
if err != nil {
37-
return RErrBadRequest
38-
}
39-
40-
// Parse json from request header
41-
err = json.Unmarshal(rBaseBytes, &request)
42-
if err != nil {
43-
return RErrBadRequest
44-
}
45-
46-
// Check requested encryption type
47-
if len(request.Encryption) > 0 && !libdm.IsValidCipher(request.Encryption) {
48-
return RErrNotSupported.Prepend("Encryption")
49-
}
50-
51-
// Validating request, for desired upload Type
52-
switch request.UploadType {
53-
case libdm.FileUploadType:
54-
{
55-
// Check if user is allowed to upload files
56-
if !handlerData.User.CanUploadFiles() {
57-
return RErrNotAllowed.Append("to upload files")
58-
}
59-
}
60-
case libdm.URLUploadType:
61-
{
62-
// Check if user is allowed to upload URLs
63-
if !handlerData.User.AllowedToUploadURLs() {
64-
return RErrNotAllowed.Append("to upload URLs")
65-
}
66-
67-
// Check if url is set and valid
68-
if len(request.URL) == 0 || !isValidHTTPURL(request.URL) {
69-
return RErrMissing.Append("or malformed URL")
70-
}
71-
}
72-
default:
73-
{
74-
// Send error if UploadType was not found
75-
return RErrInvalid.Append("upload type")
76-
}
77-
}
78-
79-
var namespace *models.Namespace
80-
var file *models.File
81-
var replaceMode bool
82-
83-
if request.ReplaceFile > 0 {
84-
replaceMode = true
85-
86-
// Find file
87-
file, err = models.FindFile(handlerData.Db, request.ReplaceFile, handlerData.User.ID)
88-
if err != nil || file == nil || file.Namespace == nil {
89-
return RErrNotFound.Prepend("File")
90-
}
91-
92-
// Use new name if set
93-
if len(request.Name) > 0 {
94-
file.Name = request.Name
95-
}
96-
97-
// Select namespace
98-
if len(request.Attributes.Namespace) > 0 {
99-
// Find namespace specified by client
100-
namespace = models.FindNamespace(handlerData.Db, request.Attributes.Namespace, handlerData.User)
101-
file.Namespace = namespace
102-
} else {
103-
namespace = file.Namespace
104-
}
105-
} else {
106-
if len(request.Name) == 0 {
107-
request.Name = gaw.RandString(25)
108-
}
109-
110-
// Select namespace
111-
namespace = models.FindNamespace(handlerData.Db, request.Attributes.Namespace, handlerData.User)
112-
113-
// Generate file
114-
file = &models.File{
115-
Namespace: namespace,
116-
Name: request.Name,
117-
}
118-
119-
// Pick a random, not already used name for file
120-
if !file.SetUniqueFilename(handlerData.Db) {
121-
sendServerError(w)
122-
return nil
123-
}
124-
}
125-
126-
// Check if namespace is valid and user has access to it
127-
if !handleNamespaceErorrs(namespace, handlerData.User, w) {
128-
return nil
129-
}
130-
131-
// Set Tags, Groups and encryption
132-
if len(request.Attributes.Tags) > 0 {
133-
file.Tags = models.TagsFromStringArr(request.Attributes.Tags, *namespace, handlerData.User)
134-
}
135-
if len(request.Attributes.Groups) > 0 {
136-
file.Groups = models.GroupsFromStringArr(request.Attributes.Groups, *namespace, handlerData.User)
137-
}
138-
file.SetEncryption(request.Encryption)
139-
140-
if request.Public {
141-
// Determine public name
142-
publicName := request.PublicName
143-
if len(publicName) == 0 {
144-
publicName = gaw.RandString(25)
145-
}
146-
147-
// Set file public name
148-
file.PublicFilename = sql.NullString{
149-
String: publicName,
150-
Valid: true,
151-
}
152-
file.IsPublic = true
153-
154-
// Check if public name already exists
155-
_, found, _ := models.GetPublicFile(handlerData.Db, publicName)
156-
if found {
157-
return RErrAlreadyExists.Prepend("public name")
158-
}
159-
}
160-
161-
// Create local file
162-
localFile := handlerData.Config.GetStorageFile(file.LocalName)
163-
f, err := os.Create(localFile)
164-
if err != nil {
165-
return err
166-
}
167-
168-
// Read from the desired source (file/url)
169-
switch request.UploadType {
170-
case libdm.FileUploadType:
171-
{
172-
// Read requestd file
173-
size, checksum, err := readMultipartToFile(f, r.Body, w)
174-
175-
// Close file and log error only
176-
LogError(f.Close())
177-
178-
// success is false if the calculated
179-
// and provided hash are not equal
180-
if err != nil {
181-
// Only shredder file if not in replace mode
182-
if request.ReplaceFile == 0 {
183-
go models.ShredderFile(localFile, -1)
184-
}
185-
186-
// If error is a timeout error, send timeout error and close connectio
187-
if err == http.ErrHandlerTimeout {
188-
err = RErrTimeout
189-
}
190-
191-
return err
192-
}
193-
194-
file.FileSize = size
195-
file.Checksum = checksum
196-
}
197-
case libdm.URLUploadType:
198-
{
199-
// Read from HTTP request
200-
status, err := downloadHTTP(handlerData.User, request.URL, f, file)
201-
if err != nil {
202-
return RErrBadRequest.Prepend(err.Error())
203-
}
204-
205-
// Check statuscode
206-
if status > 299 || status < 200 {
207-
return NewRequestError("Non HTTP OK response: "+strconv.Itoa(status), http.StatusBadRequest)
208-
}
209-
}
210-
}
211-
212-
// Detect mime type
213-
mime, err := mimetype.DetectFile(handlerData.Config.GetStorageFile(file.LocalName))
214-
if err != nil {
215-
log.Info("Can't detect mime: ", err.Error())
216-
} else {
217-
file.FileType = strings.Split(mime.String(), ";")[0]
218-
}
219-
220-
if replaceMode {
221-
// Update file
222-
err = file.Save(handlerData.Db)
223-
} else {
224-
// Insert file to DB
225-
err = file.Insert(handlerData.Db, handlerData.User)
226-
}
227-
228-
if err != nil {
229-
return err
230-
}
231-
232-
sendResponse(w, libdm.ResponseSuccess, "", libdm.UploadResponse{
233-
FileID: file.ID,
234-
Filename: file.Name,
235-
PublicFilename: file.PublicFilename.String,
236-
Checksum: file.Checksum,
237-
FileSize: file.FileSize,
238-
Namespace: namespace.Name,
239-
})
240-
241-
return nil
242-
}
243-
24418
// ListFilesHandler handler for listing files
24519
func ListFilesHandler(handlerData web.HandlerData, w http.ResponseWriter, r *http.Request) error {
24620
var request libdm.FileListRequest

0 commit comments

Comments
 (0)