diff --git a/assets.go b/assets.go
index 877404d..6ba26a1 100644
--- a/assets.go
+++ b/assets.go
@@ -3,11 +3,12 @@ package main
import (
"mime"
"net/http"
+ "path"
"path/filepath"
)
func serveAssets(res http.ResponseWriter, r *http.Request) {
- data, err := Asset(r.RequestURI[1:])
+ data, err := Asset(path.Join("dist", r.RequestURI[1:]))
if err != nil {
http.Error(res, "Not found", http.StatusNotFound)
return
diff --git a/assets/ajax-loader.gif b/assets/ajax-loader.gif
deleted file mode 100644
index cc70a7a..0000000
Binary files a/assets/ajax-loader.gif and /dev/null differ
diff --git a/assets/clipboard.png b/assets/clipboard.png
deleted file mode 100644
index 7a462e1..0000000
Binary files a/assets/clipboard.png and /dev/null differ
diff --git a/assets/clipboard_click.png b/assets/clipboard_click.png
deleted file mode 100644
index df80404..0000000
Binary files a/assets/clipboard_click.png and /dev/null differ
diff --git a/assets/clipboard_hover.png b/assets/clipboard_hover.png
deleted file mode 100644
index 7a462e1..0000000
Binary files a/assets/clipboard_hover.png and /dev/null differ
diff --git a/assets/script.js b/assets/script.js
deleted file mode 100644
index 0a53b78..0000000
--- a/assets/script.js
+++ /dev/null
@@ -1,423 +0,0 @@
-// Generated by CoffeeScript 1.12.4
-(function() {
- var CloudKeys;
-
- CloudKeys = (function() {
- function CloudKeys() {
- this.entities = [];
- this.version = "";
- this.password = '';
- $('#pw').focus().keyup((function(_this) {
- return function(evt) {
- var that = this;
- if (evt.keyCode === 13) {
- _this.password = $(that).val();
- $('#loader').removeClass('hide');
- _this.fetchData();
- $('#newEntityLink').click(function() {
- return _this.showForm();
- });
- $('#editEncPWLink').click(function() {
- return _this.showEditEncPWForm();
- });
- $('#passwordRequest').addClass('hide');
- $('#search').keyup(function() {
- var that = this;
- _this.limitItems(_this.getItems($(that).val()));
- });
- $('#search').focus();
- return $(window).keyup(function(evt) {
- if (evt.altKey === true && evt.keyCode === 66) {
- if (typeof window.copyToClipboard === "function") {
- copyToClipboard($('#items li.active .username').val());
- } else {
- $('#items li.active .username').focus().select();
- }
- }
- if (evt.altKey === true && evt.keyCode === 79) {
- if (typeof window.copyToClipboard === "function") {
- copyToClipboard($('#items li.active .password').data('toggle'));
- } else {
- $('#items li.active .passwordtoggle em').click();
- $('#items li.active .password').focus().select();
- }
- }
- if (evt.altKey === true && evt.keyCode === 80) {
- if (typeof window.copyToClipboard === "function") {
- copyToClipboard($('#items li.active .password').data('toggle'));
- } else {
- $('#items li.active .password').focus().select();
- }
- }
- if (evt.altKey === true && evt.keyCode === 85) {
- if (typeof window.copyToClipboard === "function") {
- return copyToClipboard($('#items li.active .url').val());
- } else {
- return $('#items li.active .url').focus().select();
- }
- }
- });
- }
- };
- })(this));
- }
-
- CloudKeys.prototype["import"] = function(xml) {
- var e, entity, entry, group, j, l, len, len1, parsedXML, ref, ref1, tag;
- parsedXML = $.parseXML(xml);
- ref = $(parsedXML).find('group');
- for (j = 0, len = ref.length; j < len; j++) {
- group = ref[j];
- tag = $(group).find('>title').text();
- ref1 = $(group).find('entry');
- for (l = 0, len1 = ref1.length; l < len1; l++) {
- entry = ref1[l];
- e = $(entry);
- entity = {};
- entity['title'] = e.find('title').text();
- entity['username'] = e.find('username').text();
- entity['password'] = e.find('password').text();
- entity['url'] = e.find('url').text();
- entity['comment'] = e.find('comment').text();
- entity['tags'] = tag;
- this.entities.push(entity);
- }
- }
- return this.updateData((function(_this) {
- return function() {
- $('#import').val('');
- return $('#importLink').click();
- };
- })(this));
- };
-
- CloudKeys.prototype.updateData = function(callback) {
- var encrypted, hash;
- encrypted = this.encrypt(JSON.stringify(this.entities));
- hash = CryptoJS.SHA1(encrypted).toString();
- return $.post('ajax', {
- 'version': this.version,
- 'checksum': hash,
- 'data': encrypted
- }, (function(_this) {
- return function(result) {
- if (result.error === true) {
- return alert("An error occured, please reload and try it again");
- } else {
- if (typeof callback !== "undefined") {
- callback();
- }
- return _this.updateInformation(result);
- }
- };
- })(this), "json");
- };
-
- CloudKeys.prototype.fetchData = function() {
- return $.get('ajax', (function(_this) {
- return function(data) {
- return _this.updateInformation(data);
- };
- })(this), "json");
- };
-
- CloudKeys.prototype.updateInformation = function(data) {
- var e;
- this.version = data.version;
- if (data.data === "") {
- this.entities = [];
- } else {
- try {
- this.entities = $.parseJSON(this.decrypt(data.data));
- } catch (error) {
- e = error;
- window.location.reload();
- }
- }
- this.entities.sort(this.sortItems);
- this.showItems(this.getItems(''));
- return this.limitItems(this.getItems($('#search').val()));
- };
-
- CloudKeys.prototype.encrypt = function(value) {
- return CryptoJS.AES.encrypt(value, this.password).toString();
- };
-
- CloudKeys.prototype.decrypt = function(value) {
- return CryptoJS.AES.decrypt(value, this.password).toString(CryptoJS.enc.Utf8);
- };
-
- CloudKeys.prototype.getClipboardCode = function(value) {
- var cb;
- cb = $('
');
- cb.click(function(e) {
- var elem;
- elem = $("").css({
- 'position': 'absolute',
- 'left': '-9999px',
- 'readonly': 'readonly',
- 'top': (window.pageYOffset || document.documentElement.scrollTop) + 'px'
- });
- $("body").append(elem);
- elem.focus();
- elem.select();
- document.execCommand('copy');
- elem.remove();
- });
- return cb;
- };
-
- CloudKeys.prototype.limitItems = function(items) {
- var current;
- $('#resultdescription span').text(items.length);
- current = 0;
- $('#items>li').each((function(_this) {
- return function(k, v) {
- var item;
- item = $(v);
- item.removeClass('odd');
- if ($.inArray(item.data('num'), items) === -1) {
- item.addClass('hide');
- } else {
- if (item.hasClass('hide')) {
- item.removeClass('hide');
- }
- if (current % 2 === 0) {
- item.addClass('odd');
- }
- current = current + 1;
- }
- };
- })(this));
- };
-
- CloudKeys.prototype.showItems = function(items) {
- var additionalClass, c, char, counter, field, i, item, itemContainer, j, len, lines_match, password, ref, ul;
- $('#items li').remove();
- itemContainer = $('#items');
- $('#resultdescription span').text(items.length);
- for (i = j = 0, len = items.length; j < len; i = ++j) {
- item = items[i];
- additionalClass = "";
- if (i % 2 === 0) {
- additionalClass = "odd";
- }
- item = this.entities[item];
- c = $("" + item.title + " " + item.username + "");
- ul = $("");
- password = "";
- ref = item.password;
- for (char in ref) {
- i = ref[char];
- password += "*";
- }
- field = $("
");
- ul.append(field);
- this.getClipboardCode(item.username).insertBefore(field.find("br"));
- field = $(" (toggle visibility)
");
- ul.append(field);
- this.getClipboardCode(item.password).insertBefore(field.find("br"));
- field = $("
");
- ul.append(field);
- this.getClipboardCode(item.url).insertBefore(field.find("br"));
- lines_match = item.comment.match(/\n/g);
- if (lines_match !== null) {
- counter = lines_match.length;
- }
- if (counter < 2) {
- counter = 2;
- }
- field = $("
");
- ul.append(field);
- this.getClipboardCode(item.comment).insertBefore(field.find("br"));
- field = $("
");
- ul.append(field);
- this.getClipboardCode(item.tags).insertBefore(field.find("br"));
- ul.append("
");
- ul.find('.btn-primary').click((function(_this) {
- return function() {
- var t = this;
- var num;
- num = $(t).parent().parent().parent().data('num');
- if (typeof num !== "undefined" && typeof num !== null) {
- return _this.showForm(num);
- }
- };
- })(this));
- ul.find('.passwordtoggle em').click((function(_this) {
- return function() {
- var t = this;
- var elem, original;
- elem = $(t).parent().find('.password');
- original = elem.data('toggle');
- elem.data('toggle', elem.val());
- return elem.val(original);
- };
- })(this));
- c.append(ul);
- c.click((function(_this) {
- return function() {
- var that = this;
- var elem;
- elem = $(that);
- if (elem.hasClass('active') === false) {
- $('#items li.active').removeClass('active').find('ul').slideUp();
- elem.addClass('active');
- return elem.find('ul').slideDown();
- }
- };
- })(this));
- c.find('input').focus().select();
- itemContainer.append(c);
- }
- $('.hide').removeClass('hide');
- $('#loader').addClass('hide');
- $('#passwordRequest').addClass('hide');
- $('#search').focus();
- };
-
- CloudKeys.prototype.getItems = function(search) {
- var i, item, j, len, ref, result;
- result = [];
- search = search.toLowerCase();
- ref = this.entities;
- for (i = j = 0, len = ref.length; j < len; i = ++j) {
- item = ref[i];
- if (item.title.toLowerCase().indexOf(search) !== -1 || item.username.toLowerCase().indexOf(search) !== -1 || item.tags.toLowerCase().indexOf(search) !== -1) {
- item.num = i;
- result.push(i);
- }
- }
- return result;
- };
-
- CloudKeys.prototype.sortItems = function(a, b) {
- var aTitle, bTitle;
- aTitle = a.title.toLowerCase();
- bTitle = b.title.toLowerCase();
- return ((aTitle < bTitle) ? -1 : ((aTitle > bTitle) ? 1 : 0));
- };
-
- CloudKeys.prototype.showForm = function(num) {
- var elem, fields, j, len;
- $('#editDialog input').val('');
- $('#editDialog textarea').val('');
- $('#editDialog .hide').removeClass('hide');
- fields = ['title', 'username', 'password', 'url', 'comment', 'tags'];
- if (typeof num !== "undefined" && typeof this.entities[num] !== "undefined") {
- $('#editDialog input[name="num"]').val(num);
- for (j = 0, len = fields.length; j < len; j++) {
- elem = fields[j];
- $("#editDialog #" + elem).val(this.entities[num][elem]);
- }
- $("#editDialog input#repeat_password").val(this.entities[num]['password']);
- } else {
- $('#editDialog button.btn-danger').addClass('hide');
- }
- $('#editDialog').modal({});
- $('#editDialog .btn-danger').unbind('click').click((function(_this) {
- return function() {
- var confirmation;
- confirmation = confirm('Are you sure?');
- if (confirmation === true) {
- num = $('#editDialog input[name="num"]').val();
- if (typeof num !== "undefined" && typeof num !== null && num !== "") {
- _this.entities.splice(num, 1);
- return _this.updateData(function() {
- return $('#formClose').click();
- });
- }
- }
- };
- })(this));
- return $('#editDialog .btn-primary').unbind('click').click((function(_this) {
- return function() {
- var entity, field, l, len1;
- if (_this.validateForm()) {
- num = $('#editDialog input[name="num"]').val();
- entity = {};
- for (l = 0, len1 = fields.length; l < len1; l++) {
- field = fields[l];
- entity[field] = $("#" + field).val();
- }
- if (typeof num !== "undefined" && num !== "") {
- _this.entities[num] = entity;
- } else {
- _this.entities.push(entity);
- }
- _this.updateData(function() {
- return $('#formClose').click();
- });
- }
- };
- })(this));
- };
-
- CloudKeys.prototype.validateForm = function() {
- var success;
- $('#editDialog .has-error').removeClass('has-error');
- success = true;
- if ($('#title').val() === "") {
- $('#title').parent().addClass('has-error');
- success = false;
- }
- if ($('#password').val() !== "" && $('#repeat_password').val() !== $('#password').val()) {
- $('#password, #repeat_password').parent().addClass('has-error');
- success = false;
- }
- return success;
- };
-
- CloudKeys.prototype.showEditEncPWForm = function() {
- $('#editEncPWDialog input').val('');
- $('#editEncPWDialog .hide').removeClass('hide');
- $('#editEncPWDialog').modal({});
- return $('#editEncPWDialog .btn-primary').unbind('click').click((function(_this) {
- return function() {
- var confirmation, new_password;
- $('#editEncPWDialog .has-error').removeClass('has-error');
- confirmation = confirm('Do you really want to update your encryption password?');
- if (confirmation !== true) {
- return;
- }
- if ($('#editEncPW_current_password').val() !== _this.password) {
- $('#editEncPW_current_password').parent().addClass('has-error');
- return;
- }
- new_password = $('#editEncPW_password').val();
- if (new_password === void 0 || new_password === '') {
- $('#editEncPW_password').parent().addClass('has-error');
- return;
- }
- if (new_password !== $('#editEncPW_repeat_password').val()) {
- $('#editEncPW_password, #editEncPW_repeat_password').parent().addClass('has-error');
- return;
- }
- _this.password = new_password;
- _this.updateData(function() {
- $('#formEncPWClose').click();
- return alert('Your encryption password has been changed. Keep this in mind for later.');
- });
- };
- })(this));
- };
-
- return CloudKeys;
-
- })();
-
- window.CloudKeys = new CloudKeys();
-
- $('#importLink').click((function(_this) {
- return function() {
- return $('#importContainer').toggle(500);
- };
- })(this));
-
- $('#importContainer button').click((function(_this) {
- return function() {
- return window.CloudKeys["import"]($('#import').val());
- };
- })(this));
-
-}).call(this);
diff --git a/assets/signin.css b/assets/signin.css
deleted file mode 100644
index c16d0f7..0000000
--- a/assets/signin.css
+++ /dev/null
@@ -1,54 +0,0 @@
-body {
- padding-top: 40px;
- padding-bottom: 40px;
- background-color: #eee;
-}
-
-.form-signin {
- max-width: 330px;
- padding: 15px;
- margin: 0 auto;
-}
-.form-signin .form-signin-heading,
-.form-signin .checkbox {
- margin-bottom: 10px;
-}
-.form-signin .checkbox {
- font-weight: normal;
-}
-.form-signin .form-control {
- position: relative;
- font-size: 16px;
- height: auto;
- padding: 10px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.form-signin .form-control:focus {
- z-index: 2;
-}
-.form-signin input[type="text"] {
- margin-bottom: -1px;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.container.login .form-signin input[type="password"] {
- margin-bottom: 10px;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-
-.container.register .form-signin input[name="password"] {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
- margin-bottom: -1px;
-}
-.container.register .form-signin input[name="password_repeat"] {
- margin-bottom: 10px;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
diff --git a/assets/style.css b/assets/style.css
deleted file mode 100644
index 9ee7e00..0000000
--- a/assets/style.css
+++ /dev/null
@@ -1 +0,0 @@
-body{padding-top:70px}input{outline:0}.navbar a{cursor:pointer}.navbar a.active_account{font-weight:bold}#importContainer{display:none}#importContainer #importer{border:1px solid #111111;border-radius:5px;background-image:linear-gradient(to bottom, #666666 0, #171717 100%);margin:20px 0;padding:20px 20px}#importContainer #importer textarea{border:0;border-radius:5px;display:block;font-size:11px;height:350px;margin:0 auto;padding:0;width:100%}#loader img{display:block;margin:0 auto}#searchbox{border:1px solid #111111;border-radius:5px;background-image:linear-gradient(to bottom, #666666 0, #171717 100%);margin:20px 0;padding:10px}#searchbox input{border:0;border-radius:5px;display:block;font-size:20px;height:40px;margin:0 auto;padding:0 20px;width:100%}#content #resultdescription{margin:15px 0}#content #resultdescription span{font-weight:bold}#content ul#items{list-style:none;padding:0}#content ul#items li.active{background-color:#e5e3e9}#content ul#items li{cursor:pointer;padding:5px 20px}#content ul#items li span{font-size:70%;font-style:italic;padding:0 0 0 20px}#content ul#items li ul{display:none;list-style:none;padding-left:5px}#content ul#items li ul li.last{display:none}@media (min-width:768px){#content ul#items li ul li.last{border-bottom:0;display:block}}#content ul#items li ul li{border-bottom:1px dotted gray}#content ul#items li ul li br{clear:both}#content ul#items li ul li label{display:block;float:left;width:100px}#content ul#items li ul li input,#content ul#items li ul li textarea{background:transparent;border:0;float:left;font-size:11px;min-height:20px;outline:0;padding-left:0;width:300px}#content ul#items li ul li input.password{width:200px}#content ul#items li ul li div.clipboard{background:url('clipboard.png') no-repeat top left;display:inline-block;height:14px;width:14px}#content ul#items li ul li div.clipboard:active{background:url('clipboard_click.png') no-repeat top left}#content ul#items li ul li div.clipboard:hover{background:url('clipboard_hover.png') no-repeat top left}#content ul#items li ul li em{float:left;font-size:70%;width:100px}#content ul#items li ul li span.clippy{display:none}@media (min-width:992px){#content ul#items li ul li span.clippy{display:block;float:left;padding-left:0;width:20px}}#content ul#items li li.odd{background-color:transparent}#content ul#items li:hover{background-color:#e5e3e9}#content ul#items li.odd{background-color:#f6f6f6}
\ No newline at end of file
diff --git a/router.go b/router.go
index 3dc89a1..1d20bd4 100644
--- a/router.go
+++ b/router.go
@@ -8,7 +8,7 @@ import (
func router() *mux.Router {
r := mux.NewRouter()
- r.PathPrefix("/assets/").HandlerFunc(gzipFunc(serveAssets))
+ r.PathPrefix("/").HandlerFunc(gzipFunc(serveAssets))
registerAPIv2(r.PathPrefix("/v2").Subrouter())
diff --git a/server.go b/server.go
index 9805ad6..c4d8871 100644
--- a/server.go
+++ b/server.go
@@ -4,8 +4,6 @@ import (
"net/http"
)
-//go:generate go-bindata assets templates
-
func init() {
initialize()
http.Handle("/", router())