Skip to content

Commit 26f1b58

Browse files
committed
md5 hash used as authentication method
1 parent 3ab55ba commit 26f1b58

File tree

7 files changed

+335
-246
lines changed

7 files changed

+335
-246
lines changed

.idea/workspace.xml

Lines changed: 213 additions & 201 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LDrop.go

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package main
22

33
import (
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

2728
const (
@@ -146,19 +147,12 @@ var ignoreHiddenFilesFlag bool
146147
var verboseFlag bool
147148
var err error
148149
var secretFlag string
149-
150+
var secretFlagMD5 string
150151
func 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
}
164158
func 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 {
246243
func 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

311312
func 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

385392
func 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

404413
func 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
}
417444
func 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")

statik/statik.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/favicon.ico

318 Bytes
Binary file not shown.

website/index.html

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
1010
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.11/handlebars.js"></script>
1111
<script src="/js.cookie.js"></script>
12+
<script src="/md5.min.js"></script>
1213
<link rel="stylesheet" href="/bootstrap.min.css" >
1314
<body onload="listFiles()">
1415
<h1>LocalDrop</h1>
@@ -44,14 +45,15 @@ <h1>LocalDrop</h1>
4445
<td>{{this.ModTime}}</td>
4546
<td>{{this.Size}}</td>
4647
<td><a class="btn btn-outline-success" href="/viewFile/{{this.Name}}" role="button">View</a></td>
47-
<td><a class="btn btn-outline-info" href="/downLoadFile/{{this.Name}}" target="_blank" role="button" download >Download</a></td>
48+
<td><a class="btn btn-outline-info" href="/downLoadFile/?secret={{../Secret}}&fileName={{this.Name}}" target="_blank" role="button" download >Download</a></td>
4849
</tr>
4950
{{/each}}
5051
</tbody>
5152
</table>
5253
</div>
5354
</script>
5455
<script>
56+
5557
var getSecret=function(){
5658
var secret=Cookies.get('secret');
5759
if (secret===undefined){
@@ -65,8 +67,9 @@ <h1>LocalDrop</h1>
6567
}
6668
}
6769
secret=Cookies.get('secret');
68-
return secret;
70+
return md5(secret);
6971
};
72+
7073
var upload = function () {
7174
var uploadForm=document.forms.namedItem("uploadForm");
7275
var formData = new FormData(uploadForm);
@@ -87,7 +90,7 @@ <h1>LocalDrop</h1>
8790
}
8891
};
8992
xhr.open('POST', '/upload', true);
90-
xhr.setRequestHeader("secret", "007");
93+
xhr.setRequestHeader("secret", secret);
9194
xhr.send(formData);
9295
};
9396

@@ -96,30 +99,37 @@ <h1>LocalDrop</h1>
9699
var xhr = new XMLHttpRequest();
97100
xhr.onreadystatechange = function() {
98101
if (this.readyState == 4 && this.status == 200) {
99-
var response=JSON.parse(this.responseText);
100-
if (response.Status !=='Ok'){
102+
var response = JSON.parse(this.responseText);
103+
if (response.Status === 'Err' && response.Description === "secret mismatch"){
101104
console.error(response.Status);
105+
var secretPrompt = prompt("Secret mismatch. Please enter secret:", "");
106+
if (secretPrompt == null || secretPrompt === "") {
107+
console.log("plz enter secret !?");
108+
} else {
109+
Cookies.set('secret', secretPrompt);
110+
console.log("set secret as " + secretPrompt);
111+
}
102112
return;
103113
}
104-
var FileTable=JSON.parse(response.Description);
114+
115+
var FileTable = JSON.parse(response.Description);
105116
console.log(FileTable);
106117
var FileTableNode = document.getElementById("FileTable");
107118
while (FileTableNode.hasChildNodes()) {
108119
FileTableNode.removeChild(FileTableNode.lastChild);
109120
}
110-
var source = document.getElementById("fileTableTemplate").innerHTML;
121+
var source = document.getElementById("fileTableTemplate").innerHTML;
111122
var template = Handlebars.compile(source);
112-
var context = {FileTable:FileTable};
113-
var html = template(context);
114-
FileTableNode.innerHTML=html;
115-
}
116-
};
123+
var context = {FileTable: FileTable,Secret:getSecret()};
124+
var html = template(context);
125+
FileTableNode.innerHTML = html;
126+
127+
}};
117128
xhr.open('POST', '/getAllFiles', true);
118-
var secret=btoa(getSecret());
119-
xhr.setRequestHeader("secret", secret);
129+
xhr.setRequestHeader("secret", getSecret());
120130
xhr.send();
121131
};
122-
132+
listFiles();
123133

124134
</script>
125135
</html>

website/md5.min.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/viewFile.html

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
99
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
1010
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.11/handlebars.js"></script>
11+
<script src="/js.cookie.js"></script>
12+
<script src="/md5.min.js"></script>
1113
<link rel="stylesheet" href="/bootstrap.min.css" >
1214
<style>
1315
.col-10 {
@@ -30,13 +32,29 @@ <h2 id="fileName">File: </h2>
3032
</body>
3133
<script>
3234
{{/*TODO add xhr.setRequestHeader("secret", "007"); as url param*/}}
35+
var getSecret=function(){
36+
var secret=Cookies.get('secret');
37+
if (secret===undefined){
38+
console.log("secret not Set !!!!");
39+
var secretPrompt = prompt("Please enter secret:", "007Jb");
40+
if (secretPrompt == null || secretPrompt === "") {
41+
console.log("plz enter secret !?");
42+
} else {
43+
Cookies.set('secret',secretPrompt);
44+
console.log("set secret as "+secretPrompt);
45+
}
46+
}
47+
secret=Cookies.get('secret');
48+
return md5(secret);
49+
};
3350
var requestFile=window.location.pathname;
34-
requestFile=requestFile.replace("/viewFile/","");
3551
requestFile=decodeURI(requestFile);
3652
document.getElementById('fileName').innerHTML+=requestFile;
3753
console.log(requestFile);
38-
document.getElementById('iframe').src="/getFile/"+requestFile;
39-
document.getElementById('download').href="/downLoadFile/"+requestFile;
54+
requestFile=requestFile.replace("/viewFile/","");
55+
// title=Main_page&action=raw
56+
document.getElementById('iframe').src="/getFile/?secret="+getSecret()+"&fileName="+requestFile;
57+
document.getElementById('download').href="/downLoadFile/?secret="+getSecret()+"&fileName="+requestFile;
4058

4159
</script>
4260
</html>

0 commit comments

Comments
 (0)