mirror of
https://github.com/nuxsmin/sysPass.git
synced 2026-03-03 07:04:07 +01:00
565 lines
18 KiB
JavaScript
565 lines
18 KiB
JavaScript
/*
|
|
* sysPass
|
|
*
|
|
* @author nuxsmin
|
|
* @link https://syspass.org
|
|
* @copyright 2012-2020, Rubén Domínguez nuxsmin@$syspass.org
|
|
*
|
|
* This file is part of sysPass.
|
|
*
|
|
* sysPass is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* sysPass is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with sysPass. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
sysPass.Triggers = function (log) {
|
|
"use strict";
|
|
|
|
const regex = {
|
|
email: "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
|
|
};
|
|
|
|
// Detectar los campos select y añadir funciones
|
|
const selectDetect = function ($container) {
|
|
const options = {
|
|
valueField: "id",
|
|
labelField: "name",
|
|
searchField: ["name"],
|
|
onInitialize: function () {
|
|
const $wrapper = $(this.$wrapper[0]);
|
|
const $input = $(this.$input[0]);
|
|
const $selectBoxAddIcon = $input.siblings(".btn-add-select");
|
|
|
|
if ($selectBoxAddIcon.length === 1) {
|
|
$wrapper.append($selectBoxAddIcon);
|
|
}
|
|
}
|
|
};
|
|
|
|
$container.find(".select-box").each(function (e) {
|
|
const $this = $(this);
|
|
const self_options = {};
|
|
|
|
if ($this.data("create") === true) {
|
|
self_options.create = true;
|
|
}
|
|
|
|
options.plugins = $this.hasClass("select-box-deselect") ? {"clear_selection": {title: sysPassApp.config.LANG[51]}} : {};
|
|
|
|
if ($this.data("onchange")) {
|
|
const onchange = $this.data("onchange").split("/");
|
|
|
|
options.onChange = function (value) {
|
|
if (value > 0) {
|
|
if (onchange.length === 2) {
|
|
sysPassApp.actions[onchange[0]][onchange[1]]($this);
|
|
} else {
|
|
sysPassApp.actions[onchange[0]]($this);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
$this.selectize($.extend(self_options, options));
|
|
});
|
|
|
|
$container.find("#allowed_exts").selectize({
|
|
create: function (input) {
|
|
return {
|
|
value: input.toUpperCase(),
|
|
text: input.toUpperCase()
|
|
};
|
|
},
|
|
createFilter: new RegExp("^[a-z0-9]{1,4}$", "i"),
|
|
plugins: ["remove_button"]
|
|
});
|
|
|
|
$container.find("#wikifilter").selectize({
|
|
create: true,
|
|
createFilter: new RegExp("^[a-z0-9:._-]+$", "i"),
|
|
plugins: ["remove_button"]
|
|
});
|
|
|
|
$container.find(".select-items-tag").selectize({
|
|
create: function (input) {
|
|
return {
|
|
value: input.toLowerCase(),
|
|
text: input.toLowerCase()
|
|
};
|
|
},
|
|
createFilter: new RegExp(regex.email),
|
|
plugins: ["remove_button"]
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Ejecutar acción para botones
|
|
* @param $obj
|
|
*/
|
|
const handleActionButton = function ($obj) {
|
|
log.info("handleActionButton: " + $obj.attr("id"));
|
|
|
|
const onclick = $obj.data("onclick").split("/");
|
|
let actions;
|
|
|
|
const plugin = $obj.data("plugin");
|
|
|
|
if (plugin !== undefined && sysPassApp.plugins[plugin] !== undefined) {
|
|
actions = sysPassApp.plugins[plugin];
|
|
} else {
|
|
actions = sysPassApp.actions;
|
|
}
|
|
|
|
if (onclick.length === 2) {
|
|
actions[onclick[0]][onclick[1]]($obj);
|
|
} else {
|
|
actions[onclick[0]]($obj);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Ejecutar acción para formularios
|
|
*
|
|
* @param $obj
|
|
*/
|
|
const handleFormAction = function ($obj) {
|
|
log.info("formAction");
|
|
|
|
const lastHash = $obj.attr("data-hash");
|
|
const currentHash = sysPassApp.util.hash.md5($obj.serialize());
|
|
|
|
if (lastHash === currentHash) {
|
|
sysPassApp.msg.ok(sysPassApp.config.LANG[55]);
|
|
return false;
|
|
}
|
|
|
|
const plugin = $obj.data("plugin");
|
|
let actions;
|
|
|
|
if (plugin !== undefined && sysPassApp.plugins[plugin] !== undefined) {
|
|
actions = sysPassApp.plugins[plugin];
|
|
} else {
|
|
actions = sysPassApp.actions;
|
|
}
|
|
|
|
const onsubmit = $obj.data("onsubmit").split("/");
|
|
|
|
$obj.find("input[name='sk']").val(sysPassApp.sk.get());
|
|
|
|
if (onsubmit.length === 2) {
|
|
actions[onsubmit[0]][onsubmit[1]]($obj);
|
|
} else {
|
|
actions[onsubmit[0]]($obj);
|
|
}
|
|
};
|
|
|
|
const bodyHooks = function () {
|
|
log.info("bodyHooks");
|
|
|
|
$("body").on("click", "button.btn-action[data-onclick][type='button']" +
|
|
",li.btn-action[data-onclick]" +
|
|
",span.btn-action[data-onclick]" +
|
|
",i.btn-action[data-onclick]" +
|
|
",a.btn-action[data-onclick]" +
|
|
",.btn-action-pager[data-onclick]", function () {
|
|
handleActionButton($(this));
|
|
}).on("click", ".btn-back", function () {
|
|
if (sysPassApp.requests.history.length() > 0) {
|
|
log.info("back");
|
|
|
|
const lastHistory = sysPassApp.requests.history.del();
|
|
|
|
if (!lastHistory.hasOwnProperty('data')) {
|
|
lastHistory.data = {sk: sysPassApp.sk.get()};
|
|
} else {
|
|
lastHistory.data.sk = sysPassApp.sk.get();
|
|
}
|
|
|
|
sysPassApp.requests.getActionCall(lastHistory, lastHistory.callback);
|
|
}
|
|
}).on("submit", ".form-action", function (e) {
|
|
e.preventDefault();
|
|
|
|
handleFormAction($(this));
|
|
}).on("click", ".btn-help[data-help]", function () {
|
|
const $this = $(this);
|
|
const $helpSrc = $.find("div[for='" + $this.data("help") + "']");
|
|
|
|
if ($helpSrc.length > 0) {
|
|
const title = sysPassApp.config.LANG[54] + " - " + $helpSrc[0].getAttribute("title") || sysPassApp.config.LANG[54];
|
|
|
|
mdlDialog().show({
|
|
title: title,
|
|
text: $helpSrc[0].innerHTML,
|
|
positive: {
|
|
title: sysPassApp.config.LANG[43]
|
|
}
|
|
});
|
|
}
|
|
}).on("reset", ".form-action", function (e) {
|
|
e.preventDefault();
|
|
|
|
log.info("reset");
|
|
|
|
const $this = $(this);
|
|
|
|
$this.find("input:text, input:password, input:file, textarea").val("").parent("div").removeClass("is-dirty");
|
|
$this.find("input:radio, input:checkbox").prop("checked", false).prop("selected", false);
|
|
$this.find("input[name='start'], input[name='skey'], input[name='sorder']").val(0);
|
|
|
|
$this.find("select").each(function () {
|
|
$(this)[0].selectize.clear(true);
|
|
});
|
|
|
|
$this.submit();
|
|
}).on("click", ".btn-popup-close", function (e) {
|
|
$.magnificPopup.close();
|
|
}).on("theme:update", function () {
|
|
log.debug("on:theme:update");
|
|
|
|
const $box = $("#box-popup");
|
|
|
|
if ($box.length > 0) {
|
|
sysPassApp.util.focus($box);
|
|
} else {
|
|
sysPassApp.util.focus($(this));
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Triggers que se ejecutan en determinadas vistas
|
|
*/
|
|
const views = {
|
|
main: function ($obj) {
|
|
log.info("views:main");
|
|
|
|
if (!clipboard.isSupported()) {
|
|
sysPassApp.msg.info(sysPassApp.config.LANG[65]);
|
|
}
|
|
|
|
$(".btn-menu").click(function () {
|
|
const $this = $(this);
|
|
|
|
if ($this.attr("data-history-reset") === "1") {
|
|
sysPassApp.requests.history.reset();
|
|
}
|
|
|
|
sysPassApp.actions.getContent({r: $this.data("route")}, $this.data("view"));
|
|
});
|
|
|
|
|
|
sysPassApp.actions.notification.getActive();
|
|
|
|
if (sysPassApp.config.STATUS.CHECK_NOTIFICATIONS) {
|
|
setInterval(function () {
|
|
sysPassApp.actions.notification.getActive();
|
|
}, 120000);
|
|
}
|
|
|
|
if ($obj.data("upgraded") === 0) {
|
|
sysPassApp.actions.getContent({r: "account/index"}, "search");
|
|
} else {
|
|
const $content = $("#content");
|
|
const page = $content.data('page');
|
|
|
|
views.common($content);
|
|
|
|
if (page !== "" && typeof views[page] === "function") {
|
|
views[page]();
|
|
}
|
|
}
|
|
|
|
if (sysPassApp.config.STATUS.CHECK_UPDATES === true) {
|
|
sysPassApp.actions.main.getUpdates();
|
|
}
|
|
|
|
if (sysPassApp.config.STATUS.CHECK_NOTICES === true) {
|
|
sysPassApp.actions.main.getNotices();
|
|
}
|
|
|
|
if (typeof sysPassApp.theme.viewsTriggers.main === "function") {
|
|
sysPassApp.theme.viewsTriggers.main();
|
|
}
|
|
},
|
|
search: function () {
|
|
log.info("views:search");
|
|
|
|
const $frmSearch = $("#frmSearch");
|
|
|
|
if ($frmSearch.length === 0) {
|
|
return;
|
|
}
|
|
|
|
// $frmSearch.find("input[name='search']")
|
|
// .on("keyup", function (e) {
|
|
// e.preventDefault();
|
|
//
|
|
// if (e.key === "Enter"
|
|
// || e.which === 13
|
|
// ) {
|
|
// $frmSearch.submit();
|
|
// }
|
|
// });
|
|
|
|
$frmSearch.find("select, #rpp")
|
|
.on("change", function () {
|
|
$frmSearch.submit();
|
|
});
|
|
|
|
$frmSearch.find("button.btn-clear")
|
|
.on("click", function (e) {
|
|
e.preventDefault();
|
|
|
|
$frmSearch.find("input[name=\"searchfav\"]").val(0);
|
|
|
|
$frmSearch[0].reset();
|
|
});
|
|
|
|
$("#globalSearch").click(function () {
|
|
const val = $(this).prop("checked") == true ? 1 : 0;
|
|
|
|
$frmSearch.find("input[name='gsearch']").val(val);
|
|
$frmSearch.submit();
|
|
}
|
|
);
|
|
|
|
if (typeof sysPassApp.theme.viewsTriggers.search === "function") {
|
|
sysPassApp.theme.viewsTriggers.search();
|
|
}
|
|
},
|
|
login: function () {
|
|
log.info("views:login");
|
|
|
|
const $frmLogin = $("#frmLogin");
|
|
|
|
if (sysPassApp.config.AUTH.AUTHBASIC_AUTOLOGIN
|
|
&& $frmLogin.find("input[name='loggedOut']").val() === "0"
|
|
) {
|
|
log.info("views:login:autologin");
|
|
|
|
sysPassApp.msg.info(sysPassApp.config.LANG[66]);
|
|
|
|
sysPassApp.actions.main.login($frmLogin);
|
|
}
|
|
},
|
|
userpassreset: function () {
|
|
log.info("views:userpassreset");
|
|
|
|
const $form = $("#frmUserPassReset");
|
|
|
|
sysPassApp.theme.passwordDetect($form);
|
|
},
|
|
footer: function () {
|
|
log.info("views:footer");
|
|
},
|
|
common: function ($container) {
|
|
log.info("views:common");
|
|
|
|
selectDetect($container);
|
|
|
|
const $sk = $container.find(":input[name='sk']");
|
|
|
|
if (typeof sysPassApp.theme.viewsTriggers.common === "function") {
|
|
sysPassApp.theme.viewsTriggers.common($container);
|
|
}
|
|
|
|
initializeTags($container);
|
|
|
|
sysPassApp.triggers.updateFormHash($container);
|
|
},
|
|
datatabs: function () {
|
|
log.info("views:datatabs");
|
|
|
|
$(".datagrid-action-search>form").each(function () {
|
|
const $this = $(this);
|
|
|
|
$this.find("button.btn-clear").on("click", function (e) {
|
|
e.preventDefault();
|
|
|
|
$this.trigger("reset");
|
|
});
|
|
});
|
|
},
|
|
config: function () {
|
|
log.info("views:config");
|
|
|
|
const $dropFiles = $("#drop-import-files");
|
|
|
|
if ($dropFiles.length > 0) {
|
|
const upload = sysPassApp.util.fileUpload($dropFiles);
|
|
|
|
upload.url = sysPassApp.util.getUrl(
|
|
sysPassApp.actions.ajaxUrl.entrypoint,
|
|
{r: $dropFiles.data("action-route")}
|
|
);
|
|
upload.allowedMime = sysPassApp.config.FILES.IMPORT_ALLOWED_MIME;
|
|
upload.beforeSendAction = function () {
|
|
upload.setRequestData({
|
|
sk: sysPassApp.sk.get(),
|
|
csvDelimiter: $("#csvDelimiter").val(),
|
|
importPwd: $("#importPwd").val(),
|
|
importMasterPwd: $("#importMasterPwd").val(),
|
|
import_defaultuser: $("#import_defaultuser").val(),
|
|
import_defaultgroup: $("#import_defaultgroup").val()
|
|
});
|
|
};
|
|
}
|
|
},
|
|
account: function () {
|
|
log.info("views:account");
|
|
|
|
const $listFiles = $("#list-account-files");
|
|
|
|
if ($listFiles.length > 0) {
|
|
sysPassApp.actions.account.listFiles($listFiles);
|
|
}
|
|
|
|
const $dropFiles = $("#drop-account-files");
|
|
|
|
if ($dropFiles.length > 0) {
|
|
const upload = sysPassApp.util.fileUpload($dropFiles);
|
|
|
|
upload.url = sysPassApp.util.getUrl(
|
|
sysPassApp.actions.ajaxUrl.entrypoint,
|
|
{r: [$dropFiles.data("action-route"), $dropFiles.data("item-id")]}
|
|
);
|
|
upload.allowedMime = sysPassApp.config.FILES.ACCOUNT_ALLOWED_MIME;
|
|
upload.requestDoneAction = function () {
|
|
sysPassApp.actions.account.listFiles($listFiles);
|
|
};
|
|
}
|
|
|
|
const $selParentAccount = $("#parent_account_id");
|
|
|
|
if ($selParentAccount.length > 0) {
|
|
$selParentAccount.on("change", function () {
|
|
const $this = $(this);
|
|
const $pass = $("#accountpass,#accountpassR");
|
|
|
|
if ($this[0].value > 0) {
|
|
$pass.each(function () {
|
|
$(this).prop("disabled", "true");
|
|
$(this).prop("required", "false");
|
|
});
|
|
} else {
|
|
$pass.each(function () {
|
|
$(this).prop("disabled", "");
|
|
$(this).prop("required", "true");
|
|
});
|
|
}
|
|
});
|
|
|
|
sysPassApp.actions.items.get($selParentAccount);
|
|
}
|
|
},
|
|
install: function () {
|
|
log.info("views:install");
|
|
|
|
const $form = $("#frmInstall");
|
|
|
|
sysPassApp.theme.passwordDetect($form);
|
|
selectDetect($form);
|
|
}
|
|
};
|
|
|
|
const initializeTags = function ($container) {
|
|
log.info("initializeTags");
|
|
|
|
$container
|
|
.find(".select-box-tags").selectize({
|
|
persist: false,
|
|
valueField: 'id',
|
|
labelField: 'name',
|
|
searchField: ['name'],
|
|
plugins: ['remove_button'],
|
|
onInitialize: function () {
|
|
const $wrapper = $(this.$wrapper[0]);
|
|
const $input = $(this.$input[0]);
|
|
const value = this.getValue();
|
|
|
|
if (value !== "") {
|
|
$input.attr("data-hash", sysPassApp.util.hash.md5(value.join()));
|
|
}
|
|
|
|
const currentItemId = $input.data("currentItemId");
|
|
|
|
if (currentItemId !== undefined) {
|
|
this.removeOption(currentItemId, true);
|
|
}
|
|
|
|
const $selectBoxTagsNext = $input.siblings(".btn-add-select");
|
|
|
|
if ($selectBoxTagsNext.length === 1) {
|
|
$wrapper.append($selectBoxTagsNext);
|
|
}
|
|
|
|
const $selectBoxIcon = $input.siblings(".select-icon");
|
|
|
|
if ($selectBoxIcon.length === 1) {
|
|
$wrapper.prepend($selectBoxIcon);
|
|
}
|
|
},
|
|
onChange: function () {
|
|
const $input = $(this.$input[0]);
|
|
|
|
// Calculates the current data hash and compares it against the orginal one.
|
|
// It sets the data-updated attribute to the comparation result
|
|
const updated = sysPassApp.util.hash.md5(this.getValue().join()) !== $input.data("hash");
|
|
$input.attr("data-updated", updated);
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Actualizar el token de seguridad en los atributos de los botones y formularios
|
|
*
|
|
*/
|
|
const updateSk = function () {
|
|
$("#content").find("[data-sk]").each(function () {
|
|
log.info("updateSk");
|
|
|
|
$(this).data("sk", sysPassApp.sk.get());
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Actualizar el hash de los formularios de acción
|
|
*/
|
|
const updateFormHash = function ($container) {
|
|
log.info("updateFormHash");
|
|
|
|
let $form;
|
|
|
|
if ($container !== undefined) {
|
|
$form = $container.find(".form-action[data-hash]");
|
|
} else {
|
|
$form = $(".form-action[data-hash]");
|
|
}
|
|
|
|
if ($form.length > 0) {
|
|
$form.each(function () {
|
|
const $this = $(this);
|
|
|
|
$this.attr("data-hash", sysPassApp.util.hash.md5($this.serialize()));
|
|
});
|
|
}
|
|
};
|
|
|
|
return {
|
|
views: views,
|
|
selectDetect: selectDetect,
|
|
updateSk: updateSk,
|
|
updateFormHash: updateFormHash,
|
|
bodyHooks: bodyHooks
|
|
};
|
|
}; |