11package main
22
33import (
4- "encoding/base64"
54 "encoding/json"
65 "flag"
76 "fmt"
87 "github.com/dustin/go-humanize"
9- _ "github.com/kamilkabir9/LDrop/statik" // TODO : Replace with the absolute import path
8+ _ "github.com/kamilkabir9/LDrop/statik" // NOTE : Replace with the absolute import path
109 "github.com/mdp/qrterminal"
1110 "github.com/rakyll/statik/fs"
1211 "github.com/skratchdot/open-golang/open"
@@ -22,6 +21,8 @@ import (
2221 "strings"
2322 "sync"
2423 "time"
24+ "crypto/md5"
25+ "encoding/hex"
2526)
2627
2728const (
@@ -146,19 +147,12 @@ var ignoreHiddenFilesFlag bool
146147var verboseFlag bool
147148var err error
148149var secretFlag string
149-
150+ var secretFlagMD5 string
150151func checkSecret (secretEncoded string ) bool {
151- fmt .Println ("got:" , secretEncoded )
152- secretByte , err := base64 .URLEncoding .DecodeString (secretEncoded )
153- if err != nil {
154- log .Println (err )
155- }
156- secretRecvd := string (secretByte )
157- if secretRecvd == secretFlag {
158- fmt .Printf ("Passed %v==%v" , secretRecvd , secretFlag )
152+ if secretEncoded == secretFlagMD5 {
159153 return true
160154 }
161- fmt .Printf ( " Failed %v=!%v !!!!!!" , secretRecvd , secretFlag )
155+ verbose ( fmt .Sprintf ( "Secret Failed %v=!%v !!!!!!" , secretEncoded , secretFlagMD5 ) )
162156 return false
163157}
164158func main () {
@@ -180,6 +174,9 @@ func main() {
180174 verbose = func (s string ) {
181175 }
182176 }
177+ hasher := md5 .New ()
178+ hasher .Write ([]byte (secretFlag ))
179+ secretFlagMD5 = hex .EncodeToString (hasher .Sum (nil ))
183180 uploadFolder , err = filepath .Abs (uploadFolder )
184181 if err != nil {
185182 log .Panicln (err )
@@ -190,11 +187,11 @@ func main() {
190187 }
191188 http .HandleFunc ("/viewFile/" , viewFileHandler )
192189 http .Handle ("/" , http .FileServer (statikFS ))
193- http .HandleFunc ("/upload" , upLoadHandler )
194- http .HandleFunc ("/getLastFile" , getLastFileHandler )
195- http .HandleFunc ("/getAllFiles" , getAllFilesHandler )
196- http .HandleFunc ("/getFile/" , getFileHandler )
197- http .HandleFunc ("/downLoadFile/" , serveThisFileHandler )
190+ http .HandleFunc ("/upload" , upLoadHandler ) //api
191+ http .HandleFunc ("/getLastFile" , getLastFileHandler ) //api
192+ http .HandleFunc ("/getAllFiles" , getAllFilesHandler ) //api
193+ http .HandleFunc ("/getFile/" , getFileHandler ) //api
194+ http .HandleFunc ("/downLoadFile/" , serveThisFileHandler ) //api
198195
199196 //Adapted from https://stackoverflow.com/questions/43424787/how-to-use-next-available-port-in-http-listenandserve
200197 listener , err := net .Listen ("tcp" , ":0" )
@@ -246,14 +243,18 @@ func UploadStatusJson(status string, desc string) string {
246243func upLoadHandler (w http.ResponseWriter , r * http.Request ) {
247244
248245 verbose (fmt .Sprintln ("Downloading File....." ))
249-
250246 file , fileHeader , err := r .FormFile ("fileUpload" )
251247 if err != nil {
252248 log .Println (err )
253249 result := UploadStatusJson (FailedStatus , fmt .Sprint (err ))
254250 fmt .Fprint (w , result )
255251 return
256252 }
253+ if ! checkSecret (r .Header .Get ("secret" )) {
254+ result := UploadStatusJson (FailedStatus , fmt .Sprintf ("Error Uploading file %v. Secret mismatch !!!" , fileHeader .Filename ))
255+ fmt .Fprint (w , result )
256+ return
257+ }
257258
258259 if _ , err := os .Stat (uploadFolder ); os .IsNotExist (err ) {
259260 os .Mkdir (uploadFolder , 0777 )
@@ -309,6 +310,12 @@ func getUniqFileName(filename string) string {
309310}
310311
311312func getLastFileHandler (w http.ResponseWriter , r * http.Request ) {
313+ if ! checkSecret (r .Header .Get ("secret" )) {
314+ verbose ("Got wrong secret from client" )
315+ result := UploadStatusJson (FailedStatus , fmt .Sprintf ("Error getting last file. Secret mismatch !!!" ))
316+ fmt .Fprint (w , result )
317+ return
318+ }
312319 fileList := getAllFiles ()
313320 lastFile := fileList [0 ]
314321 for _ , file := range fileList {
@@ -384,8 +391,10 @@ func getAllFilesConcurrent(Dir string, fileNamesWithTime *[]fileInfo) {
384391
385392func getAllFilesHandler (w http.ResponseWriter , r * http.Request ) {
386393 verbose (fmt .Sprint ("getting All files.." ))
387- if ! checkSecret (r .Header .Get ("secret" )){
394+ if ! checkSecret (r .Header .Get ("secret" )) {
388395 verbose ("Got wrong secret from client" )
396+ result := UploadStatusJson (FailedStatus , "secret mismatch" )
397+ fmt .Fprintln (w , result )
389398 return
390399 }
391400 var fileNamesWithTime = getAllFiles ()
@@ -402,25 +411,63 @@ func getAllFilesHandler(w http.ResponseWriter, r *http.Request) {
402411}
403412
404413func getFileHandler (w http.ResponseWriter , r * http.Request ) {
405- fileName := r .URL .Path
406- fileName = strings .Replace (fileName , "/getFile/" , "" , - 1 )
407- fileName , err := url .QueryUnescape (fileName )
414+ u , err := url .ParseQuery (r .URL .RawQuery )
415+ if err != nil {
416+ panic (err )
417+ }
418+ fileName := u ["fileName" ][0 ]
419+ if fileName == "" {
420+ verbose ("Error getting file name !!!" )
421+ fmt .Fprint (w , fmt .Sprintf ("Error getting file name from URL !!!" ))
422+ return
423+ }
424+ fileName , err = url .QueryUnescape (fileName )
408425 if err != nil {
409426 log .Println (err )
410427 }
411- log .Println (fileName )
428+ secretRcvd := u ["secret" ][0 ]
429+ if secretRcvd == "" {
430+ verbose ("Error getting file name !!!" )
431+ fmt .Fprint (w , fmt .Sprintf ("Error getting secret URL !!!" ))
432+ return
433+ }
434+ if ! checkSecret (secretRcvd ) {
435+ verbose ("Got wrong secret from client" )
436+ fmt .Fprint (w , fmt .Sprintf ("Error getting file:%v. Secret mismatch !!!" , fileName ))
437+ return
438+ }
412439 verbose (fmt .Sprintln ("getting File : " , fileName ))
413440 http .ServeFile (w , r , path .Join (uploadFolder , fileName ))
414441 //http.ServeContent(w, r, path.Join(uploadFolder, fileName))
415442
416443}
417444func serveThisFileHandler (w http.ResponseWriter , r * http.Request ) {
418- fileName := r .URL .Path
419- fileName = strings .Replace (fileName , "/downLoadFile/" , "" , - 1 )
420- fileName , err := url .QueryUnescape (fileName )
445+ u , err := url .ParseQuery (r .URL .RawQuery )
446+ if err != nil {
447+ panic (err )
448+ }
449+ fileName := u ["fileName" ][0 ]
450+ if fileName == "" {
451+ verbose ("Error getting file name !!!" )
452+ fmt .Fprint (w , fmt .Sprintf ("Error getting file name from URL !!!" ))
453+ return
454+ }
455+ fileName , err = url .QueryUnescape (fileName )
421456 if err != nil {
422457 log .Println (err )
423458 }
459+ secretRcvd := u ["secret" ][0 ]
460+ if secretRcvd == "" {
461+ verbose ("Error getting file name !!!" )
462+ fmt .Fprint (w , fmt .Sprintf ("Error getting secret URL !!!" ))
463+ return
464+ }
465+ if ! checkSecret (secretRcvd ) {
466+ verbose ("Got wrong secret from client" )
467+ result := UploadStatusJson (FailedStatus , fmt .Sprintf ("Error getting file:%v. Secret mismatch !!!" , fileName ))
468+ fmt .Fprint (w , result )
469+ return
470+ }
424471 verbose (fmt .Sprintln ("serving File : " , fileName ))
425472 //Adapted from https://stackoverflow.com/questions/31638447/how-to-server-a-file-from-a-handler-in-golang
426473 w .Header ().Set ("Content-Description" , "File Transfer" )
0 commit comments