Skip to content

Commit fef47e2

Browse files
author
Jaydn
committed
Add read button to stop link previewers breaking, fix xss in notes
1 parent 57eaa74 commit fef47e2

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

handlers.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,31 @@ func HealthStatusHandler(w http.ResponseWriter, r *http.Request) {
5050

5151
// ReadNoteHandler print encrypted data for client-side decrypt and destroy note.
5252
func ReadNoteHandler(s *Server) http.Handler {
53+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
54+
vars := mux.Vars(r)
55+
raw, _ := base64.RawURLEncoding.DecodeString(vars["id"])
56+
id, err := uuid.FromBytes(raw)
57+
if err != nil {
58+
http.NotFound(w, r)
59+
return
60+
}
61+
62+
n := &Note{UUID: id}
63+
64+
// Get encrypted n or return 404
65+
err = s.db.Select(n)
66+
if err != nil {
67+
http.NotFound(w, r)
68+
return
69+
}
70+
71+
// Render "ready" template to user
72+
s.renderTemplate(w, "note.html", nil)
73+
})
74+
}
75+
76+
// ReadRawNoteHandler print encrypted data for client-side decrypt and destroy note.
77+
func ReadRawNoteHandler(s *Server) http.Handler {
5378
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
5479
vars := mux.Vars(r)
5580
raw, _ := base64.RawURLEncoding.DecodeString(vars["id"])
@@ -73,7 +98,8 @@ func ReadNoteHandler(s *Server) http.Handler {
7398
}()
7499

75100
// Print encrypted n to user
76-
s.renderTemplate(w, "note.html", string(n.Data))
101+
//s.renderTemplate(w, "note.html", string(n.Data))
102+
w.Write(n.Data)
77103
})
78104
}
79105

public/main.js

+23-8
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,28 @@ $(document).ready(function() {
6060
});
6161

6262
// Show decrypted secret note
63-
if($("#secret_note").length > 0){
64-
let secret = window.location.hash.substring(1);
65-
let cipherText = $("#secret_note").text();
66-
let decrypted = sjcl.decrypt(secret, cipherText);
67-
$("#secret_note").html(decrypted);
68-
$("#secret_note").removeClass("hidden");
69-
}
63+
$("button#fetch-and-decrypt-button").click(function(event) {
64+
$("button#fetch-and-decrypt-button").addClass("disabled");
65+
$.ajax({
66+
url: '/read' + window.location.pathname + window.location.hash,
67+
method: "GET",
68+
xhrFields: {
69+
withCredentials: true
70+
},
71+
success: function(res) {
72+
let secret = window.location.hash.substring(1);
73+
let cipherText = res;
74+
let decrypted = sjcl.decrypt(secret, cipherText);
75+
$("#secret_note").text(decrypted);
76+
$("#secret_note").removeClass("hidden");
77+
$("button#fetch-and-decrypt-button").addClass("hidden");
78+
},
79+
error: function (err) {
80+
window.alert(err.responseText);
81+
$("button#fetch-and-decrypt-button").removeClass("disabled");
82+
}
83+
});
84+
});
7085
});
7186

7287
// Soluiton from https://stackoverflow.com/questions/985272/
@@ -86,4 +101,4 @@ function SelectText(element) {
86101
selection.removeAllRanges();
87102
selection.addRange(range);
88103
}
89-
}
104+
}

server.go

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func (s *Server) Init() {
154154
s.router.HandleFunc("/healthz", HealthStatusHandler).Methods("GET")
155155
s.router.PathPrefix("/public/").HandlerFunc(PublicFileHandler).Methods("GET")
156156
s.router.Handle("/note", CreateNoteHandler(s)).Methods("POST")
157+
s.router.Handle("/read/{id}", ReadRawNoteHandler(s)).Methods("GET")
157158
s.router.Handle("/{id}", ReadNoteHandler(s)).Methods("GET")
158159

159160
// Pre-compile templates

templates/note.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
<label for="secret_note text-danger">
66
This note will be permanently deleted after reading <span class="glyphicon glyphicon-fire text-danger"></span>:
77
</label>
8-
<pre id="secret_note" class="hidden">{{.}}</pre>
8+
<pre id="secret_note" class="hidden"></pre>
99
</div>
1010
<div class="form-group text-center">
11-
<a href="." class="btn btn-lg btn-danger">
11+
<button class="btn btn-lg btn-danger" id="fetch-and-decrypt-button">
1212
<span class="glyphicon glyphicon-fire small"></span>
1313
Read and destroy
14-
</a>
14+
</button>
1515
</div>
1616
{{ end }}

0 commit comments

Comments
 (0)