From e322563a66766886b2010c8e7e303c745b229d7e Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Tue, 16 Oct 2018 01:13:38 +0200 Subject: [PATCH] * [ADD] Added In-App notifications polling. It will show up a browser notification when there are pending notifications * [MOD] Improved Javascript error handling * [MOD] Code refactoring Signed-off-by: nuxsmin --- app/locales/en_GB/LC_MESSAGES/messages.mo | Bin 105315 -> 105496 bytes app/locales/en_GB/LC_MESSAGES/messages.po | 230 +++++++++--------- app/locales/en_US/LC_MESSAGES/messages.mo | Bin 105315 -> 105496 bytes app/locales/en_US/LC_MESSAGES/messages.po | 230 +++++++++--------- .../web/Controllers/AccountController.php | 6 +- .../web/Controllers/BootstrapController.php | 16 +- .../web/Controllers/Helpers/LayoutHelper.php | 1 - .../web/Controllers/ItemsController.php | 40 ++- .../Controllers/NotificationController.php | 6 + .../web/Controllers/SimpleControllerBase.php | 16 +- .../web/Controllers/Traits/JsonTrait.php | 10 + .../UserSettingsGeneralController.php | 1 + .../UserSettingsManagerController.php | 1 + app/modules/web/Forms/NotificationForm.php | 10 +- app/modules/web/Init.php | 19 +- .../web/themes/material-blue/js/app-theme.js | 16 +- .../themes/material-blue/js/app-theme.min.js | 10 +- .../views/_partials/fixed-header.inc | 24 +- .../views/usersettings/general.inc | 17 ++ lib/SP/Core/Messages/NotificationMessage.php | 38 ++- lib/SP/DataModel/UserPreferencesData.php | 38 ++- lib/SP/Mvc/Controller/ControllerTrait.php | 8 +- lib/SP/Plugin/PluginManager.php | 4 +- lib/SP/Services/Install/Installer.php | 2 +- public/js/app-actions.js | 78 +++--- public/js/app-actions.min.js | 57 ++--- public/js/app-config.js | 6 +- public/js/app-config.min.js | 6 +- public/js/app-main.js | 2 + public/js/app-main.min.js | 9 +- public/js/app-requests.js | 8 +- public/js/app-requests.min.js | 10 +- public/js/app-triggers.js | 10 +- public/js/app-triggers.min.js | 28 +-- public/js/app-util.js | 51 ++++ 35 files changed, 622 insertions(+), 386 deletions(-) diff --git a/app/locales/en_GB/LC_MESSAGES/messages.mo b/app/locales/en_GB/LC_MESSAGES/messages.mo index 995903bdcb49ae7361c8e459a1e25c263d35befc..c92866cb659c5f5655c01e709f5023f0601d64ea 100644 GIT binary patch delta 28551 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 diff --git a/app/locales/en_GB/LC_MESSAGES/messages.po b/app/locales/en_GB/LC_MESSAGES/messages.po index d4a57c47..cfecd04f 100644 --- a/app/locales/en_GB/LC_MESSAGES/messages.po +++ b/app/locales/en_GB/LC_MESSAGES/messages.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: sysPass\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-15 02:52+0200\n" -"PO-Revision-Date: 2018-10-15 02:55+0200\n" +"POT-Creation-Date: 2018-10-16 01:09+0200\n" +"PO-Revision-Date: 2018-10-16 01:09+0200\n" "Last-Translator: nuxsmin \n" "Language-Team: nuxsmin@syspass.org\n" "Language: en_GB\n" @@ -192,14 +192,14 @@ msgstr "Action not found" #: ../../../modules/web/Controllers/ItemPresetController.php:256 #: ../../../modules/web/Controllers/ItemPresetController.php:295 #: ../../../modules/web/Controllers/ItemPresetController.php:334 -#: ../../../modules/web/Controllers/NotificationController.php:100 -#: ../../../modules/web/Controllers/NotificationController.php:160 -#: ../../../modules/web/Controllers/NotificationController.php:175 -#: ../../../modules/web/Controllers/NotificationController.php:206 -#: ../../../modules/web/Controllers/NotificationController.php:237 -#: ../../../modules/web/Controllers/NotificationController.php:288 -#: ../../../modules/web/Controllers/NotificationController.php:315 -#: ../../../modules/web/Controllers/NotificationController.php:348 +#: ../../../modules/web/Controllers/NotificationController.php:102 +#: ../../../modules/web/Controllers/NotificationController.php:164 +#: ../../../modules/web/Controllers/NotificationController.php:179 +#: ../../../modules/web/Controllers/NotificationController.php:210 +#: ../../../modules/web/Controllers/NotificationController.php:241 +#: ../../../modules/web/Controllers/NotificationController.php:292 +#: ../../../modules/web/Controllers/NotificationController.php:319 +#: ../../../modules/web/Controllers/NotificationController.php:352 #: ../../../modules/web/Controllers/PluginController.php:103 #: ../../../modules/web/Controllers/PluginController.php:122 #: ../../../modules/web/Controllers/PublicLinkController.php:71 @@ -320,12 +320,12 @@ msgstr "Invalid icons class" #: ../../../../lib/SP/DataModel/PublicLinkListData.php:88 #: ../../../../lib/SP/Providers/Auth/Ldap/LdapConnection.php:190 -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "ON" msgstr "ON" #: ../../../../lib/SP/DataModel/PublicLinkListData.php:88 -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "OFF" msgstr "OFF" @@ -356,7 +356,8 @@ msgstr "Invalid XML-RPC response" msgid "La sesión no se ha iniciado o ha caducado" msgstr "Session not started or timed out" -#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:124 +#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:119 +#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:128 msgid "Acción Inválida" msgstr "Invalid Action" @@ -532,7 +533,7 @@ msgstr "Error while searching the group RDN" #: ../../../modules/web/Controllers/Helpers/Grid/ItemPresetGrid.php:108 #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:118 #: ../../../modules/web/Controllers/UserGroupController.php:231 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:137 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:127 #: ../../../modules/web/themes/material-blue/views/_partials/footer.inc:15 #: ../../../modules/web/themes/material-blue/views/config/encryption.inc:269 #: ../../../modules/web/themes/material-blue/views/config/encryption.inc:272 @@ -622,7 +623,7 @@ msgid "No es posible inicializar" msgstr "Unable to initialize" #: ../../../../lib/SP/Providers/Notification/NotificationHandler.php:124 -#: ../../../modules/web/Controllers/AccountController.php:925 +#: ../../../modules/web/Controllers/AccountController.php:927 msgid "Solicitud" msgstr "Request" @@ -640,8 +641,8 @@ msgid "Cuentas" msgstr "Accounts" #: ../../../../lib/SP/Providers/Notification/NotificationHandler.php:155 -#: ../../../modules/web/Controllers/NotificationController.php:267 -#: ../../../modules/web/Controllers/NotificationController.php:298 +#: ../../../modules/web/Controllers/NotificationController.php:271 +#: ../../../modules/web/Controllers/NotificationController.php:302 msgid "Notificación" msgstr "Notification" @@ -1534,13 +1535,13 @@ msgstr "Account imported" #: ../../../modules/api/Controllers/AccountController.php:190 #: ../../../modules/api/Controllers/AccountController.php:241 #: ../../../modules/api/Controllers/AccountController.php:316 -#: ../../../modules/web/Controllers/AccountController.php:224 -#: ../../../modules/web/Controllers/AccountController.php:719 -#: ../../../modules/web/Controllers/AccountController.php:764 -#: ../../../modules/web/Controllers/AccountController.php:805 -#: ../../../modules/web/Controllers/AccountController.php:844 -#: ../../../modules/web/Controllers/AccountController.php:894 -#: ../../../modules/web/Controllers/AccountController.php:928 +#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:721 +#: ../../../modules/web/Controllers/AccountController.php:766 +#: ../../../modules/web/Controllers/AccountController.php:807 +#: ../../../modules/web/Controllers/AccountController.php:846 +#: ../../../modules/web/Controllers/AccountController.php:896 +#: ../../../modules/web/Controllers/AccountController.php:930 #: ../../../modules/web/Controllers/AccountFileController.php:234 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:112 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:147 @@ -2332,15 +2333,15 @@ msgid "Cuenta visualizada" msgstr "Account displayed" #: ../../../modules/api/Controllers/AccountController.php:102 -#: ../../../modules/web/Controllers/AccountController.php:553 -#: ../../../modules/web/Controllers/AccountController.php:609 +#: ../../../modules/web/Controllers/AccountController.php:555 +#: ../../../modules/web/Controllers/AccountController.php:611 msgid "Clave visualizada" msgstr "Password viewed" #: ../../../modules/api/Controllers/AccountController.php:138 #: ../../../modules/api/Controllers/AccountController.php:144 -#: ../../../modules/web/Controllers/AccountController.php:803 -#: ../../../modules/web/Controllers/AccountController.php:814 +#: ../../../modules/web/Controllers/AccountController.php:805 +#: ../../../modules/web/Controllers/AccountController.php:816 #: ../../../modules/web/Controllers/UserController.php:411 #: ../../../modules/web/Controllers/UserController.php:415 #: ../../../modules/web/Controllers/UserPassResetController.php:189 @@ -2350,22 +2351,22 @@ msgstr "Password updated" #: ../../../modules/api/Controllers/AccountController.php:188 #: ../../../modules/api/Controllers/AccountController.php:194 -#: ../../../modules/web/Controllers/AccountController.php:717 -#: ../../../modules/web/Controllers/AccountController.php:728 +#: ../../../modules/web/Controllers/AccountController.php:719 +#: ../../../modules/web/Controllers/AccountController.php:730 msgid "Cuenta creada" msgstr "Account added" #: ../../../modules/api/Controllers/AccountController.php:239 #: ../../../modules/api/Controllers/AccountController.php:245 -#: ../../../modules/web/Controllers/AccountController.php:762 -#: ../../../modules/web/Controllers/AccountController.php:773 +#: ../../../modules/web/Controllers/AccountController.php:764 +#: ../../../modules/web/Controllers/AccountController.php:775 msgid "Cuenta actualizada" msgstr "Account updated" #: ../../../modules/api/Controllers/AccountController.php:314 #: ../../../modules/api/Controllers/AccountController.php:320 -#: ../../../modules/web/Controllers/AccountController.php:892 -#: ../../../modules/web/Controllers/AccountController.php:897 +#: ../../../modules/web/Controllers/AccountController.php:894 +#: ../../../modules/web/Controllers/AccountController.php:899 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:110 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:115 #: ../../../modules/web/Controllers/AccountManagerController.php:145 @@ -2737,9 +2738,9 @@ msgstr "Group deleted" msgid "Es necesario actualizar" msgstr "Updating needed" -#: ../../../modules/web/Controllers/AccountController.php:148 -#: ../../../modules/web/Controllers/AccountController.php:203 -#: ../../../modules/web/Controllers/AccountController.php:473 +#: ../../../modules/web/Controllers/AccountController.php:150 +#: ../../../modules/web/Controllers/AccountController.php:205 +#: ../../../modules/web/Controllers/AccountController.php:475 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:60 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:61 #: ../../../modules/web/Controllers/Helpers/Grid/AccountGrid.php:159 @@ -2749,21 +2750,21 @@ msgstr "Updating needed" msgid "Detalles de Cuenta" msgstr "Account Details" -#: ../../../modules/web/Controllers/AccountController.php:222 +#: ../../../modules/web/Controllers/AccountController.php:224 msgid "Enlace visualizado" msgstr "Link viewed" -#: ../../../modules/web/Controllers/AccountController.php:223 -#: ../../../modules/web/Controllers/AccountController.php:554 -#: ../../../modules/web/Controllers/AccountController.php:610 -#: ../../../modules/web/Controllers/AccountController.php:649 -#: ../../../modules/web/Controllers/AccountController.php:683 -#: ../../../modules/web/Controllers/AccountController.php:718 -#: ../../../modules/web/Controllers/AccountController.php:763 -#: ../../../modules/web/Controllers/AccountController.php:804 -#: ../../../modules/web/Controllers/AccountController.php:843 -#: ../../../modules/web/Controllers/AccountController.php:893 -#: ../../../modules/web/Controllers/AccountController.php:927 +#: ../../../modules/web/Controllers/AccountController.php:225 +#: ../../../modules/web/Controllers/AccountController.php:556 +#: ../../../modules/web/Controllers/AccountController.php:612 +#: ../../../modules/web/Controllers/AccountController.php:651 +#: ../../../modules/web/Controllers/AccountController.php:685 +#: ../../../modules/web/Controllers/AccountController.php:720 +#: ../../../modules/web/Controllers/AccountController.php:765 +#: ../../../modules/web/Controllers/AccountController.php:806 +#: ../../../modules/web/Controllers/AccountController.php:845 +#: ../../../modules/web/Controllers/AccountController.php:895 +#: ../../../modules/web/Controllers/AccountController.php:929 #: ../../../modules/web/Controllers/AccountFileController.php:233 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:111 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:146 @@ -2777,24 +2778,24 @@ msgstr "Link viewed" msgid "Cuenta" msgstr "Account" -#: ../../../modules/web/Controllers/AccountController.php:225 +#: ../../../modules/web/Controllers/AccountController.php:227 msgid "Agente" msgstr "Agent" -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "HTTPS" msgstr "HTTPS" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:255 -#: ../../../modules/web/Controllers/AccountController.php:299 -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:280 +#: ../../../modules/web/Controllers/AccountController.php:257 +#: ../../../modules/web/Controllers/AccountController.php:301 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:279 #: ../../../config/actions.xml:157 msgid "Nueva Cuenta" msgstr "New Account" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:343 +#: ../../../modules/web/Controllers/AccountController.php:345 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:176 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:177 #: ../../../modules/web/themes/material-blue/views/account/linkedAccounts.inc:18 @@ -2803,7 +2804,7 @@ msgid "Editar Cuenta" msgstr "Edit Account" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:388 +#: ../../../modules/web/Controllers/AccountController.php:390 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:334 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:335 #: ../../../modules/web/Controllers/Helpers/Grid/AccountGrid.php:176 @@ -2815,26 +2816,26 @@ msgstr "Edit Account" msgid "Eliminar Cuenta" msgstr "Remove Account" -#: ../../../modules/web/Controllers/AccountController.php:431 +#: ../../../modules/web/Controllers/AccountController.php:433 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:155 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:156 msgid "Modificar Clave de Cuenta" msgstr "Edit Account Password" -#: ../../../modules/web/Controllers/AccountController.php:648 -#: ../../../modules/web/Controllers/AccountController.php:682 +#: ../../../modules/web/Controllers/AccountController.php:650 +#: ../../../modules/web/Controllers/AccountController.php:684 msgid "Clave copiada" msgstr "Password copied" -#: ../../../modules/web/Controllers/AccountController.php:842 -#: ../../../modules/web/Controllers/AccountController.php:853 +#: ../../../modules/web/Controllers/AccountController.php:844 +#: ../../../modules/web/Controllers/AccountController.php:855 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:145 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:150 msgid "Cuenta restaurada" msgstr "Account restored" -#: ../../../modules/web/Controllers/AccountController.php:878 -#: ../../../modules/web/Controllers/AccountController.php:881 +#: ../../../modules/web/Controllers/AccountController.php:880 +#: ../../../modules/web/Controllers/AccountController.php:883 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:99 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:102 #: ../../../modules/web/Controllers/AccountManagerController.php:131 @@ -2842,16 +2843,16 @@ msgstr "Account restored" msgid "Cuentas eliminadas" msgstr "Accounts removed" -#: ../../../modules/web/Controllers/AccountController.php:918 -#: ../../../modules/web/Forms/NotificationForm.php:100 +#: ../../../modules/web/Controllers/AccountController.php:920 +#: ../../../modules/web/Forms/NotificationForm.php:106 msgid "Es necesaria una descripción" msgstr "A description is needed" -#: ../../../modules/web/Controllers/AccountController.php:926 +#: ../../../modules/web/Controllers/AccountController.php:928 msgid "Solicitante" msgstr "Requester" -#: ../../../modules/web/Controllers/AccountController.php:929 +#: ../../../modules/web/Controllers/AccountController.php:931 #: ../../../modules/web/Controllers/Helpers/Grid/CategoryGrid.php:106 #: ../../../modules/web/Controllers/Helpers/Grid/ClientGrid.php:105 #: ../../../modules/web/Controllers/Helpers/Grid/EventlogGrid.php:105 @@ -2865,7 +2866,7 @@ msgstr "Requester" msgid "Descripción" msgstr "Description" -#: ../../../modules/web/Controllers/AccountController.php:942 +#: ../../../modules/web/Controllers/AccountController.php:944 msgid "Solicitud realizada" msgstr "Request done" @@ -3453,7 +3454,7 @@ msgstr "View Current" #: ../../../modules/web/themes/material-blue/views/config/ldap.inc:437 #: ../../../modules/web/themes/material-blue/views/config/mail.inc:206 #: ../../../modules/web/themes/material-blue/views/config/wiki.inc:291 -#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:167 +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:184 msgid "Atrás" msgstr "Back" @@ -3914,7 +3915,7 @@ msgstr "Delete Value" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:108 #: ../../../modules/web/themes/material-blue/inc/Icons.php:65 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:105 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:100 #: ../../../modules/web/themes/material-blue/views/notification/index.inc:1 #: ../../../config/actions.xml:679 msgid "Notificaciones" @@ -3944,14 +3945,14 @@ msgstr "Search for Notification" #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:178 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:179 -#: ../../../modules/web/Controllers/NotificationController.php:179 +#: ../../../modules/web/Controllers/NotificationController.php:183 msgid "Nueva Notificación" msgstr "New Notification" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:196 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:197 -#: ../../../modules/web/Controllers/NotificationController.php:103 +#: ../../../modules/web/Controllers/NotificationController.php:105 #: ../../../config/actions.xml:811 msgid "Ver Notificación" msgstr "View Notification" @@ -3966,7 +3967,7 @@ msgstr "Checkout Notification" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:244 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:245 -#: ../../../modules/web/Controllers/NotificationController.php:210 +#: ../../../modules/web/Controllers/NotificationController.php:214 #: ../../../config/actions.xml:823 msgid "Editar Notificación" msgstr "Edit Notification" @@ -3979,7 +3980,7 @@ msgid "Eliminar Notificación" msgstr "Delete Notification" #: ../../../modules/web/Controllers/Helpers/Grid/PluginGrid.php:89 -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:336 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:335 #: ../../../modules/web/themes/material-blue/views/plugin/index.inc:1 msgid "Plugins" msgstr "Plugins" @@ -4166,9 +4167,9 @@ msgstr "View User Details" #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:257 #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:258 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:62 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:120 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:126 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:57 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:110 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:116 msgid "Cambiar Clave de Usuario" msgstr "Change User's Password" @@ -4248,13 +4249,13 @@ msgstr "Edit Profile" msgid "Eliminar Perfil" msgstr "Delete Profile" -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:267 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:266 #: ../../../modules/web/themes/material-blue/inc/Icons.php:58 msgid "Buscar" msgstr "Search" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:350 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:349 #: ../../../modules/web/themes/material-blue/inc/Icons.php:61 #: ../../../modules/web/themes/material-blue/views/config/ldap.inc:21 #: ../../../modules/web/themes/material-blue/views/itemshow/user_profile.inc:22 @@ -4306,6 +4307,15 @@ msgstr "Value created" msgid "Valor actualizado" msgstr "Value updated" +#: ../../../modules/web/Controllers/ItemsController.php:130 +msgid "No hay no hay notificaciones pendientes" +msgstr "There aren't any pending notifications" + +#: ../../../modules/web/Controllers/ItemsController.php:131 +#, php-format +msgid "Hay notificaciones pendientes: %d" +msgstr "There are pending notifications: %d" + #: ../../../modules/web/Controllers/LoginController.php:119 msgid "Finalizar sesión" msgstr "Logout session" @@ -4318,28 +4328,28 @@ msgstr "Inactive time" msgid "Tiempo total" msgstr "Total time" -#: ../../../modules/web/Controllers/NotificationController.php:251 -#: ../../../modules/web/Controllers/NotificationController.php:254 +#: ../../../modules/web/Controllers/NotificationController.php:255 +#: ../../../modules/web/Controllers/NotificationController.php:258 msgid "Notificaciones eliminadas" msgstr "Notifications deleted" -#: ../../../modules/web/Controllers/NotificationController.php:266 #: ../../../modules/web/Controllers/NotificationController.php:270 +#: ../../../modules/web/Controllers/NotificationController.php:274 msgid "Notificación eliminada" msgstr "Notification deleted" -#: ../../../modules/web/Controllers/NotificationController.php:297 #: ../../../modules/web/Controllers/NotificationController.php:301 +#: ../../../modules/web/Controllers/NotificationController.php:305 msgid "Notificación leída" msgstr "Notification read" -#: ../../../modules/web/Controllers/NotificationController.php:327 -#: ../../../modules/web/Controllers/NotificationController.php:330 +#: ../../../modules/web/Controllers/NotificationController.php:331 +#: ../../../modules/web/Controllers/NotificationController.php:334 msgid "Notificación creada" msgstr "Notification created" -#: ../../../modules/web/Controllers/NotificationController.php:360 -#: ../../../modules/web/Controllers/NotificationController.php:363 +#: ../../../modules/web/Controllers/NotificationController.php:364 +#: ../../../modules/web/Controllers/NotificationController.php:367 msgid "Notificación actualizada" msgstr "Notification updated" @@ -4516,11 +4526,11 @@ msgstr "Profile updated" msgid "Ver Perfil" msgstr "View Profile" -#: ../../../modules/web/Controllers/UserSettingsGeneralController.php:70 +#: ../../../modules/web/Controllers/UserSettingsGeneralController.php:71 msgid "Preferencias actualizadas" msgstr "Preferences updated" -#: ../../../modules/web/Controllers/UserSettingsManagerController.php:92 +#: ../../../modules/web/Controllers/UserSettingsManagerController.php:93 msgid "Preferencias" msgstr "Preferences" @@ -4581,15 +4591,15 @@ msgstr "Invalid regular expression" msgid "Es necesario asignar un elemento del tipo usuario, grupo o perfil" msgstr "An element of type user, group or profile need to be set" -#: ../../../modules/web/Forms/NotificationForm.php:92 +#: ../../../modules/web/Forms/NotificationForm.php:98 msgid "Es necesario un componente" msgstr "A component is needed" -#: ../../../modules/web/Forms/NotificationForm.php:96 +#: ../../../modules/web/Forms/NotificationForm.php:102 msgid "Es necesario un tipo" msgstr "A type is needed" -#: ../../../modules/web/Forms/NotificationForm.php:106 +#: ../../../modules/web/Forms/NotificationForm.php:112 msgid "Es necesario un destinatario" msgstr "A target is needed" @@ -5068,30 +5078,19 @@ msgstr "Clear tracks out?" msgid "Javascript es necesario para el correcto funcionamiento" msgstr "Javascript is needed in order to run correctly" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:40 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:110 -#, php-format -msgid "Hay %d notificaciones pendientes" -msgstr "There are %d unread notifications" - -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:42 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:112 -msgid "No hay no hay notificaciones pendientes" -msgstr "There aren't any pending notifications" - -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:69 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:131 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:64 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:121 msgid "Preferencias de usuario" msgstr "User preferences" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:73 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:76 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:149 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:152 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:68 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:71 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:139 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:142 msgid "Salir" msgstr "Sign Out" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:165 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:155 #: ../../../modules/web/themes/material-blue/views/_partials/footer.inc:43 msgid "Demo" msgstr "Demo" @@ -7171,6 +7170,14 @@ msgid "" "Mostrar las acciones ocultas para los elementos de la búsqueda de cuentas." msgstr "Always show the hidden actions on the accounts search page." +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:165 +msgid "Notificaciones In-App" +msgstr "In-App Notifications" + +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:167 +msgid "Habilita la consulta de notificaciones activas In-App." +msgstr "Enables the active In-App notifications polling" + #. (itstool) path: action/text #: ../../../modules/web/themes/material-blue/views/wiki/wikipage.inc:2 #: ../../../config/actions.xml:277 @@ -7552,6 +7559,9 @@ msgstr "Text" msgid "Link" msgstr "Link" +#~ msgid "Hay %d notificaciones pendientes" +#~ msgstr "There are %d unread notifications" + #~ msgid "Id de grupo de usuario" #~ msgstr "User group Id" diff --git a/app/locales/en_US/LC_MESSAGES/messages.mo b/app/locales/en_US/LC_MESSAGES/messages.mo index 9b1e1e80f89cc480394a4bac841c05bc73c3b51c..2b914bb4136f1d5f5b40231fd5186e943dc51ec2 100644 GIT binary patch delta 28551 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 delta 28426 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 diff --git a/app/locales/en_US/LC_MESSAGES/messages.po b/app/locales/en_US/LC_MESSAGES/messages.po index 7006c1dc..70718182 100644 --- a/app/locales/en_US/LC_MESSAGES/messages.po +++ b/app/locales/en_US/LC_MESSAGES/messages.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: sysPass\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-15 02:52+0200\n" -"PO-Revision-Date: 2018-10-15 02:53+0200\n" +"POT-Creation-Date: 2018-10-16 01:07+0200\n" +"PO-Revision-Date: 2018-10-16 01:09+0200\n" "Last-Translator: nuxsmin \n" "Language-Team: nuxsmin@syspass.org\n" "Language: en_US\n" @@ -192,14 +192,14 @@ msgstr "Action not found" #: ../../../modules/web/Controllers/ItemPresetController.php:256 #: ../../../modules/web/Controllers/ItemPresetController.php:295 #: ../../../modules/web/Controllers/ItemPresetController.php:334 -#: ../../../modules/web/Controllers/NotificationController.php:100 -#: ../../../modules/web/Controllers/NotificationController.php:160 -#: ../../../modules/web/Controllers/NotificationController.php:175 -#: ../../../modules/web/Controllers/NotificationController.php:206 -#: ../../../modules/web/Controllers/NotificationController.php:237 -#: ../../../modules/web/Controllers/NotificationController.php:288 -#: ../../../modules/web/Controllers/NotificationController.php:315 -#: ../../../modules/web/Controllers/NotificationController.php:348 +#: ../../../modules/web/Controllers/NotificationController.php:102 +#: ../../../modules/web/Controllers/NotificationController.php:164 +#: ../../../modules/web/Controllers/NotificationController.php:179 +#: ../../../modules/web/Controllers/NotificationController.php:210 +#: ../../../modules/web/Controllers/NotificationController.php:241 +#: ../../../modules/web/Controllers/NotificationController.php:292 +#: ../../../modules/web/Controllers/NotificationController.php:319 +#: ../../../modules/web/Controllers/NotificationController.php:352 #: ../../../modules/web/Controllers/PluginController.php:103 #: ../../../modules/web/Controllers/PluginController.php:122 #: ../../../modules/web/Controllers/PublicLinkController.php:71 @@ -320,12 +320,12 @@ msgstr "Invalid icons class" #: ../../../../lib/SP/DataModel/PublicLinkListData.php:88 #: ../../../../lib/SP/Providers/Auth/Ldap/LdapConnection.php:190 -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "ON" msgstr "ON" #: ../../../../lib/SP/DataModel/PublicLinkListData.php:88 -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "OFF" msgstr "OFF" @@ -356,7 +356,8 @@ msgstr "Invalid XML-RPC response" msgid "La sesión no se ha iniciado o ha caducado" msgstr "Session not started or timed out" -#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:124 +#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:119 +#: ../../../../lib/SP/Mvc/Controller/ControllerTrait.php:128 msgid "Acción Inválida" msgstr "Invalid Action" @@ -532,7 +533,7 @@ msgstr "Error while searching the group RDN" #: ../../../modules/web/Controllers/Helpers/Grid/ItemPresetGrid.php:108 #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:118 #: ../../../modules/web/Controllers/UserGroupController.php:231 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:137 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:127 #: ../../../modules/web/themes/material-blue/views/_partials/footer.inc:15 #: ../../../modules/web/themes/material-blue/views/config/encryption.inc:269 #: ../../../modules/web/themes/material-blue/views/config/encryption.inc:272 @@ -622,7 +623,7 @@ msgid "No es posible inicializar" msgstr "Unable to initialize" #: ../../../../lib/SP/Providers/Notification/NotificationHandler.php:124 -#: ../../../modules/web/Controllers/AccountController.php:925 +#: ../../../modules/web/Controllers/AccountController.php:927 msgid "Solicitud" msgstr "Request" @@ -640,8 +641,8 @@ msgid "Cuentas" msgstr "Accounts" #: ../../../../lib/SP/Providers/Notification/NotificationHandler.php:155 -#: ../../../modules/web/Controllers/NotificationController.php:267 -#: ../../../modules/web/Controllers/NotificationController.php:298 +#: ../../../modules/web/Controllers/NotificationController.php:271 +#: ../../../modules/web/Controllers/NotificationController.php:302 msgid "Notificación" msgstr "Notification" @@ -1534,13 +1535,13 @@ msgstr "Account imported" #: ../../../modules/api/Controllers/AccountController.php:190 #: ../../../modules/api/Controllers/AccountController.php:241 #: ../../../modules/api/Controllers/AccountController.php:316 -#: ../../../modules/web/Controllers/AccountController.php:224 -#: ../../../modules/web/Controllers/AccountController.php:719 -#: ../../../modules/web/Controllers/AccountController.php:764 -#: ../../../modules/web/Controllers/AccountController.php:805 -#: ../../../modules/web/Controllers/AccountController.php:844 -#: ../../../modules/web/Controllers/AccountController.php:894 -#: ../../../modules/web/Controllers/AccountController.php:928 +#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:721 +#: ../../../modules/web/Controllers/AccountController.php:766 +#: ../../../modules/web/Controllers/AccountController.php:807 +#: ../../../modules/web/Controllers/AccountController.php:846 +#: ../../../modules/web/Controllers/AccountController.php:896 +#: ../../../modules/web/Controllers/AccountController.php:930 #: ../../../modules/web/Controllers/AccountFileController.php:234 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:112 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:147 @@ -2332,15 +2333,15 @@ msgid "Cuenta visualizada" msgstr "Account displayed" #: ../../../modules/api/Controllers/AccountController.php:102 -#: ../../../modules/web/Controllers/AccountController.php:553 -#: ../../../modules/web/Controllers/AccountController.php:609 +#: ../../../modules/web/Controllers/AccountController.php:555 +#: ../../../modules/web/Controllers/AccountController.php:611 msgid "Clave visualizada" msgstr "Password viewed" #: ../../../modules/api/Controllers/AccountController.php:138 #: ../../../modules/api/Controllers/AccountController.php:144 -#: ../../../modules/web/Controllers/AccountController.php:803 -#: ../../../modules/web/Controllers/AccountController.php:814 +#: ../../../modules/web/Controllers/AccountController.php:805 +#: ../../../modules/web/Controllers/AccountController.php:816 #: ../../../modules/web/Controllers/UserController.php:411 #: ../../../modules/web/Controllers/UserController.php:415 #: ../../../modules/web/Controllers/UserPassResetController.php:189 @@ -2350,22 +2351,22 @@ msgstr "Password updated" #: ../../../modules/api/Controllers/AccountController.php:188 #: ../../../modules/api/Controllers/AccountController.php:194 -#: ../../../modules/web/Controllers/AccountController.php:717 -#: ../../../modules/web/Controllers/AccountController.php:728 +#: ../../../modules/web/Controllers/AccountController.php:719 +#: ../../../modules/web/Controllers/AccountController.php:730 msgid "Cuenta creada" msgstr "Account added" #: ../../../modules/api/Controllers/AccountController.php:239 #: ../../../modules/api/Controllers/AccountController.php:245 -#: ../../../modules/web/Controllers/AccountController.php:762 -#: ../../../modules/web/Controllers/AccountController.php:773 +#: ../../../modules/web/Controllers/AccountController.php:764 +#: ../../../modules/web/Controllers/AccountController.php:775 msgid "Cuenta actualizada" msgstr "Account updated" #: ../../../modules/api/Controllers/AccountController.php:314 #: ../../../modules/api/Controllers/AccountController.php:320 -#: ../../../modules/web/Controllers/AccountController.php:892 -#: ../../../modules/web/Controllers/AccountController.php:897 +#: ../../../modules/web/Controllers/AccountController.php:894 +#: ../../../modules/web/Controllers/AccountController.php:899 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:110 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:115 #: ../../../modules/web/Controllers/AccountManagerController.php:145 @@ -2737,9 +2738,9 @@ msgstr "Group deleted" msgid "Es necesario actualizar" msgstr "Updating needed" -#: ../../../modules/web/Controllers/AccountController.php:148 -#: ../../../modules/web/Controllers/AccountController.php:203 -#: ../../../modules/web/Controllers/AccountController.php:473 +#: ../../../modules/web/Controllers/AccountController.php:150 +#: ../../../modules/web/Controllers/AccountController.php:205 +#: ../../../modules/web/Controllers/AccountController.php:475 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:60 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:61 #: ../../../modules/web/Controllers/Helpers/Grid/AccountGrid.php:159 @@ -2749,21 +2750,21 @@ msgstr "Updating needed" msgid "Detalles de Cuenta" msgstr "Account Details" -#: ../../../modules/web/Controllers/AccountController.php:222 +#: ../../../modules/web/Controllers/AccountController.php:224 msgid "Enlace visualizado" msgstr "Link viewed" -#: ../../../modules/web/Controllers/AccountController.php:223 -#: ../../../modules/web/Controllers/AccountController.php:554 -#: ../../../modules/web/Controllers/AccountController.php:610 -#: ../../../modules/web/Controllers/AccountController.php:649 -#: ../../../modules/web/Controllers/AccountController.php:683 -#: ../../../modules/web/Controllers/AccountController.php:718 -#: ../../../modules/web/Controllers/AccountController.php:763 -#: ../../../modules/web/Controllers/AccountController.php:804 -#: ../../../modules/web/Controllers/AccountController.php:843 -#: ../../../modules/web/Controllers/AccountController.php:893 -#: ../../../modules/web/Controllers/AccountController.php:927 +#: ../../../modules/web/Controllers/AccountController.php:225 +#: ../../../modules/web/Controllers/AccountController.php:556 +#: ../../../modules/web/Controllers/AccountController.php:612 +#: ../../../modules/web/Controllers/AccountController.php:651 +#: ../../../modules/web/Controllers/AccountController.php:685 +#: ../../../modules/web/Controllers/AccountController.php:720 +#: ../../../modules/web/Controllers/AccountController.php:765 +#: ../../../modules/web/Controllers/AccountController.php:806 +#: ../../../modules/web/Controllers/AccountController.php:845 +#: ../../../modules/web/Controllers/AccountController.php:895 +#: ../../../modules/web/Controllers/AccountController.php:929 #: ../../../modules/web/Controllers/AccountFileController.php:233 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:111 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:146 @@ -2777,24 +2778,24 @@ msgstr "Link viewed" msgid "Cuenta" msgstr "Account" -#: ../../../modules/web/Controllers/AccountController.php:225 +#: ../../../modules/web/Controllers/AccountController.php:227 msgid "Agente" msgstr "Agent" -#: ../../../modules/web/Controllers/AccountController.php:226 +#: ../../../modules/web/Controllers/AccountController.php:228 msgid "HTTPS" msgstr "HTTPS" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:255 -#: ../../../modules/web/Controllers/AccountController.php:299 -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:280 +#: ../../../modules/web/Controllers/AccountController.php:257 +#: ../../../modules/web/Controllers/AccountController.php:301 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:279 #: ../../../config/actions.xml:157 msgid "Nueva Cuenta" msgstr "New Account" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:343 +#: ../../../modules/web/Controllers/AccountController.php:345 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:176 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:177 #: ../../../modules/web/themes/material-blue/views/account/linkedAccounts.inc:18 @@ -2803,7 +2804,7 @@ msgid "Editar Cuenta" msgstr "Edit Account" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/AccountController.php:388 +#: ../../../modules/web/Controllers/AccountController.php:390 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:334 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:335 #: ../../../modules/web/Controllers/Helpers/Grid/AccountGrid.php:176 @@ -2815,26 +2816,26 @@ msgstr "Edit Account" msgid "Eliminar Cuenta" msgstr "Remove Account" -#: ../../../modules/web/Controllers/AccountController.php:431 +#: ../../../modules/web/Controllers/AccountController.php:433 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:155 #: ../../../modules/web/Controllers/Helpers/Account/AccountActionsHelper.php:156 msgid "Modificar Clave de Cuenta" msgstr "Edit Account Password" -#: ../../../modules/web/Controllers/AccountController.php:648 -#: ../../../modules/web/Controllers/AccountController.php:682 +#: ../../../modules/web/Controllers/AccountController.php:650 +#: ../../../modules/web/Controllers/AccountController.php:684 msgid "Clave copiada" msgstr "Password copied" -#: ../../../modules/web/Controllers/AccountController.php:842 -#: ../../../modules/web/Controllers/AccountController.php:853 +#: ../../../modules/web/Controllers/AccountController.php:844 +#: ../../../modules/web/Controllers/AccountController.php:855 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:145 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:150 msgid "Cuenta restaurada" msgstr "Account restored" -#: ../../../modules/web/Controllers/AccountController.php:878 -#: ../../../modules/web/Controllers/AccountController.php:881 +#: ../../../modules/web/Controllers/AccountController.php:880 +#: ../../../modules/web/Controllers/AccountController.php:883 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:99 #: ../../../modules/web/Controllers/AccountHistoryManagerController.php:102 #: ../../../modules/web/Controllers/AccountManagerController.php:131 @@ -2842,16 +2843,16 @@ msgstr "Account restored" msgid "Cuentas eliminadas" msgstr "Accounts removed" -#: ../../../modules/web/Controllers/AccountController.php:918 -#: ../../../modules/web/Forms/NotificationForm.php:100 +#: ../../../modules/web/Controllers/AccountController.php:920 +#: ../../../modules/web/Forms/NotificationForm.php:106 msgid "Es necesaria una descripción" msgstr "A description is needed" -#: ../../../modules/web/Controllers/AccountController.php:926 +#: ../../../modules/web/Controllers/AccountController.php:928 msgid "Solicitante" msgstr "Requester" -#: ../../../modules/web/Controllers/AccountController.php:929 +#: ../../../modules/web/Controllers/AccountController.php:931 #: ../../../modules/web/Controllers/Helpers/Grid/CategoryGrid.php:106 #: ../../../modules/web/Controllers/Helpers/Grid/ClientGrid.php:105 #: ../../../modules/web/Controllers/Helpers/Grid/EventlogGrid.php:105 @@ -2865,7 +2866,7 @@ msgstr "Requester" msgid "Descripción" msgstr "Description" -#: ../../../modules/web/Controllers/AccountController.php:942 +#: ../../../modules/web/Controllers/AccountController.php:944 msgid "Solicitud realizada" msgstr "Request done" @@ -3453,7 +3454,7 @@ msgstr "View Current" #: ../../../modules/web/themes/material-blue/views/config/ldap.inc:437 #: ../../../modules/web/themes/material-blue/views/config/mail.inc:206 #: ../../../modules/web/themes/material-blue/views/config/wiki.inc:291 -#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:167 +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:184 msgid "Atrás" msgstr "Back" @@ -3914,7 +3915,7 @@ msgstr "Delete Value" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:108 #: ../../../modules/web/themes/material-blue/inc/Icons.php:65 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:105 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:100 #: ../../../modules/web/themes/material-blue/views/notification/index.inc:1 #: ../../../config/actions.xml:679 msgid "Notificaciones" @@ -3944,14 +3945,14 @@ msgstr "Search for Notification" #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:178 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:179 -#: ../../../modules/web/Controllers/NotificationController.php:179 +#: ../../../modules/web/Controllers/NotificationController.php:183 msgid "Nueva Notificación" msgstr "New Notification" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:196 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:197 -#: ../../../modules/web/Controllers/NotificationController.php:103 +#: ../../../modules/web/Controllers/NotificationController.php:105 #: ../../../config/actions.xml:811 msgid "Ver Notificación" msgstr "View Notification" @@ -3966,7 +3967,7 @@ msgstr "Checkout Notification" #. (itstool) path: action/text #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:244 #: ../../../modules/web/Controllers/Helpers/Grid/NotificationGrid.php:245 -#: ../../../modules/web/Controllers/NotificationController.php:210 +#: ../../../modules/web/Controllers/NotificationController.php:214 #: ../../../config/actions.xml:823 msgid "Editar Notificación" msgstr "Edit Notification" @@ -3979,7 +3980,7 @@ msgid "Eliminar Notificación" msgstr "Delete Notification" #: ../../../modules/web/Controllers/Helpers/Grid/PluginGrid.php:89 -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:336 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:335 #: ../../../modules/web/themes/material-blue/views/plugin/index.inc:1 msgid "Plugins" msgstr "Plugins" @@ -4166,9 +4167,9 @@ msgstr "View User Details" #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:257 #: ../../../modules/web/Controllers/Helpers/Grid/UserGrid.php:258 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:62 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:120 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:126 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:57 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:110 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:116 msgid "Cambiar Clave de Usuario" msgstr "Change User's Password" @@ -4248,13 +4249,13 @@ msgstr "Edit Profile" msgid "Eliminar Perfil" msgstr "Delete Profile" -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:267 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:266 #: ../../../modules/web/themes/material-blue/inc/Icons.php:58 msgid "Buscar" msgstr "Search" #. (itstool) path: action/text -#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:350 +#: ../../../modules/web/Controllers/Helpers/LayoutHelper.php:349 #: ../../../modules/web/themes/material-blue/inc/Icons.php:61 #: ../../../modules/web/themes/material-blue/views/config/ldap.inc:21 #: ../../../modules/web/themes/material-blue/views/itemshow/user_profile.inc:22 @@ -4306,6 +4307,15 @@ msgstr "Value created" msgid "Valor actualizado" msgstr "Value updated" +#: ../../../modules/web/Controllers/ItemsController.php:130 +msgid "No hay no hay notificaciones pendientes" +msgstr "There aren't any pending notifications" + +#: ../../../modules/web/Controllers/ItemsController.php:131 +#, php-format +msgid "Hay notificaciones pendientes: %d" +msgstr "There are pending notifications: %d" + #: ../../../modules/web/Controllers/LoginController.php:119 msgid "Finalizar sesión" msgstr "Logout session" @@ -4318,28 +4328,28 @@ msgstr "Inactive time" msgid "Tiempo total" msgstr "Total time" -#: ../../../modules/web/Controllers/NotificationController.php:251 -#: ../../../modules/web/Controllers/NotificationController.php:254 +#: ../../../modules/web/Controllers/NotificationController.php:255 +#: ../../../modules/web/Controllers/NotificationController.php:258 msgid "Notificaciones eliminadas" msgstr "Notifications deleted" -#: ../../../modules/web/Controllers/NotificationController.php:266 #: ../../../modules/web/Controllers/NotificationController.php:270 +#: ../../../modules/web/Controllers/NotificationController.php:274 msgid "Notificación eliminada" msgstr "Notification deleted" -#: ../../../modules/web/Controllers/NotificationController.php:297 #: ../../../modules/web/Controllers/NotificationController.php:301 +#: ../../../modules/web/Controllers/NotificationController.php:305 msgid "Notificación leída" msgstr "Notification read" -#: ../../../modules/web/Controllers/NotificationController.php:327 -#: ../../../modules/web/Controllers/NotificationController.php:330 +#: ../../../modules/web/Controllers/NotificationController.php:331 +#: ../../../modules/web/Controllers/NotificationController.php:334 msgid "Notificación creada" msgstr "Notification created" -#: ../../../modules/web/Controllers/NotificationController.php:360 -#: ../../../modules/web/Controllers/NotificationController.php:363 +#: ../../../modules/web/Controllers/NotificationController.php:364 +#: ../../../modules/web/Controllers/NotificationController.php:367 msgid "Notificación actualizada" msgstr "Notification updated" @@ -4516,11 +4526,11 @@ msgstr "Profile updated" msgid "Ver Perfil" msgstr "View Profile" -#: ../../../modules/web/Controllers/UserSettingsGeneralController.php:70 +#: ../../../modules/web/Controllers/UserSettingsGeneralController.php:71 msgid "Preferencias actualizadas" msgstr "Preferences updated" -#: ../../../modules/web/Controllers/UserSettingsManagerController.php:92 +#: ../../../modules/web/Controllers/UserSettingsManagerController.php:93 msgid "Preferencias" msgstr "Preferences" @@ -4581,15 +4591,15 @@ msgstr "Invalid regular expression" msgid "Es necesario asignar un elemento del tipo usuario, grupo o perfil" msgstr "An element of type user, group or profile need to be set" -#: ../../../modules/web/Forms/NotificationForm.php:92 +#: ../../../modules/web/Forms/NotificationForm.php:98 msgid "Es necesario un componente" msgstr "A component is needed" -#: ../../../modules/web/Forms/NotificationForm.php:96 +#: ../../../modules/web/Forms/NotificationForm.php:102 msgid "Es necesario un tipo" msgstr "A type is needed" -#: ../../../modules/web/Forms/NotificationForm.php:106 +#: ../../../modules/web/Forms/NotificationForm.php:112 msgid "Es necesario un destinatario" msgstr "A target is needed" @@ -5068,30 +5078,19 @@ msgstr "Clear tracks out?" msgid "Javascript es necesario para el correcto funcionamiento" msgstr "Javascript is needed in order to run correctly" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:40 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:110 -#, php-format -msgid "Hay %d notificaciones pendientes" -msgstr "There are %d unread notifications" - -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:42 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:112 -msgid "No hay no hay notificaciones pendientes" -msgstr "There aren't any pending notifications" - -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:69 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:131 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:64 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:121 msgid "Preferencias de usuario" msgstr "User preferences" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:73 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:76 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:149 -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:152 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:68 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:71 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:139 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:142 msgid "Salir" msgstr "Sign Out" -#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:165 +#: ../../../modules/web/themes/material-blue/views/_partials/fixed-header.inc:155 #: ../../../modules/web/themes/material-blue/views/_partials/footer.inc:43 msgid "Demo" msgstr "Demo" @@ -7171,6 +7170,14 @@ msgid "" "Mostrar las acciones ocultas para los elementos de la búsqueda de cuentas." msgstr "Always show the hidden actions on the accounts search page." +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:165 +msgid "Notificaciones In-App" +msgstr "In-App Notifications" + +#: ../../../modules/web/themes/material-blue/views/usersettings/general.inc:167 +msgid "Habilita la consulta de notificaciones activas In-App." +msgstr "Enables the active In-App notifications polling" + #. (itstool) path: action/text #: ../../../modules/web/themes/material-blue/views/wiki/wikipage.inc:2 #: ../../../config/actions.xml:277 @@ -7552,6 +7559,9 @@ msgstr "Text" msgid "Link" msgstr "Link" +#~ msgid "Hay %d notificaciones pendientes" +#~ msgstr "There are %d unread notifications" + #~ msgid "Id de grupo de usuario" #~ msgstr "User group Id" diff --git a/app/modules/web/Controllers/AccountController.php b/app/modules/web/Controllers/AccountController.php index c1d3a751..79352c19 100644 --- a/app/modules/web/Controllers/AccountController.php +++ b/app/modules/web/Controllers/AccountController.php @@ -102,8 +102,10 @@ final class AccountController extends ControllerBase implements CrudControllerIn public function searchAction() { try { - $AccountSearchHelper = $this->dic->get(AccountSearchHelper::class); - $AccountSearchHelper->getAccountSearch(); + $this->checkSecurityToken($this->session, $this->request); + + $accountSearchHelper = $this->dic->get(AccountSearchHelper::class); + $accountSearchHelper->getAccountSearch(); $this->eventDispatcher->notifyEvent('show.account.search', new Event($this)); diff --git a/app/modules/web/Controllers/BootstrapController.php b/app/modules/web/Controllers/BootstrapController.php index 4764f4ad..74deb497 100644 --- a/app/modules/web/Controllers/BootstrapController.php +++ b/app/modules/web/Controllers/BootstrapController.php @@ -60,6 +60,7 @@ final class BootstrapController extends SimpleControllerBase 'max_file_size' => $this->configData->getFilesAllowedSize(), 'check_updates' => $checkStatus && $this->configData->isCheckUpdates(), 'check_notices' => $checkStatus && $this->configData->isChecknotices(), + 'check_notifications' => $this->getNotificationsEnabled(), 'timezone' => date_default_timezone_get(), 'debug' => DEBUG || $this->configData->isDebug(), 'cookies_enabled' => $this->getCookiesEnabled(), @@ -69,7 +70,8 @@ final class BootstrapController extends SimpleControllerBase 'pki_key' => $this->getPublicKey(), 'pki_max_size' => CryptPKI::getMaxDataSize(), 'import_allowed_exts' => ImportService::ALLOWED_EXTS, - 'files_allowed_exts' => $this->configData->getFilesAllowedExts() + 'files_allowed_exts' => $this->configData->getFilesAllowedExts(), + 'session_timeout' => $this->configData->getSessionTimeout() ]; return $this->returnJsonResponseData($data); @@ -83,6 +85,18 @@ final class BootstrapController extends SimpleControllerBase return require CONFIG_PATH . DIRECTORY_SEPARATOR . 'strings.js.inc'; } + /** + * @return bool + */ + private function getNotificationsEnabled() + { + if ($this->session->isLoggedIn()) { + return $this->session->getUserData()->getPreferences()->isCheckNotifications(); + } + + return false; + } + /** * @return bool */ diff --git a/app/modules/web/Controllers/Helpers/LayoutHelper.php b/app/modules/web/Controllers/Helpers/LayoutHelper.php index 340a89cb..e377e3ca 100644 --- a/app/modules/web/Controllers/Helpers/LayoutHelper.php +++ b/app/modules/web/Controllers/Helpers/LayoutHelper.php @@ -249,7 +249,6 @@ final class LayoutHelper extends HelperBase $this->view->assign('ctx_userName', $userData->getName() ?: mb_strtoupper($userData->getLogin())); $this->view->assign('ctx_userGroup', $userData->getUserGroupName()); $this->view->assign('showPassIcon', !($this->configData->isLdapEnabled() && $userData->getIsLdap())); - $this->view->assign('notifications', 0); } /** diff --git a/app/modules/web/Controllers/ItemsController.php b/app/modules/web/Controllers/ItemsController.php index e8608952..1ed2b1ec 100644 --- a/app/modules/web/Controllers/ItemsController.php +++ b/app/modules/web/Controllers/ItemsController.php @@ -25,6 +25,8 @@ namespace SP\Modules\Web\Controllers; use SP\DataModel\DataModelInterface; +use SP\DataModel\NotificationData; +use SP\Html\Html; use SP\Http\Json; use SP\Http\JsonResponse; use SP\Mvc\View\Components\SelectItemAdapter; @@ -81,7 +83,10 @@ final class ItemsController extends SimpleControllerBase public function clientsAction() { Json::factory($this->router->response()) - ->returnRawJson(SelectItemAdapter::factory($this->dic->get(ClientService::class)->getAllForUser())->getJsonItemsFromModel()); + ->returnRawJson( + SelectItemAdapter::factory( + $this->dic->get(ClientService::class) + ->getAllForUser())->getJsonItemsFromModel()); } /** @@ -94,7 +99,10 @@ final class ItemsController extends SimpleControllerBase public function categoriesAction() { Json::factory($this->router->response()) - ->returnRawJson(SelectItemAdapter::factory($this->dic->get(CategoryService::class)->getAllBasic())->getJsonItemsFromModel()); + ->returnRawJson( + SelectItemAdapter::factory( + $this->dic->get(CategoryService::class) + ->getAllBasic())->getJsonItemsFromModel()); } /** @@ -106,8 +114,29 @@ final class ItemsController extends SimpleControllerBase */ public function notificationsAction() { + $notifications = array_map( + function ($notification) { + /** @@var $notification NotificationData */ + return sprintf('(%s) - %s', $notification->getComponent(), Html::truncate($notification->getDescription(), 30)); + }, $this->dic + ->get(NotificationService::class) + ->getAllActiveForUserId($this->session->getUserData()->getId())); + + $count = count($notifications); + + $jsonResponse = new JsonResponse(); + $jsonResponse->setStatus(0); + $jsonResponse->setData([ + 'message' => __('No hay no hay notificaciones pendientes'), + 'message_has' => sprintf(__('Hay notificaciones pendientes: %d'), $count), + 'count' => $count, + 'notifications' => $notifications, + 'hash' => sha1(implode('', $notifications)) + ]); + $jsonResponse->setCsrf($this->session->getSecurityKey()); + Json::factory($this->router->response()) - ->returnRawJson(Json::getJson($this->dic->get(NotificationService::class)->getAllActiveForUserId($this->session->getUserData()->getId()))); + ->returnJson($jsonResponse); } /** @@ -120,7 +149,10 @@ final class ItemsController extends SimpleControllerBase public function tagsAction() { Json::factory($this->router->response()) - ->returnRawJson(SelectItemAdapter::factory($this->dic->get(TagService::class)->getAllBasic())->getJsonItemsFromModel()); + ->returnRawJson( + SelectItemAdapter::factory( + $this->dic->get(TagService::class) + ->getAllBasic())->getJsonItemsFromModel()); } /** diff --git a/app/modules/web/Controllers/NotificationController.php b/app/modules/web/Controllers/NotificationController.php index d87f133d..2a79527a 100644 --- a/app/modules/web/Controllers/NotificationController.php +++ b/app/modules/web/Controllers/NotificationController.php @@ -75,6 +75,8 @@ final class NotificationController extends ControllerBase implements CrudControl * getSearchGrid * * @return $this + * @throws \DI\DependencyException + * @throws \DI\NotFoundException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ @@ -151,6 +153,8 @@ final class NotificationController extends ControllerBase implements CrudControl /** * @return bool + * @throws \DI\DependencyException + * @throws \DI\NotFoundException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ @@ -369,6 +373,8 @@ final class NotificationController extends ControllerBase implements CrudControl } /** + * @throws \DI\DependencyException + * @throws \DI\NotFoundException * @throws \SP\Services\Auth\AuthException */ protected function initialize() diff --git a/app/modules/web/Controllers/SimpleControllerBase.php b/app/modules/web/Controllers/SimpleControllerBase.php index d714dae8..29dffddb 100644 --- a/app/modules/web/Controllers/SimpleControllerBase.php +++ b/app/modules/web/Controllers/SimpleControllerBase.php @@ -69,12 +69,16 @@ abstract class SimpleControllerBase */ protected function checks() { - $this->checkLoggedInSession($this->session, $this->request, function ($redirect) { - $this->router->response() - ->redirect($redirect) - ->send(true); - }); - $this->checkSecurityToken($this->session, $this->request); + $this->checkLoggedInSession( + $this->session, + $this->request, + function ($redirect) { + $this->router->response() + ->redirect($redirect) + ->send(true); + } + ); +// $this->checkSecurityToken($this->session, $this->request); } /** diff --git a/app/modules/web/Controllers/Traits/JsonTrait.php b/app/modules/web/Controllers/Traits/JsonTrait.php index 2dbb5038..ced1a8d7 100644 --- a/app/modules/web/Controllers/Traits/JsonTrait.php +++ b/app/modules/web/Controllers/Traits/JsonTrait.php @@ -24,6 +24,7 @@ namespace SP\Modules\Web\Controllers\Traits; +use SP\Core\Context\SessionContext; use SP\Core\Exceptions\SPException; use SP\Http\Json; use SP\Http\JsonResponse; @@ -32,6 +33,7 @@ use SP\Http\JsonResponse; * Trait JsonTrait * * @package SP\Modules\Web\Controllers\Traits + * @property SessionContext $session */ trait JsonTrait { @@ -50,6 +52,10 @@ trait JsonTrait $jsonResponse->setStatus($status); $jsonResponse->setDescription($description); + if (property_exists($this, 'session')) { + $jsonResponse->setCsrf($this->session->getSecurityKey()); + } + if (null !== $messages) { $jsonResponse->setMessages($messages); } @@ -73,6 +79,10 @@ trait JsonTrait $jsonResponse->setStatus($status); $jsonResponse->setData($data); + if (property_exists($this, 'session')) { + $jsonResponse->setCsrf($this->session->getSecurityKey()); + } + if (null !== $description) { $jsonResponse->setDescription($description); } diff --git a/app/modules/web/Controllers/UserSettingsGeneralController.php b/app/modules/web/Controllers/UserSettingsGeneralController.php index 6c09f453..c3804734 100644 --- a/app/modules/web/Controllers/UserSettingsGeneralController.php +++ b/app/modules/web/Controllers/UserSettingsGeneralController.php @@ -60,6 +60,7 @@ final class UserSettingsGeneralController extends SimpleControllerBase $userPreferencesData->setTopNavbar($this->request->analyzeBool('top_navbar', false)); $userPreferencesData->setOptionalActions($this->request->analyzeBool('optional_actions', false)); $userPreferencesData->setResultsAsCards($this->request->analyzeBool('resultsascards', false)); + $userPreferencesData->setCheckNotifications($this->request->analyzeBool('check_notifications', false)); try { $this->userService->updatePreferencesById($userData->getId(), $userPreferencesData); diff --git a/app/modules/web/Controllers/UserSettingsManagerController.php b/app/modules/web/Controllers/UserSettingsManagerController.php index e3e62bbc..fcab6593 100644 --- a/app/modules/web/Controllers/UserSettingsManagerController.php +++ b/app/modules/web/Controllers/UserSettingsManagerController.php @@ -87,6 +87,7 @@ final class UserSettingsManagerController extends ControllerBase implements Exte $template->assign('chkTopNavbar', $userPreferences->isTopNavbar() ? 'checked="checked"' : ''); $template->assign('chkOptionalActions', $userPreferences->isOptionalActions() ? 'checked="checked"' : ''); $template->assign('chkResultsAsCards', $userPreferences->isResultsAsCards() ? 'checked="checked"' : ''); + $template->assign('chkNotifications', $userPreferences->isCheckNotifications() ? 'checked="checked"' : ''); $template->assign('route', 'userSettingsGeneral/save'); return new DataTab(__('Preferencias'), $template); diff --git a/app/modules/web/Forms/NotificationForm.php b/app/modules/web/Forms/NotificationForm.php index 8b014fe4..e82d361b 100644 --- a/app/modules/web/Forms/NotificationForm.php +++ b/app/modules/web/Forms/NotificationForm.php @@ -73,11 +73,17 @@ final class NotificationForm extends FormBase implements FormInterface $this->notificationData->setId($this->itemId); $this->notificationData->setType($this->request->analyzeString('notification_type')); $this->notificationData->setComponent($this->request->analyzeString('notification_component')); - $this->notificationData->setDescription(NotificationMessage::factory()->addDescription($this->request->analyzeString('notification_description'))); + + $description = NotificationMessage::factory() + ->addDescription($this->request->analyzeString('notification_description')); + + $this->notificationData->setDescription($description); $this->notificationData->setUserId($this->request->analyzeInt('notification_user')); $this->notificationData->setChecked($this->request->analyzeBool('notification_checkout', false)); - if ($this->context->getUserData()->getIsAdminApp() && $this->notificationData->getUserId() === 0) { + if ($this->context->getUserData()->getIsAdminApp() + && $this->notificationData->getUserId() === 0 + ) { $this->notificationData->setOnlyAdmin($this->request->analyzeBool('notification_onlyadmin', false)); $this->notificationData->setSticky($this->request->analyzeBool('notification_sticky', false)); } diff --git a/app/modules/web/Init.php b/app/modules/web/Init.php index f958d6d2..7f3da76a 100644 --- a/app/modules/web/Init.php +++ b/app/modules/web/Init.php @@ -62,6 +62,10 @@ final class Init extends ModuleBase * like: install/database checks, session/event handlers initialization */ const PARTIAL_INIT = ['resource', 'install', 'bootstrap', 'status', 'upgrade', 'error']; + /** + * List of controllers that don't need to update the user's session activity + */ + const NO_SESSION_ACTIVITY = ['items']; /** * @var SessionContext @@ -195,16 +199,23 @@ final class Init extends ModuleBase // Initialize event handlers $this->initEventHandlers(); - // Initialize user session context - $this->initUserSession(); + if (!in_array($controller, self::NO_SESSION_ACTIVITY)) { + // Initialize user session context + $this->initUserSession(); + } // Load plugins $this->pluginManager->loadPlugins(); - if ($this->context->isLoggedIn() && $this->context->getAppStatus() === SessionContext::APP_STATUS_RELOADED) { + if ($this->context->isLoggedIn() + && $this->context->getAppStatus() === SessionContext::APP_STATUS_RELOADED + ) { logger('Reload user profile'); // Recargar los permisos del perfil de usuario - $this->context->setUserProfile($this->container->get(UserProfileService::class)->getById($this->context->getUserData()->getUserProfileId())->getProfile()); + $this->context->setUserProfile( + $this->container->get(UserProfileService::class) + ->getById($this->context->getUserData() + ->getUserProfileId())->getProfile()); } return; diff --git a/app/modules/web/themes/material-blue/js/app-theme.js b/app/modules/web/themes/material-blue/js/app-theme.js index 510faf98..dd1a60bc 100644 --- a/app/modules/web/themes/material-blue/js/app-theme.js +++ b/app/modules/web/themes/material-blue/js/app-theme.js @@ -33,8 +33,7 @@ sysPass.Theme = function (log) { complete: function () { log.info("ajax:complete"); - // Actualizar componentes de MDL cargados con AJAX - componentHandler.upgradeDom(); + update(); } }; @@ -500,7 +499,17 @@ sysPass.Theme = function (log) { }; /** - * Inicialización + * Triggers an update of the theme components + */ + const update = function () { + log.info("theme:update"); + + // Actualizar componentes de MDL cargados con AJAX + componentHandler.upgradeDom(); + }; + + /** + * Initialization */ const init = function () { }; @@ -510,6 +519,7 @@ sysPass.Theme = function (log) { return { passwordDetect: passwordDetect, password: randomPassword, + update: update, viewsTriggers: viewsTriggers, loading: loading, ajax: ajax, diff --git a/app/modules/web/themes/material-blue/js/app-theme.min.js b/app/modules/web/themes/material-blue/js/app-theme.min.js index 7269a542..d5928ebc 100644 --- a/app/modules/web/themes/material-blue/js/app-theme.min.js +++ b/app/modules/web/themes/material-blue/js/app-theme.min.js @@ -13,9 +13,9 @@ b.attr("id")+"-"+a;var l=c.find("#"+b.attr("id")+"_repeat");l.attr("id",a+"_repe sysPassApp.config.LANG[32]+'">remove_red_eye').prepend(c);b.on("keyup",function(){sysPassApp.util.password.checkLevel(b);this.dataset.pass=b.val()});d=b.parent().next();d.find(".passGen").on("click",function(){e(b);b.blur()});d.find(".passComplexity").on("click",function(){g()});d.find(".showpass").on("mouseover",function(){""!==this.dataset.levelMsg?$(this).attr("title",this.dataset.levelMsg+"\n\n"+b[0].dataset.pass):$(this).attr("title",b[0].dataset.pass)});d.find(".reset").on("click",function(){b.val(""); b[0].dataset.pass="";0remove_red_eye');if(1===a.data("clipboard")){var c=$('content_paste');a.parent().after(c).after(d)}else a.parent().after(d); d.on("mouseover",function(){d.attr("title",a.val())})})},k=function(d){a.info("setupDatePicker");var b={format:"YYYY-MM-DD",lang:sysPassApp.config.BROWSER.LOCALE.substr(0,2),time:!1,cancelText:sysPassApp.config.LANG[44],okText:sysPassApp.config.LANG[43],clearText:sysPassApp.config.LANG[30],nowText:sysPassApp.config.LANG[56],minDate:new Date,triggerEvent:"dateIconClick"};d.find(".password-datefield__input").each(function(){var a=$(this),d=a.parent();a.bootstrapMaterialDatePicker(b);var c=d.find("input[name="+ -a.data("dst-unix")+"]");0'),d=$('
  • '),e=$(''),f=''+(void 0===b||""===b?"description":b)+"";a.forEach(function(a){var b=e.clone();b.append(f);b.append(a);a=d.clone().append(b);c.append(a)});return c},tabs:{add:function(a,b,c,e){a=$(a);if(1===e){a.parent().find("#tabs-"+b).addClass("is-active");var d="is-active"}a.append(''),d=$('
  • '),e=$(''),f=''+(void 0===b||""===b?"description":b)+"";a.forEach(function(a){var b=e.clone();b.append(f);b.append(a);a=d.clone().append(b);c.append(a)});return c},tabs:{add:function(a,b,c,e){a=$(a);if(1===e){a.parent().find("#tabs-"+b).addClass("is-active");var d="is-active"}a.append('
    '+c+"")}}}}}; diff --git a/app/modules/web/themes/material-blue/views/_partials/fixed-header.inc b/app/modules/web/themes/material-blue/views/_partials/fixed-header.inc index 825815f9..e6af50f7 100644 --- a/app/modules/web/themes/material-blue/views/_partials/fixed-header.inc +++ b/app/modules/web/themes/material-blue/views/_partials/fixed-header.inc @@ -31,17 +31,12 @@ data-route="notification/index" data-historyreset="1" data-view="notifications"> - notifications + notifications - - 0): ?> - - - - - + + @@ -100,17 +95,12 @@ data-route="notification/index" data-historyreset="1" data-view="notifications"> - notifications + notifications - - 0): ?> - - - - + diff --git a/app/modules/web/themes/material-blue/views/usersettings/general.inc b/app/modules/web/themes/material-blue/views/usersettings/general.inc index fd610b76..030f9e6b 100644 --- a/app/modules/web/themes/material-blue/views/usersettings/general.inc +++ b/app/modules/web/themes/material-blue/views/usersettings/general.inc @@ -151,6 +151,23 @@ + +
  • +
    + +
    + + + + + + + +
  • diff --git a/lib/SP/Core/Messages/NotificationMessage.php b/lib/SP/Core/Messages/NotificationMessage.php index 269c6377..d1ea97c7 100644 --- a/lib/SP/Core/Messages/NotificationMessage.php +++ b/lib/SP/Core/Messages/NotificationMessage.php @@ -38,13 +38,23 @@ final class NotificationMessage extends MessageBase */ public function composeHtml() { - $message[] = '
    '; - $message[] = '

    ' . $this->title . '

    '; - $message[] = '
    ' . implode('
    ', $this->description) . '
    '; - $message[] = '
    ' . implode('
    ', $this->footer) . '
    '; - $message[] = '
    '; + $message = '
    '; - return implode('', $message); + if ($this->title) { + $message .= '

    ' . $this->title . '

    '; + } + + if (!empty($this->description)) { + $message .= '
    ' . implode('
    ', $this->description) . '
    '; + } + + if (!empty($this->footer)) { + $message .= '
    ' . implode('
    ', $this->footer) . '
    '; + } + + $message .= '
    '; + + return $message; } /** @@ -56,6 +66,20 @@ final class NotificationMessage extends MessageBase */ public function composeText($delimiter = PHP_EOL) { - return $this->title . $delimiter . implode($delimiter, $this->description) . $delimiter . implode($delimiter, $this->footer); + $parts = []; + + if ($this->title) { + $parts[] = $this->title; + } + + if (!empty($this->description)) { + $parts[] = implode($delimiter, $this->description); + } + + if (!empty($this->footer)) { + $parts[] = implode($delimiter, $this->footer); + } + + return implode($delimiter, $parts); } } \ No newline at end of file diff --git a/lib/SP/DataModel/UserPreferencesData.php b/lib/SP/DataModel/UserPreferencesData.php index d2ff3690..1ba12526 100644 --- a/lib/SP/DataModel/UserPreferencesData.php +++ b/lib/SP/DataModel/UserPreferencesData.php @@ -35,12 +35,6 @@ class UserPreferencesData * @var int */ public $user_id = 0; - /** - * Usar autentificación en 2 pasos - * - * @var bool - */ - public $use2Fa = false; /** * Lenguaje del usuario * @@ -77,22 +71,10 @@ class UserPreferencesData * @var bool */ public $resultsAsCards = false; - /** - * @return boolean + * @var bool */ - public function isUse2Fa() - { - return $this->use2Fa; - } - - /** - * @param boolean $use2Fa - */ - public function setUse2Fa($use2Fa) - { - $this->use2Fa = $use2Fa; - } + public $checkNotifications = true; /** * @return string @@ -260,4 +242,20 @@ class UserPreferencesData { $this->resultsAsCards = $resultsAsCards; } + + /** + * @return bool + */ + public function isCheckNotifications(): bool + { + return $this->checkNotifications; + } + + /** + * @param bool $checkNotifications + */ + public function setCheckNotifications(bool $checkNotifications) + { + $this->checkNotifications = $checkNotifications; + } } \ No newline at end of file diff --git a/lib/SP/Mvc/Controller/ControllerTrait.php b/lib/SP/Mvc/Controller/ControllerTrait.php index a3b8a608..27ea2345 100644 --- a/lib/SP/Mvc/Controller/ControllerTrait.php +++ b/lib/SP/Mvc/Controller/ControllerTrait.php @@ -105,14 +105,18 @@ trait ControllerTrait /** * @param ContextInterface $context * @param Request $request + * + * @throws SPException */ protected function checkSecurityToken(ContextInterface $context, Request $request) { $sk = $request->analyzeString('sk'); $sessionKey = $context->getSecurityKey(); - if (!$sk || (null !== $sessionKey && $sessionKey !== $sk)) { - $this->invalidAction(); + if (!$sk + || (null !== $sessionKey && $sessionKey !== $sk) + ) { + throw new SPException(__u('Acción Inválida')); } } diff --git a/lib/SP/Plugin/PluginManager.php b/lib/SP/Plugin/PluginManager.php index 9a4f8a22..10a3708b 100644 --- a/lib/SP/Plugin/PluginManager.php +++ b/lib/SP/Plugin/PluginManager.php @@ -179,11 +179,11 @@ final class PluginManager if ($pluginData->getEnabled() === 1) { $plugin->onLoadData($pluginData); - - return $plugin; } else { $this->disabledPlugins[] = $name; } + + return $plugin; } catch (\Exception $e) { processException($e); diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index 5b15d51a..c802bfc0 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -57,7 +57,7 @@ final class Installer extends Service */ const VERSION = [3, 0, 0]; const VERSION_TEXT = '3.0-beta'; - const BUILD = 18101501; + const BUILD = 18101601; /** * @var DatabaseSetupInterface diff --git a/public/js/app-actions.js b/public/js/app-actions.js index bf28c0c5..61f11ff5 100644 --- a/public/js/app-actions.js +++ b/public/js/app-actions.js @@ -86,7 +86,7 @@ sysPass.Actions = function (log) { opts.addHistory = true; opts.data = data; - sysPassApp.requests.getActionCall(opts, function (response) { + return sysPassApp.requests.getActionCall(opts, function (response) { const $content = $("#content"); $content.empty().html(response); @@ -722,27 +722,26 @@ sysPass.Actions = function (log) { if (json.status === 0) { if (json.data.length > 0) { $updates.html( - '' + json.data.title + - '
    cloud_download
    ' + - '
    ' + json.data.description + ''); + `${json.data.title} +
    cloud_download
    +
    + ${json.data.description}`); } else { $updates.html( - '
    check_circle
    ' + - '' + sysPassApp.config.LANG[68] + ''); + `
    check_circle
    + ${sysPassApp.config.LANG[68]}`); } } else { $updates.html( - '
    warning
    ' + - '' + sysPassApp.config.LANG[69] + ''); + `
    warning
    + ${sysPassApp.config.LANG[69]}`); } - if (componentHandler !== undefined) { - componentHandler.upgradeDom(); - } + sysPassApp.theme.update(); }, function () { $updates.html( - '
    warning
    ' + - '' + sysPassApp.config.LANG[69] + ''); + `
    warning
    + ${sysPassApp.config.LANG[69]}`); }); }, getNotices: function () { @@ -761,19 +760,18 @@ sysPass.Actions = function (log) { if (json.status === 0) { if (json.data.length > 0) { $notices.html( - '' + - '
    feedback
    ' + - '' + - '
    ' + sysPassApp.config.LANG[70] + '
    ' + - json.data.map(x => x.title).join('
    ') + - '
    '); + ` +
    feedback
    +
    + +
    ${sysPassApp.config.LANG[70]}
    ${json.data.map(x => x.title).join('
    ')} +
    `); } } - if (componentHandler !== undefined) { - componentHandler.upgradeDom(); - } + sysPassApp.theme.update(); }); } }; @@ -1451,13 +1449,13 @@ sysPass.Actions = function (log) { }; sysPassApp.requests.getActionCall(opts, function (json) { - sysPassApp.msg.out(json); - if (json.status === 0) { getContent({r: $obj.data("action-next")}); } sysPassApp.sk.set(json.csrf); + + notification.getActive(); }); }, search: function ($obj) { @@ -1481,9 +1479,11 @@ sysPass.Actions = function (log) { sysPassApp.msg.out(json); if (json.status === 0) { - getContent({r: $obj.data("action-next")}); - $.magnificPopup.close(); + + getContent({r: $obj.data("action-next")}).then(function () { + notification.getActive(); + }); } }); }, @@ -1521,7 +1521,29 @@ sysPass.Actions = function (log) { }; sysPassApp.requests.getActionCall(opts, function (json) { - return json; + const $badge = $(".notifications-badge"); + const $tooltip = $(".notifications-tooltip"); + + $badge.each(function () { + const $this = $(this); + $this.attr("data-badge", json.data.count); + + if (json.data.count === 0) { + $this.removeClass($this.data("color-class")); + $tooltip.empty().html(json.data.message); + } else { + $this.addClass($this.data("color-class")); + $tooltip.empty().html(json.data.message_has); + } + }); + + if (json.data.count > 0) { + sysPassApp.util.sendNotification( + json.data.message_has, + json.data.notifications.join('\n'), + json.data.hash + ); + } }); }, nav: function ($obj) { diff --git a/public/js/app-actions.min.js b/public/js/app-actions.min.js index 09deaefa..1e6028a2 100644 --- a/public/js/app-actions.min.js +++ b/public/js/app-actions.min.js @@ -1,8 +1,8 @@ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(d,l,e){d instanceof String&&(d=String(d));for(var f=d.length,h=0;h'+b+""),k=c.find("img");if(0===k.length)return h(b);k.hide();$.magnificPopup.open({items:{src:c,type:"inline"}, +sysPass.Actions=function(d){var l=0,e={entrypoint:"/index.php"};Object.freeze(e);var f=function(a,b){d.info("getContent");a.isAjax=1;var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.method="get";c.type="html";c.addHistory=!0;c.data=a;return sysPassApp.requests.getActionCall(c,function(a){var c=$("#content");c.empty().html(a);a=sysPassApp.triggers.views;a.common(c);if(void 0!==b&&"function"===typeof a[b])a[b]();c=$(".mdl-layout__content");0'+b+""),k=c.find("img");if(0===k.length)return h(b);k.hide();$.magnificPopup.open({items:{src:c,type:"inline"}, callbacks:{open:function(){var a=this;k.on("click",function(){a.close()});setTimeout(function(){var a=sysPassApp.util.resizeImage(k);c.css({backgroundColor:"#fff",width:a.width,height:"auto"});k.show("slow")},500)}}})},q=function(){$.magnificPopup.close()},n={view:function(a){d.info("account:show");f(sysPassApp.requests.getRouteForQuery(a.data("action-route"),a.data("item-id")),"account")},viewHistory:function(a){d.info("account:showHistory");f(sysPassApp.requests.getRouteForQuery(a.data("action-route"), a.val()),"account")},edit:function(a){d.info("account:edit");f(sysPassApp.requests.getRouteForQuery(a.data("action-route"),a.data("item-id")),"account")},delete:function(a){d.info("account:delete");var b='

    '+sysPassApp.config.LANG[3]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(c){c= sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.data={r:"account/saveDelete/"+a.data("item-id"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(c,function(c){sysPassApp.msg.out(c);n.search(a)})}}})},viewPass:function(a){d.info("account:viewPass");var b=a.data("parent-id")||0,c=0===b?a.data("item-id"):b,k=sysPassApp.requests.getRequestOpts();k.url=e.entrypoint;k.method="get";k.data={r:a.data("action-route")+"/"+c+"/"+b,sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(k, @@ -13,44 +13,45 @@ a.data.nextAction&&f({r:a.data.nextAction.nextAction},"account")})},menu:functio b),"account")},saveEditRestore:function(a){d.info("account:restore");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route")+"/"+a.data("history-id")+"/"+a.data("item-id");b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);void 0!==a.data.itemId&&void 0!==a.data.nextAction&&f(sysPassApp.requests.getRouteForQuery(a.data.nextAction,a.data.itemId),"account")})},listFiles:function(a){d.info("account:getfiles");var b=sysPassApp.requests.getRequestOpts(); b.method="get";b.type="html";b.url=e.entrypoint;b.data={r:a.data("action-route")+"/"+a.data("item-id"),del:a.data("delete"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(b,function(c){a.html(c)})},search:function(a){d.info("account:search");var b=$("#frmSearch");b.find("input[name='sk']").val(sysPassApp.sk.get());b.find("input[name='skey']").val();b.find("input[name='sorder']").val();void 0!==a&&b.find("input[name='start']").val(0);a=sysPassApp.requests.getRequestOpts();a.url=e.entrypoint+ "?r="+b.data("action-route");a.method="get";a.data=b.serialize();sysPassApp.requests.getActionCall(a,function(a){10===a.status&&sysPassApp.msg.out(a);sysPassApp.sk.set(a.data.sk);$("#res-content").empty().html(a.data.html)})},save:function(a){d.info("account:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route")+"/"+a.data("item-id");b.data=a.serialize();$("select.select-box-tags[data-hash][data-updated=true]").each(function(a,k){b.data+="&"+k.getAttribute("id")+ -"_update=1"});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);void 0!==a.data.itemId&&void 0!==a.data.nextAction&&f(sysPassApp.requests.getRouteForQuery(a.data.nextAction,a.data.itemId),"account")})}},v={logout:function(){sysPassApp.util.redirect("index.php?r=login/logout")},login:function(a){d.info("main:login");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.method="get";b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(b){var c= +"_update=1"});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);void 0!==a.data.itemId&&void 0!==a.data.nextAction&&f(sysPassApp.requests.getRouteForQuery(a.data.nextAction,a.data.itemId),"account")})}},w={logout:function(){sysPassApp.util.redirect("index.php?r=login/logout")},login:function(a){d.info("main:login");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.method="get";b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(b){var c= $(".extra-hidden");switch(b.status){case 0:sysPassApp.util.redirect(b.data.url);break;case 2:sysPassApp.msg.out(b);a.find("input[type='text'],input[type='password']").val("");a.find("input:visible:first").focus();0

    '+sysPassApp.config.LANG[59]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){var c;(b=a.find("input[name='taskId']").val())&&(c=u(b));var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint+"?r="+a.data("action-route");d.method="get";d.useFullLoading=!!b;d.data=a.serialize(); +'

    '+sysPassApp.config.LANG[59]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){var c;(b=a.find("input[name='taskId']").val())&&(c=v(b));var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint+"?r="+a.data("action-route");d.method="get";d.useFullLoading=!!b;d.data=a.serialize(); sysPassApp.requests.getActionCall(d,function(b){sysPassApp.msg.out(b);0!==b.status?a.find(":input[name=key]").val(""):(void 0!==c&&c.close(),setTimeout(function(){sysPassApp.util.redirect("index.php")},5E3))})}}})},getUpdates:function(){d.info("main:getUpdates");var a=sysPassApp.requests.getRequestOpts();a.url=e.entrypoint+"?r=status/checkRelease";a.method="get";a.timeout=1E4;a.useLoading=!1;a.data={isAjax:1};var b=$("#updates");sysPassApp.requests.getActionCall(a,function(a){0===a.status?0'+a.data.title+'
    cloud_download
    '+a.data.description+""):b.html('
    check_circle
    '+sysPassApp.config.LANG[68]+ -""):b.html('
    warning
    '+sysPassApp.config.LANG[69]+"");void 0!==componentHandler&&componentHandler.upgradeDom()},function(){b.html('
    warning
    '+sysPassApp.config.LANG[69]+ -"")})},getNotices:function(){d.info("main:getNotices");var a=sysPassApp.requests.getRequestOpts();a.url=e.entrypoint+"?r=status/checkNotices";a.method="get";a.timeout=1E4;a.useLoading=!1;a.data={isAjax:1};var b=$("#notices");sysPassApp.requests.getActionCall(a,function(a){0===a.status&&0
    feedback
    '+sysPassApp.config.LANG[70]+"
    "+a.data.map(function(a){return a.title}).join("
    ")+"
    ");void 0!==componentHandler&&componentHandler.upgradeDom()})}},g={state:{tab:{index:0,refresh:!0,route:""},itemId:0,update:function(a){var b=$("#content").find("[id^='tabs-'].is-active");0",d=m.getSelection(a);!1!==d&&mdlDialog().show({text:c,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(a){a.preventDefault();"function"===typeof b&&b(d)}}})},getSelection:function(a){a=a.data("selection");var b=[];return a&&($(a).find(".is-selected").each(function(){b.push($(this).data("item-id"))}), -0===b.length)?!1:b}},u=function(a){var b=$("#taskStatus");b.empty().html(sysPassApp.config.LANG[62]);var c=sysPassApp.requests.getRequestOpts();c.method="get";c.url=e.entrypoint+"?r=task/runTask/"+a;return sysPassApp.requests.getActionEvent(c,function(a){a=a.task+" - "+a.message+" - "+a.time+" - "+a.progress+"%";a+="
    "+sysPassApp.config.LANG[62];b.empty().html(a)})};return{doAction:function(a,b){a={r:a.r+(void 0!==a.itemId?"/"+a.itemId:""),isAjax:1};var c=sysPassApp.requests.getRequestOpts();c.url= -e.entrypoint;c.method="get";c.type="html";c.addHistory=!0;c.data=a;sysPassApp.requests.getActionCall(c,function(a){var c=$("#content");c.empty().html(a);a=sysPassApp.triggers.views;a.common(c);if(void 0!==b&&"function"===typeof a[b])a[b]();c=$(".mdl-layout__content");0'+a.data.title+'\n
    cloud_download
    \n \n '+a.data.description+""):b.html('
    check_circle
    \n '+ +sysPassApp.config.LANG[68]+""):b.html('
    warning
    \n '+sysPassApp.config.LANG[69]+"");sysPassApp.theme.update()},function(){b.html('
    warning
    \n '+ +sysPassApp.config.LANG[69]+"")})},getNotices:function(){d.info("main:getNotices");var a=sysPassApp.requests.getRequestOpts();a.url=e.entrypoint+"?r=status/checkNotices";a.method="get";a.timeout=1E4;a.useLoading=!1;a.data={isAjax:1};var b=$("#notices");sysPassApp.requests.getActionCall(a,function(a){0===a.status&&0\n
    feedback
    \n \n \n
    '+sysPassApp.config.LANG[70]+"
    "+a.data.map(function(a){return a.title}).join("
    ")+"\n
    ");sysPassApp.theme.update()})}},g={state:{tab:{index:0,refresh:!0,route:""},itemId:0,update:function(a){var b=$("#content").find("[id^='tabs-'].is-active"); +0",d=m.getSelection(a);!1!==d&&mdlDialog().show({text:c,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(a){a.preventDefault();"function"===typeof b&&b(d)}}})},getSelection:function(a){a=a.data("selection");var b=[];return a&&($(a).find(".is-selected").each(function(){b.push($(this).data("item-id"))}),0===b.length)?!1: +b}},v=function(a){var b=$("#taskStatus");b.empty().html(sysPassApp.config.LANG[62]);var c=sysPassApp.requests.getRequestOpts();c.method="get";c.url=e.entrypoint+"?r=task/runTask/"+a;return sysPassApp.requests.getActionEvent(c,function(a){a=a.task+" - "+a.message+" - "+a.time+" - "+a.progress+"%";a+="
    "+sysPassApp.config.LANG[62];b.empty().html(a)})};return{doAction:function(a,b){a={r:a.r+(void 0!==a.itemId?"/"+a.itemId:""),isAjax:1};var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint; +c.method="get";c.type="html";c.addHistory=!0;c.data=a;sysPassApp.requests.getActionCall(c,function(a){var c=$("#content");c.empty().html(a);a=sysPassApp.triggers.views;a.common(c);if(void 0!==b&&"function"===typeof a[b])a[b]();c=$(".mdl-layout__content");0";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}}, positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&n.listFiles($("#list-account-files"))})}}})}},checks:{wiki:function(a){d.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(sysPassApp.sk.get());var b=sysPassApp.requests.getRequestOpts(); b.url=e.entrypoint;b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}},config:{save:function(a){d.info("config:save");g.save(a)},masterpass:function(a){var b='

    '+sysPassApp.config.LANG[59]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(b){b.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44]);a.find(":input[type=password]").val("")}}, -positive:{title:sysPassApp.config.LANG[43],onClick:function(b){var c;(b=a.find("input[name='taskId']").val())&&(c=u(b));var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint;d.useFullLoading=!!b;d.data=a.serialize();sysPassApp.requests.getActionCall(d,function(b){sysPassApp.msg.out(b);a.find(":input[type=password]").val("");void 0!==c&&c.close()})}}})},backup:function(a){d.info("config:backup");g.state.update(a);var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route"); +positive:{title:sysPassApp.config.LANG[43],onClick:function(b){var c;(b=a.find("input[name='taskId']").val())&&(c=v(b));var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint;d.useFullLoading=!!b;d.data=a.serialize();sysPassApp.requests.getActionCall(d,function(b){sysPassApp.msg.out(b);a.find(":input[type=password]").val("");void 0!==c&&c.close()})}}})},backup:function(a){d.info("config:backup");g.state.update(a);var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route"); b.useFullLoading=!0;b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&f({r:g.state.tab.route,tabIndex:g.state.tab.index})})},export:function(a){d.info("config:export");g.save(a)},import:function(a){d.info("config:import");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route");b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a)})}, refreshMpass:function(a){d.info("config:import");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route");b.data={sk:a.data("sk"),isAjax:1};sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a)})},mailCheck:function(a){d.info("config:mailCheck");var b=$(a.data("src")),c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a)})}}, -main:v,user:{showSettings:function(a){d.info("user:showSettings");f({r:a.data("action-route")},"userSettings")},saveSettings:function(a){d.info("user:saveSettings");g.save(a)},password:function(a){d.info("user:password");var b=sysPassApp.requests.getRequestOpts();b.type="html";b.method="get";b.url=e.entrypoint;b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(a){0===a.length?v.logout():h(a)})},passreset:function(a){d.info("user:passreset"); +main:w,user:{showSettings:function(a){d.info("user:showSettings");f({r:a.data("action-route")},"userSettings")},saveSettings:function(a){d.info("user:saveSettings");g.save(a)},password:function(a){d.info("user:password");var b=sysPassApp.requests.getRequestOpts();b.type="html";b.method="get";b.url=e.entrypoint;b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(a){0===a.length?w.logout():h(a)})},passreset:function(a){d.info("user:passreset"); var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"/?r="+a.data("action-route");b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&setTimeout(function(){sysPassApp.util.redirect("index.php")},2E3)})}},link:{save:function(a){d.info("link:save");var b=function(b){var c=a.data("account-id"),d=sysPassApp.requests.getRequestOpts();c?d.url=e.entrypoint+"?r="+a.data("action-route")+"/"+c+"/"+b:(d.url=e.entrypoint+"?r="+a.data("action-route"), d.data=a.serialize());sysPassApp.requests.getActionCall(d,function(b){sysPassApp.msg.out(b);0===b.status&&f({r:a.data("action-next")+"/"+c})})},c='

    '+sysPassApp.config.LANG[48]+"

    ";mdlDialog().show({text:c,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();b(0)}},positive:{title:sysPassApp.config.LANG[43],onClick:function(a){a.preventDefault();b(1)}}})},delete:function(a){d.info("link:delete");var b='

    '+ sysPassApp.config.LANG[12]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();b=a.data("item-id");var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route")+"/"+b;sysPassApp.requests.getActionCall(c,function(b){sysPassApp.msg.out(b);0===b.status&&f({r:a.data("action-next")+ "/"+a.data("account-id")})})}}})},refresh:function(a){d.info("link:refresh");g.state.update(a);var b=a.data("item-id"),c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+b,sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(c,function(b){sysPassApp.msg.out(b);0===b.status&&((b=a.data("action-next"))?f({r:b+"/"+a.data("account-id")}):f({r:g.state.tab.route,tabIndex:g.state.tab.index}))})}},eventlog:{clear:function(a){var b='

    '+ sysPassApp.config.LANG[20]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})}},ajaxUrl:e,plugin:{toggle:function(a){d.info("plugin:enable");g.state.update(a);var b=a.data("item-id"),c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.method="get";c.data={r:a.data("action-route")+ "/"+b,sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a);0===a.status&&setTimeout(function(){sysPassApp.util.redirect("index.php")},2E3)})},reset:function(a){d.info("plugin:reset");var b='

    '+sysPassApp.config.LANG[58]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43], -onClick:function(b){b.preventDefault();g.save(a)}}})},search:function(a){d.info("plugin:search");m.search(a)},show:function(a){d.info("plugin:show");t.show(a)},save:function(a){d.info("plugin:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&(f({r:a.data("action-next")}),$.magnificPopup.close())})},nav:function(a){d.info("plugin:nav");m.nav(a)}},notification:{check:function(a){d.info("notification:check"); -var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&f({r:a.data("action-next")});sysPassApp.sk.set(b.csrf)})},search:function(a){d.info("notification:search");m.search(a)},show:function(a){d.info("notification:show");t.show(a)},save:function(a){d.info("notification:save");var b=sysPassApp.requests.getRequestOpts(); -b.url=e.entrypoint+"?r="+a.data("route");b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&(f({r:a.data("action-next")}),$.magnificPopup.close())})},delete:function(a){d.info("notification:delete");m.delete(a,function(b){var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.method="get";c.data={r:a.data("action-route")+(0===b.length?"/"+a.data("item-id"):""),items:b,sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(c, -function(b){sysPassApp.msg.out(b);f({r:a.data("action-next")})})})},getActive:function(){d.info("notification:getActive");var a=sysPassApp.requests.getRequestOpts();a.url=e.entrypoint;a.method="get";a.data={r:"items/notifications",sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(a,function(a){return a})},nav:function(a){d.info("eventlog:nav");m.nav(a)}},wiki:{show:function(a){d.info("wiki:show");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data= -{pageName:a.data("pagename"),actionId:a.data("action-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(a){0!==a.status?sysPassApp.msg.out(a):h(a.data.html)})}},items:{get:function(a){d.info("items:get");var b=a[0].selectize;b.clearOptions();b.load(function(c){var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint;d.method="get";d.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:a.data("sk")};sysPassApp.requests.getActionCall(d,function(d){c(d.data);b.setValue(a.data("selected-id"), -!0);sysPassApp.triggers.updateFormHash()})})},update:function(a){d.info("items:update");var b=$("#"+a.data("item-dst"))[0].selectize,c=b.getValue();b.clearOptions();b.load(function(d){var f=sysPassApp.requests.getRequestOpts();f.url=e.entrypoint;f.method="get";f.data={r:a.data("item-route"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(f,function(a){d(a);b.setValue(c,!0)})})}},ldap:{check:function(a){d.info("ldap:check");var b=$(a.data("src")),c=sysPassApp.requests.getRequestOpts();c.url= -e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&h(a.data.template,{open:function(){var b=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){b.append(sysPassApp.theme.html.getList(a.items,a.icon))})}})})},import:function(a){d.info("ldap:import");var b='

    '+sysPassApp.config.LANG[57]+ -"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b=$(a.data("src"));var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a)})}}})}},track:{unlock:function(a){d.info("track:unlock"); -var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);g.refresh(a)})},clear:function(a){d.info("track:clear");var b='

    '+sysPassApp.config.LANG[71]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}}, -positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})}}}}; +onClick:function(b){b.preventDefault();g.save(a)}}})},search:function(a){d.info("plugin:search");m.search(a)},show:function(a){d.info("plugin:show");t.show(a)},save:function(a){d.info("plugin:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.data=a.serialize();sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&(f({r:a.data("action-next")}),$.magnificPopup.close())})},nav:function(a){d.info("plugin:nav");m.nav(a)}},notification:u, +wiki:{show:function(a){d.info("wiki:show");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data={pageName:a.data("pagename"),actionId:a.data("action-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(a){0!==a.status?sysPassApp.msg.out(a):h(a.data.html)})}},items:{get:function(a){d.info("items:get");var b=a[0].selectize;b.clearOptions();b.load(function(c){var d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint;d.method="get";d.data= +{r:a.data("action-route")+"/"+a.data("item-id"),sk:a.data("sk")};sysPassApp.requests.getActionCall(d,function(d){c(d.data);b.setValue(a.data("selected-id"),!0);sysPassApp.triggers.updateFormHash()})})},update:function(a){d.info("items:update");var b=$("#"+a.data("item-dst"))[0].selectize,c=b.getValue();b.clearOptions();b.load(function(d){var f=sysPassApp.requests.getRequestOpts();f.url=e.entrypoint;f.method="get";f.data={r:a.data("item-route"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(f, +function(a){d(a);b.setValue(c,!0)})})}},ldap:{check:function(a){d.info("ldap:check");var b=$(a.data("src")),c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&h(a.data.template,{open:function(){var b=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){b.append(sysPassApp.theme.html.getList(a.items, +a.icon))})}})})},import:function(a){d.info("ldap:import");var b='

    '+sysPassApp.config.LANG[57]+"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b=$(a.data("src"));var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+ +sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a)})}}})}},track:{unlock:function(a){d.info("track:unlock");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.method="get";b.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);g.refresh(a)})},clear:function(a){d.info("track:clear");var b='

    '+sysPassApp.config.LANG[71]+ +"

    ";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})}}}}; diff --git a/public/js/app-config.js b/public/js/app-config.js index b1e66659..845c78cd 100644 --- a/public/js/app-config.js +++ b/public/js/app-config.js @@ -55,7 +55,8 @@ sysPass.Config = function () { AUTH: { LOGGEDIN: false, AUTHBASIC_AUTOLOGIN: false - } + }, + SESSION_TIMEOUT: 0 }; return { @@ -65,6 +66,9 @@ sysPass.Config = function () { setLang: function (lang) { config.LANG = lang; }, + setSessionTimeout: function (timeout) { + config.SESSION_TIMEOUT = parseInt(timeout); + }, setPkiKey: function (key) { if (key.length > 0) { config.PKI.KEY = key; diff --git a/public/js/app-config.min.js b/public/js/app-config.min.js index 76b312d9..afa1bba6 100644 --- a/public/js/app-config.min.js +++ b/public/js/app-config.min.js @@ -1,3 +1,3 @@ -sysPass.Config=function(){var b={APP_ROOT:"",LANG:[],PKI:{AVAILABLE:!1,KEY:"",MAX_SIZE:0,CRYPTO:null},FILES:{MAX_SIZE:1024,ACCOUNT_ALLOWED_EXTS:[],IMPORT_ALLOWED_EXTS:[]},STATUS:{CHECK_UPDATES:!1,CHECK_NOTICES:!1,CHECK_NOTIFICATIONS:!1},BROWSER:{TIMEZONE:"UTC",LOCALE:"en_US",COOKIES_ENABLED:!1},DEBUG:!0,PLUGINS:[],AUTH:{LOGGEDIN:!1,AUTHBASIC_AUTOLOGIN:!1}};return{setAppRoot:function(a){b.APP_ROOT=a},setLang:function(a){b.LANG=a},setPkiKey:function(a){0"+a.messages.join("
    "));switch(c){case 0:this.ok(b);break;case 1:this.error(b);break;case 2:this.warn(b);break;case 10:sysPassApp.actions.main.logout();break; case 100:this.ok(b);this.sticky(b);break;case 101:this.error(b);this.sticky(b);break;case 102:this.warn(b);this.sticky(b);break;default:this.error(b)}}},html:{error:function(a){return'

    Oops...
    '+b.config.LANG[1]+"
    "+a+"

    "}}};Object.freeze(e);String.format||(String.format=function(a){var b=Array.prototype.slice.call(arguments,1);return a.replace(/{(\d+)}/g,function(a,c){return"undefined"!==typeof b[c]?b[c]:a})});var r=function(){d.info("getEnvironment");var a=window.location.pathname.split("/"), -c=sysPass.Config();c.setAppRoot(window.location.protocol+"//"+window.location.host+function(){for(var b="",c=1;c<=a.length-2;c++)b+="/"+a[c];return b}());var f=b.requests.getRequestOpts();f.url="/index.php?r=bootstrap/getEnvironment";f.method="get";f.useLoading=!1;f.data={isAjax:1};return b.requests.getActionCall(f,function(a){void 0!==a.data&&(c.setLang(a.data.lang),c.setPkiKey(a.data.pki_key),c.setPkiSize(a.data.pki_max_size),c.setCheckUpdates(a.data.check_updates),c.setCheckNotices(a.data.check_notices), -c.setTimezone(a.data.timezone),c.setLocale(a.data.locale),c.setDebugEnabled(a.data.debug),c.setFileMaxSize(a.data.max_file_size),c.setFileAccountAllowedExts(a.data.files_allowed_exts),c.setFileImportAllowedExts(a.data.import_allowed_exts),c.setCookiesEnabled(a.data.cookies_enabled),c.setPlugins(a.data.plugins),c.setLoggedIn(a.data.loggedin),c.setAuthBasicAutologinEnabled(a.data.authbasic_autologin),c.initialize(),b.config=c.getConfig())}).fail(function(){e.error("Error while getting sysPass config
    Please try again or check web server logs")})}, -b={config:sysPass.Config().getConfig(),actions:sysPass.Actions(d),triggers:sysPass.Triggers(d),util:sysPass.Util(d),theme:{},plugins:{},sk:h,msg:e,log:d,encryptFormValue:g},n=function(a){for(var b=[],d,e=window.location.href.slice(window.location.href.indexOf("?")+1).split("&"),g=0;gPlease try again or check web server logs")})},b={config:sysPass.Config().getConfig(),actions:sysPass.Actions(d),triggers:sysPass.Triggers(d),util:sysPass.Util(d),theme:{},plugins:{},sk:h,msg:e,log:d,encryptFormValue:g},n=function(a){for(var b=[],d,e=window.location.href.slice(window.location.href.indexOf("?")+1).split("&"),g=0;g" + errorThrown + textStatus + "

    "; + txt = sysPassApp.config.LANG[1]; } else { - txt = "An error occurred

    " + errorThrown + " (" + textStatus + ")

    "; + txt = "An error occurred"; } + txt += `

    ${errorThrown}

    ${jqXHR.responseText}

    `; + log.error(txt); if (opts.type === "html") { - $("#content").html(sysPassApp.msg.html.error(errorThrown)); + $("#content").html(sysPassApp.msg.html.error(txt)); } sysPassApp.msg.error(txt); diff --git a/public/js/app-requests.min.js b/public/js/app-requests.min.js index 525fa8e0..f782c35e 100644 --- a/public/js/app-requests.min.js +++ b/public/js/app-requests.min.js @@ -1,5 +1,5 @@ -sysPass.Requests=function(c){var e=c.log,b=[],h={type:"json",url:"",method:"post",callback:"",async:!0,data:"",cache:!1,processData:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",timeout:0,addHistory:!1,hash:"",useLoading:!0,useFullLoading:!1};Object.seal(h);var k={get:function(){return b},add:function(a){var d=""===a.hash?c.util.hash.md5(JSON.stringify(a)):a.hash;if(0"+g+d+"

    ":"An error occurred

    "+g+" ("+d+")

    ",e.error(b),"html"===a.type&&$("#content").html(c.msg.html.error(g)),c.msg.error(b)):m()},complete:function(b){!0===a.useLoading&& -c.theme.loading.hide();"json"===a.type&&void 0!==b.responseJSON&&void 0!==b.responseJSON.csrf&&""!==b.responseJSON.csrf&&c.sk.set(b.responseJSON.csrf);void 0!==c.theme&&c.theme.ajax.complete()}})},getActionEvent:function(a,b,c){var d=l(a.url),d=d+("?"+$.param(a.data)),f=new EventSource(d);f.addEventListener("message",function(a){a=JSON.parse(a.data);e.debug(a);1===a.end?(e.info("getActionEvent:Ending"),f.close(),"function"===typeof c&&c(a)):"function"===typeof b&&b(a)});f.addEventListener("error", -function(a){e.error("getActionEvent:Error occured");f.close()});return f},getRouteForQuery:function(a,b){return"object"===typeof b?{r:a+"/"+b.join("/")}:{r:a+"/"+b}},history:k}}; +sysPass.Requests=function(c){var e=c.log,b=[],g={type:"json",url:"",method:"post",callback:"",async:!0,data:"",cache:!1,processData:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",timeout:0,addHistory:!1,hash:"",useLoading:!0,useFullLoading:!1};Object.seal(g);var h={get:function(){return b},add:function(a){var f=""===a.hash?c.util.hash.md5(JSON.stringify(a)):a.hash;if(0

    "+b.responseText+"

    ",e.error(d),"html"===a.type&&$("#content").html(c.msg.html.error(d)),c.msg.error(d)):l()},complete:function(b){!0===a.useLoading&& +c.theme.loading.hide();"json"===a.type&&void 0!==b.responseJSON&&void 0!==b.responseJSON.csrf&&""!==b.responseJSON.csrf&&c.sk.set(b.responseJSON.csrf);void 0!==c.theme&&c.theme.ajax.complete()}})},getActionEvent:function(a,b,c){var f=k(a.url);f+="?"+$.param(a.data);var d=new EventSource(f);d.addEventListener("message",function(a){a=JSON.parse(a.data);e.debug(a);1===a.end?(e.info("getActionEvent:Ending"),d.close(),"function"===typeof c&&c(a)):"function"===typeof b&&b(a)});d.addEventListener("error", +function(a){e.error("getActionEvent:Error occured");d.close()});return d},getRouteForQuery:function(a,b){return"object"===typeof b?{r:a+"/"+b.join("/")}:{r:a+"/"+b}},history:h}}; diff --git a/public/js/app-triggers.js b/public/js/app-triggers.js index 1af5056e..914d144b 100644 --- a/public/js/app-triggers.js +++ b/public/js/app-triggers.js @@ -241,9 +241,13 @@ sysPass.Triggers = function (log) { sysPassApp.actions.doAction({r: $this.data("route")}, $this.data("view")); }); - // setInterval(function () { - // sysPassApp.actions.notification.getActive(); - // }, 60000); + if (sysPassApp.config.STATUS.CHECK_NOTIFICATIONS) { + sysPassApp.actions.notification.getActive(); + + setInterval(function () { + sysPassApp.actions.notification.getActive(); + }, 120000); + } if ($obj.data("upgraded") === 0) { sysPassApp.actions.doAction({r: "account/index"}, "search"); diff --git a/public/js/app-triggers.min.js b/public/js/app-triggers.min.js index 0cb3e61c..36d25299 100644 --- a/public/js/app-triggers.min.js +++ b/public/js/app-triggers.min.js @@ -3,17 +3,17 @@ $jscomp.getGlobal=function(c){return"undefined"!=typeof window&&window===c?c:"un $jscomp.polyfill("Array.prototype.find",function(c){return c?c:function(c,e){return $jscomp.findInternal(this,c,e).v}},"es6","es3"); sysPass.Triggers=function(c){var f=function(a){var b={valueField:"id",labelField:"name",searchField:["name"],onInitialize:function(){var a=$(this.$wrapper[0]),b=$(this.$input[0]).siblings(".btn-add-select");1===b.length&&a.append(b)}};a.find(".select-box").each(function(a){var c=$(this);a={};!0===c.data("create")&&(a.create=!0);b.plugins=c.hasClass("select-box-deselect")?{clear_selection:{title:sysPassApp.config.LANG[51]}}:{};if(c.data("onchange")){var d=c.data("onchange").split("/");b.onChange=function(a){if(0< a)if(2===d.length)sysPassApp.actions[d[0]][d[1]](c);else sysPassApp.actions[d[0]](c)}}c.selectize($.extend(a,b))});a.find("#allowed_exts").selectize({create:function(a){return{value:a.toUpperCase(),text:a.toUpperCase()}},createFilter:/^[a-z0-9]{1,4}$/i,plugins:["remove_button"]});a.find("#wikifilter").selectize({create:!0,createFilter:/^[a-z0-9:._-]+$/i,plugins:["remove_button"]});a.find(".select-items-tag").selectize({create:function(a){return{value:a.toLowerCase(),text:a.toLowerCase()}},createFilter:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/, -plugins:["remove_button"]})},e={main:function(a){c.info("views:main");clipboard.isSupported()||sysPassApp.msg.info(sysPassApp.config.LANG[65]);$(".btn-menu").click(function(){var a=$(this);"1"===a.attr("data-history-reset")&&sysPassApp.requests.history.reset();sysPassApp.actions.doAction({r:a.data("route")},a.data("view"))});if(0===a.data("upgraded"))sysPassApp.actions.doAction({r:"account/index"},"search");else{a=$("#content");var b=a.data("page");e.common(a);if(""!==b&&"function"===typeof e[b])e[b]()}!0=== -sysPassApp.config.STATUS.CHECK_UPDATES&&sysPassApp.actions.main.getUpdates();!0===sysPassApp.config.STATUS.CHECK_NOTICES&&sysPassApp.actions.main.getNotices();"function"===typeof sysPassApp.theme.viewsTriggers.main&&sysPassApp.theme.viewsTriggers.main()},search:function(){c.info("views:search");var a=$("#frmSearch");0!==a.length&&(a.find("input[name='search']").on("keyup",function(b){b.preventDefault();13!==b.which&&13!==b.keyCode||a.submit()}),a.find("select, #rpp").on("change",function(){a.submit()}), -a.find("button.btn-clear").on("click",function(b){b.preventDefault();a.find('input[name="searchfav"]').val(0);a[0].reset()}),a.find("input:text:visible:first").focus(),$("#globalSearch").click(function(){var b=1==$(this).prop("checked")?1:0;a.find("input[name='gsearch']").val(b);a.submit()}),"function"===typeof sysPassApp.theme.viewsTriggers.search&&sysPassApp.theme.viewsTriggers.search())},login:function(){c.info("views:login");var a=$("#frmLogin");sysPassApp.config.AUTH.AUTHBASIC_AUTOLOGIN&&"0"=== -a.find("input[name='loggedOut']").val()&&(c.info("views:login:autologin"),sysPassApp.msg.info(sysPassApp.config.LANG[66]),sysPassApp.actions.main.login(a));a.find("input:visible:first").focus()},userpassreset:function(){c.info("views:userpassreset");var a=$("#frmUserPassReset");sysPassApp.theme.passwordDetect(a)},footer:function(){c.info("views:footer")},common:function(a){c.info("views:common");f(a);var b=a.find(":input [name='sk']");0form").each(function(){var a=$(this);a.find("button.btn-clear").on("click",function(b){b.preventDefault();a.trigger("reset")})})},config:function(){c.info("views:config");var a=$("#drop-import-files");if(0form").each(function(){var a=$(this);a.find("button.btn-clear").on("click",function(b){b.preventDefault();a.trigger("reset")})})},config:function(){c.info("views:config");var a=$("#drop-import-files");if(0