diff --git a/ajax/ajax_configSave.php b/ajax/ajax_configSave.php index 992ed0ba..00ed8a56 100644 --- a/ajax/ajax_configSave.php +++ b/ajax/ajax_configSave.php @@ -23,26 +23,8 @@ * */ -use SP\Account\Account; -use SP\Account\AccountHistory; -use SP\Config\Config; -use SP\Config\ConfigDB; -use SP\Core\ActionsInterface; -use SP\Core\Crypt; -use SP\Core\CryptMasterPass; -use SP\Core\Init; -use SP\Core\Session; -use SP\Core\SessionUtil; -use SP\Core\Exceptions\SPException; -use SP\Html\Html; -use SP\Http\JsonResponse; +use SP\Controller\ConfigActionController; use SP\Http\Request; -use SP\Log\Email; -use SP\Log\Log; -use SP\Mgmt\CustomFields\CustomFieldsUtil; -use SP\Mgmt\Users\UserPass; -use SP\Util\Checks; -use SP\Util\Json; define('APP_ROOT', '..'); @@ -50,416 +32,5 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); -$Json = new JsonResponse(); - -if (!Init::isLoggedIn()) { - $Json->setStatus(10); - $Json->setDescription(_('La sesión no se ha iniciado o ha caducado')); - Json::returnJson($Json); -} - -$sk = Request::analyze('sk', false); - - -if (!$sk || !SessionUtil::checkSessionKey($sk)) { - $Json->setDescription(_('CONSULTA INVÁLIDA')); - Json::returnJson($Json); -} elseif (Checks::demoIsEnabled()) { - $Json->setDescription(_('Ey, esto es una DEMO!!')); - Json::returnJson($Json); -} - -// Variables POST del formulario -$actionId = Request::analyze('actionId', 0); -$activeTab = Request::analyze('activeTab', 0); - -if ($actionId === ActionsInterface::ACTION_CFG_GENERAL - || $actionId === ActionsInterface::ACTION_CFG_WIKI - || $actionId === ActionsInterface::ACTION_CFG_LDAP - || $actionId === ActionsInterface::ACTION_CFG_MAIL -) { - $Log = Log::newLog(_('Modificar Configuración')); - $Config = Session::getConfig(); - - if ($actionId === ActionsInterface::ACTION_CFG_GENERAL) { - // General - $siteLang = Request::analyze('sitelang'); - $siteTheme = Request::analyze('sitetheme', 'material-blue'); - $sessionTimeout = Request::analyze('session_timeout', 300); - $httpsEnabled = Request::analyze('https_enabled', false, false, true); - $debugEnabled = Request::analyze('debug', false, false, true); - $maintenanceEnabled = Request::analyze('maintenance', false, false, true); - $checkUpdatesEnabled = Request::analyze('updates', false, false, true); - $checkNoticesEnabled = Request::analyze('notices', false, false, true); - - $Config->setSiteLang($siteLang); - $Config->setSiteTheme($siteTheme); - $Config->setSessionTimeout($sessionTimeout); - $Config->setHttpsEnabled($httpsEnabled); - $Config->setDebug($debugEnabled); - $Config->setMaintenance($maintenanceEnabled); - $Config->setCheckUpdates($checkUpdatesEnabled); - $Config->setChecknotices($checkNoticesEnabled); - - // Events - $logEnabled = Request::analyze('log_enabled', false, false, true); - $syslogEnabled = Request::analyze('syslog_enabled', false, false, true); - $remoteSyslogEnabled = Request::analyze('remotesyslog_enabled', false, false, true); - $syslogServer = Request::analyze('remotesyslog_server'); - $syslogPort = Request::analyze('remotesyslog_port', 0); - - $Config->setLogEnabled($logEnabled); - $Config->setSyslogEnabled($syslogEnabled); - - if ($remoteSyslogEnabled && (!$syslogServer || !$syslogPort)) { - $Json->setDescription(_('Faltan parámetros de syslog remoto')); - Json::returnJson($Json); - } elseif ($remoteSyslogEnabled) { - $Config->setSyslogRemoteEnabled($remoteSyslogEnabled); - $Config->setSyslogServer($syslogServer); - $Config->setSyslogPort($syslogPort); - } else { - $Config->setSyslogRemoteEnabled(false); - - $Log->addDescription(_('Syslog remoto deshabilitado')); - } - - // Accounts - $globalSearchEnabled = Request::analyze('globalsearch', false, false, true); - $accountPassToImageEnabled = Request::analyze('account_passtoimage', false, false, true); - $accountLinkEnabled = Request::analyze('account_link', false, false, true); - $accountCount = Request::analyze('account_count', 10); - $resultsAsCardsEnabled = Request::analyze('resultsascards', false, false, true); - - $Config->setGlobalSearch($globalSearchEnabled); - $Config->setAccountPassToImage($accountPassToImageEnabled); - $Config->setAccountLink($accountLinkEnabled); - $Config->setAccountCount($accountCount); - $Config->setResultsAsCards($resultsAsCardsEnabled); - - // Files - $filesEnabled = Request::analyze('files_enabled', false, false, true); - $filesAllowedSize = Request::analyze('files_allowed_size', 1024); - $filesAllowedExts = Request::analyze('files_allowed_exts'); - - if ($filesEnabled && $filesAllowedSize >= 16384) { - $Json->setDescription(_('El tamaño máximo por archivo es de 16MB')); - Json::returnJson($Json); - } - - if (!empty($filesAllowedExts)) { - $exts = explode(',', $filesAllowedExts); - array_walk($exts, function (&$value) use ($Json) { - if (preg_match('/[^a-z0-9_-]+/i', $value)) { - $Json->setDescription(sprintf('%s: %s', _('Extensión no permitida'), $value)); - Json::returnJson($Json); - } - }); - $Config->setFilesAllowedExts($exts); - } else { - $Config->setFilesAllowedExts([]); - } - - $Config->setFilesEnabled($filesEnabled); - $Config->setFilesAllowedSize($filesAllowedSize); - - // Public Links - $pubLinksEnabled = Request::analyze('publinks_enabled', false, false, true); - $pubLinksImageEnabled = Request::analyze('publinks_image_enabled', false, false, true); - $pubLinksMaxTime = Request::analyze('publinks_maxtime', 10); - $pubLinksMaxViews = Request::analyze('publinks_maxviews', 3); - - $Config->setPublinksEnabled($pubLinksEnabled); - $Config->setPublinksImageEnabled($pubLinksImageEnabled); - $Config->setPublinksMaxTime($pubLinksMaxTime * 60); - $Config->setPublinksMaxViews($pubLinksMaxViews); - - // Proxy - $proxyEnabled = Request::analyze('proxy_enabled', false, false, true); - $proxyServer = Request::analyze('proxy_server'); - $proxyPort = Request::analyze('proxy_port', 0); - $proxyUser = Request::analyze('proxy_user'); - $proxyPass = Request::analyzeEncrypted('proxy_pass'); - - - // Valores para Proxy - if ($proxyEnabled && (!$proxyServer || !$proxyPort)) { - $Json->setDescription(_('Faltan parámetros de Proxy')); - Json::returnJson($Json); - } elseif ($proxyEnabled) { - $Config->setProxyEnabled(true); - $Config->setProxyServer($proxyServer); - $Config->setProxyPort($proxyPort); - $Config->setProxyUser($proxyUser); - $Config->setProxyPass($proxyPass); - - $Log->addDescription(_('Proxy habiltado')); - } else { - $Config->setProxyEnabled(false); - - $Log->addDescription(_('Proxy deshabilitado')); - } - - $Log->addDetails(_('Sección'), _('General')); - } elseif ($actionId === ActionsInterface::ACTION_CFG_WIKI) { - // Wiki - $wikiEnabled = Request::analyze('wiki_enabled', false, false, true); - $wikiSearchUrl = Request::analyze('wiki_searchurl'); - $wikiPageUrl = Request::analyze('wiki_pageurl'); - $wikiFilter = Request::analyze('wiki_filter'); - - // Valores para la conexión a la Wiki - if ($wikiEnabled && (!$wikiSearchUrl || !$wikiPageUrl || !$wikiFilter)) { - $Json->setDescription(_('Faltan parámetros de Wiki')); - Json::returnJson($Json); - } elseif ($wikiEnabled) { - $Config->setWikiEnabled(true); - $Config->setWikiSearchurl($wikiSearchUrl); - $Config->setWikiPageurl($wikiPageUrl); - $Config->setWikiFilter(explode(',', $wikiFilter)); - - $Log->addDescription(_('Wiki habiltada')); - } else { - $Config->setWikiEnabled(false); - - $Log->addDescription(_('Wiki deshabilitada')); - } - - // DokuWiki - $dokuWikiEnabled = Request::analyze('dokuwiki_enabled', false, false, true); - $dokuWikiUrl = Request::analyze('dokuwiki_url'); - $dokuWikiUrlBase = Request::analyze('dokuwiki_urlbase'); - $dokuWikiUser = Request::analyze('dokuwiki_user'); - $dokuWikiPass = Request::analyzeEncrypted('dokuwiki_pass'); - $dokuWikiNamespace = Request::analyze('dokuwiki_namespace'); - - // Valores para la conexión a la API de DokuWiki - if ($dokuWikiEnabled && (!$dokuWikiUrl || !$dokuWikiUrlBase)) { - $Json->setDescription(_('Faltan parámetros de DokuWiki')); - Json::returnJson($Json); - } elseif ($dokuWikiEnabled) { - $Config->setDokuwikiEnabled(true); - $Config->setDokuwikiUrl($dokuWikiUrl); - $Config->setDokuwikiUrlBase(trim($dokuWikiUrlBase, '/')); - $Config->setDokuwikiUser($dokuWikiUser); - $Config->setDokuwikiPass($dokuWikiPass); - $Config->setDokuwikiNamespace($dokuWikiNamespace); - - $Log->addDescription(_('DokuWiki habiltada')); - } else { - $Config->setDokuwikiEnabled(false); - - $Log->addDescription(_('DokuWiki deshabilitada')); - } - - $Log->addDetails(_('Sección'), _('Wiki')); - } elseif ($actionId === ActionsInterface::ACTION_CFG_LDAP) { - // LDAP - $ldapEnabled = Request::analyze('ldap_enabled', false, false, true); - $ldapADSEnabled = Request::analyze('ldap_ads', false, false, true); - $ldapServer = Request::analyze('ldap_server'); - $ldapBase = Request::analyze('ldap_base'); - $ldapGroup = Request::analyze('ldap_group'); - $ldapDefaultGroup = Request::analyze('ldap_defaultgroup', 0); - $ldapDefaultProfile = Request::analyze('ldap_defaultprofile', 0); - $ldapBindUser = Request::analyze('ldap_binduser'); - $ldapBindPass = Request::analyzeEncrypted('ldap_bindpass'); - - // Valores para la configuración de LDAP - if ($ldapEnabled && (!$ldapServer || !$ldapBase || !$ldapBindUser)) { - $Json->setDescription(_('Faltan parámetros de LDAP')); - Json::returnJson($Json); - } elseif ($ldapEnabled) { - $Config->setLdapEnabled(true); - $Config->setLdapAds($ldapADSEnabled); - $Config->setLdapServer($ldapServer); - $Config->setLdapBase($ldapBase); - $Config->setLdapGroup($ldapGroup); - $Config->setLdapDefaultGroup($ldapDefaultGroup); - $Config->setLdapDefaultProfile($ldapDefaultProfile); - $Config->setLdapBindUser($ldapBindUser); - $Config->setLdapBindPass($ldapBindPass); - - $Log->addDescription(_('LDAP habiltado')); - } else { - $Config->setLdapEnabled(false); - - $Log->addDescription(_('LDAP deshabilitado')); - } - - $Log->addDetails(_('Sección'), _('LDAP')); - } elseif ($actionId === ActionsInterface::ACTION_CFG_MAIL) { - // Mail - $mailEnabled = Request::analyze('mail_enabled', false, false, true); - $mailServer = Request::analyze('mail_server'); - $mailPort = Request::analyze('mail_port', 25); - $mailUser = Request::analyze('mail_user'); - $mailPass = Request::analyzeEncrypted('mail_pass'); - $mailSecurity = Request::analyze('mail_security'); - $mailFrom = Request::analyze('mail_from'); - $mailRequests = Request::analyze('mail_requestsenabled', false, false, true); - $mailAuth = Request::analyze('mail_authenabled', false, false, true); - - // Valores para la configuración del Correo - if ($mailEnabled && (!$mailServer || !$mailFrom)) { - $Json->setDescription(_('Faltan parámetros de Correo')); - Json::returnJson($Json); - } elseif ($mailEnabled) { - $Config->setMailEnabled(true); - $Config->setMailRequestsEnabled($mailRequests); - $Config->setMailServer($mailServer); - $Config->setMailPort($mailPort); - $Config->setMailSecurity($mailSecurity); - $Config->setMailFrom($mailFrom); - - if ($mailAuth) { - $Config->setMailAuthenabled($mailAuth); - $Config->setMailUser($mailUser); - $Config->setMailPass($mailPass); - } - - $Log->addDescription(_('Correo habiltado')); - } else { - $Config->setMailEnabled(false); - $Config->setMailRequestsEnabled(false); - $Config->setMailAuthenabled(false); - - $Log->addDescription(_('Correo deshabilitado')); - } - - $Log->addDetails(_('Sección'), _('Correo')); - } - - try { - Config::saveConfig(); - } catch (SPException $e) { - $Log->addDescription(_('Error al guardar la configuración')); - $Log->addDetails($e->getMessage(), $e->getHint()); - $Log->writeLog(); - - Email::sendEmail($Log); - - $Json->setDescription($e->getMessage()); - Json::returnJson($Json); - } - - $Log->writeLog(); - - Email::sendEmail($Log); - - if ($actionId === ActionsInterface::ACTION_CFG_GENERAL) { - // Recargar la aplicación completa para establecer nuevos valores - \SP\Util\Util::reload(); - } - - $Json->setStatus(0); - $Json->setDescription(_('Configuración actualizada')); - Json::returnJson($Json); -} elseif ($actionId === ActionsInterface::ACTION_CFG_ENCRYPTION) { - $currentMasterPass = Request::analyzeEncrypted('curMasterPwd'); - $newMasterPass = Request::analyzeEncrypted('newMasterPwd'); - $newMasterPassR = Request::analyzeEncrypted('newMasterPwdR'); - $confirmPassChange = Request::analyze('confirmPassChange', 0, false, 1); - $noAccountPassChange = Request::analyze('chkNoAccountChange', 0, false, 1); - - if (!UserPass::getItem(Session::getUserData())->checkUserUpdateMPass()) { - $Json->setDescription(_('Clave maestra actualizada')); - $Json->addMessage(_('Reinicie la sesión para cambiarla')); - Json::returnJson($Json); - } elseif ($newMasterPass == '' && $currentMasterPass == '') { - $Json->setDescription(_('Clave maestra no indicada')); - Json::returnJson($Json); - } elseif ($confirmPassChange == 0) { - $Json->setDescription(_('Se ha de confirmar el cambio de clave')); - Json::returnJson($Json); - } - - if ($newMasterPass == $currentMasterPass) { - $Json->setDescription(_('Las claves son idénticas')); - Json::returnJson($Json); - } elseif ($newMasterPass != $newMasterPassR) { - $Json->setDescription(_('Las claves maestras no coinciden')); - Json::returnJson($Json); - } elseif (!Crypt::checkHashPass($currentMasterPass, ConfigDB::getValue('masterPwd'), true)) { - $Json->setDescription(_('La clave maestra actual no coincide')); - Json::returnJson($Json); - } - - $hashMPass = Crypt::mkHashPassword($newMasterPass); - - if (!$noAccountPassChange) { - $Account = new Account(); - - if (!$Account->updateAccountsMasterPass($currentMasterPass, $newMasterPass)) { - $Json->setDescription(_('Errores al actualizar las claves de las cuentas')); - Json::returnJson($Json); - } - - $AccountHistory = new AccountHistory(); - - if (!$AccountHistory->updateAccountsMasterPass($currentMasterPass, $newMasterPass, $hashMPass)) { - $Json->setDescription(_('Errores al actualizar las claves de las cuentas del histórico')); - Json::returnJson($Json); - } - - if (!CustomFieldsUtil::updateCustomFieldsCrypt($currentMasterPass, $newMasterPass)) { - $Json->setDescription(_('Errores al actualizar datos de campos personalizados')); - Json::returnJson($Json); - } - } - - if (Checks::demoIsEnabled()) { - $Json->setDescription(_('Ey, esto es una DEMO!!')); - Json::returnJson($Json); - } - -// ConfigDB::readConfig(); - ConfigDB::setCacheConfigValue('masterPwd', $hashMPass); - ConfigDB::setCacheConfigValue('lastupdatempass', time()); - - $Log = new Log(_('Actualizar Clave Maestra')); - - if (ConfigDB::writeConfig()) { - $Log->addDescription(_('Clave maestra actualizada')); - $Log->writeLog(); - - $Json->setStatus(0); - Email::sendEmail($Log); - } else { - $Log->setLogLevel(Log::ERROR); - $Log->addDescription(_('Error al guardar el hash de la clave maestra')); - $Log->writeLog(); - - Email::sendEmail($Log); - } - - $Json->setDescription($Log->getDescription()); - Json::returnJson($Json); -} elseif ($actionId === ActionsInterface::ACTION_CFG_ENCRYPTION_TEMPPASS) { - $tempMasterMaxTime = Request::analyze('tmpass_maxtime', 3600); - $tempMasterPass = CryptMasterPass::setTempMasterPass($tempMasterMaxTime); - - $Log = new Log('Generar Clave Temporal'); - - if ($tempMasterPass !== false && !empty($tempMasterPass)) { - $Log->addDescription(_('Clave Temporal Generada')); - $Log->addDetails(Html::strongText(_('Clave')), $tempMasterPass); - $Log->writeLog(); - - Email::sendEmail($Log); - - $Json->setStatus(0); - } else { - $Log->setLogLevel(Log::ERROR); - $Log->addDescription(_('Error al generar clave temporal')); - $Log->writeLog(); - - Email::sendEmail($Log); - } - - $Json->setDescription($Log->getDescription()); - Json::returnJson($Json); -} else { - $Json->setDescription(_('Acción Inválida')); - Json::returnJson($Json); -} \ No newline at end of file +$Controller = new ConfigActionController(); +$Controller->doAction(); diff --git a/inc/SP/Controller/ConfigActionController.class.php b/inc/SP/Controller/ConfigActionController.class.php new file mode 100644 index 00000000..bb956bec --- /dev/null +++ b/inc/SP/Controller/ConfigActionController.class.php @@ -0,0 +1,536 @@ +. + */ + +namespace SP\Controller; + +use SP\Account\Account; +use SP\Account\AccountHistory; +use SP\Config\Config; +use SP\Config\ConfigDB; +use SP\Core\ActionsInterface; +use SP\Core\Crypt; +use SP\Core\CryptMasterPass; +use SP\Core\Exceptions\SPException; +use SP\Core\Session; +use SP\Html\Html; +use SP\Http\Request; +use SP\Log\Email; +use SP\Log\Log; +use SP\Mgmt\CustomFields\CustomFieldsUtil; +use SP\Mgmt\Users\UserPass; +use SP\Util\Checks; +use SP\Util\Json; +use SP\Util\Util; + +/** + * Class ConfigActionController + * + * @package SP\Controller + */ +class ConfigActionController implements ItemControllerInterface +{ + use RequestControllerTrait; + + /** + * ConfigActionController constructor. + */ + public function __construct() + { + $this->init(); + } + + /** + * Realizar la acción solicitada en la la petición HTTP + * + * @throws \SP\Core\Exceptions\SPException + */ + public function doAction() + { + try { + switch ($this->actionId) { + case ActionsInterface::ACTION_CFG_GENERAL: + $this->generalAction(); + break; + case ActionsInterface::ACTION_CFG_WIKI: + $this->wikiAction(); + break; + case ActionsInterface::ACTION_CFG_LDAP: + $this->ldapAction(); + break; + case ActionsInterface::ACTION_CFG_MAIL: + $this->mailAction(); + break; + case ActionsInterface::ACTION_CFG_ENCRYPTION: + $this->masterPassAction(); + break; + case ActionsInterface::ACTION_CFG_ENCRYPTION_TEMPPASS: + $this->tempMasterPassAction(); + break; + default: + $this->invalidAction(); + } + } catch (\Exception $e) { + $this->jsonResponse->setDescription($e->getMessage()); + } + + Json::returnJson($this->jsonResponse); + } + + /** + * Accion para opciones configuración general + * + * @throws \SP\Core\Exceptions\SPException + */ + protected function generalAction() + { + $Log = Log::newLog(_('Modificar Configuración')); + $Config = Session::getConfig(); + + // General + $siteLang = Request::analyze('sitelang'); + $siteTheme = Request::analyze('sitetheme', 'material-blue'); + $sessionTimeout = Request::analyze('session_timeout', 300); + $httpsEnabled = Request::analyze('https_enabled', false, false, true); + $debugEnabled = Request::analyze('debug', false, false, true); + $maintenanceEnabled = Request::analyze('maintenance', false, false, true); + $checkUpdatesEnabled = Request::analyze('updates', false, false, true); + $checkNoticesEnabled = Request::analyze('notices', false, false, true); + + $Config->setSiteLang($siteLang); + $Config->setSiteTheme($siteTheme); + $Config->setSessionTimeout($sessionTimeout); + $Config->setHttpsEnabled($httpsEnabled); + $Config->setDebug($debugEnabled); + $Config->setMaintenance($maintenanceEnabled); + $Config->setCheckUpdates($checkUpdatesEnabled); + $Config->setChecknotices($checkNoticesEnabled); + + // Events + $logEnabled = Request::analyze('log_enabled', false, false, true); + $syslogEnabled = Request::analyze('syslog_enabled', false, false, true); + $remoteSyslogEnabled = Request::analyze('remotesyslog_enabled', false, false, true); + $syslogServer = Request::analyze('remotesyslog_server'); + $syslogPort = Request::analyze('remotesyslog_port', 0); + + $Config->setLogEnabled($logEnabled); + $Config->setSyslogEnabled($syslogEnabled); + + if ($remoteSyslogEnabled && (!$syslogServer || !$syslogPort)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de syslog remoto')); + return; + } elseif ($remoteSyslogEnabled) { + $Config->setSyslogRemoteEnabled($remoteSyslogEnabled); + $Config->setSyslogServer($syslogServer); + $Config->setSyslogPort($syslogPort); + } else { + $Config->setSyslogRemoteEnabled(false); + + $Log->addDescription(_('Syslog remoto deshabilitado')); + } + + // Accounts + $globalSearchEnabled = Request::analyze('globalsearch', false, false, true); + $accountPassToImageEnabled = Request::analyze('account_passtoimage', false, false, true); + $accountLinkEnabled = Request::analyze('account_link', false, false, true); + $accountCount = Request::analyze('account_count', 10); + $resultsAsCardsEnabled = Request::analyze('resultsascards', false, false, true); + + $Config->setGlobalSearch($globalSearchEnabled); + $Config->setAccountPassToImage($accountPassToImageEnabled); + $Config->setAccountLink($accountLinkEnabled); + $Config->setAccountCount($accountCount); + $Config->setResultsAsCards($resultsAsCardsEnabled); + + // Files + $filesEnabled = Request::analyze('files_enabled', false, false, true); + $filesAllowedSize = Request::analyze('files_allowed_size', 1024); + $filesAllowedExts = Request::analyze('files_allowed_exts'); + + if ($filesEnabled && $filesAllowedSize >= 16384) { + $this->jsonResponse->setDescription(_('El tamaño máximo por archivo es de 16MB')); + Json::returnJson($this->jsonResponse); + } + + if (!empty($filesAllowedExts)) { + $exts = explode(',', $filesAllowedExts); + array_walk($exts, function (&$value) { + if (preg_match('/[^a-z0-9_-]+/i', $value)) { + $this->jsonResponse->setDescription(sprintf('%s: %s', _('Extensión no permitida'), $value)); + Json::returnJson($this->jsonResponse); + } + }); + $Config->setFilesAllowedExts($exts); + } else { + $Config->setFilesAllowedExts([]); + } + + $Config->setFilesEnabled($filesEnabled); + $Config->setFilesAllowedSize($filesAllowedSize); + + // Public Links + $pubLinksEnabled = Request::analyze('publinks_enabled', false, false, true); + $pubLinksImageEnabled = Request::analyze('publinks_image_enabled', false, false, true); + $pubLinksMaxTime = Request::analyze('publinks_maxtime', 10); + $pubLinksMaxViews = Request::analyze('publinks_maxviews', 3); + + $Config->setPublinksEnabled($pubLinksEnabled); + $Config->setPublinksImageEnabled($pubLinksImageEnabled); + $Config->setPublinksMaxTime($pubLinksMaxTime * 60); + $Config->setPublinksMaxViews($pubLinksMaxViews); + + // Proxy + $proxyEnabled = Request::analyze('proxy_enabled', false, false, true); + $proxyServer = Request::analyze('proxy_server'); + $proxyPort = Request::analyze('proxy_port', 0); + $proxyUser = Request::analyze('proxy_user'); + $proxyPass = Request::analyzeEncrypted('proxy_pass'); + + + // Valores para Proxy + if ($proxyEnabled && (!$proxyServer || !$proxyPort)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de Proxy')); + return; + } elseif ($proxyEnabled) { + $Config->setProxyEnabled(true); + $Config->setProxyServer($proxyServer); + $Config->setProxyPort($proxyPort); + $Config->setProxyUser($proxyUser); + $Config->setProxyPass($proxyPass); + + $Log->addDescription(_('Proxy habiltado')); + } else { + $Config->setProxyEnabled(false); + + $Log->addDescription(_('Proxy deshabilitado')); + } + + $Log->addDetails(_('Sección'), _('General')); + + // Recargar la aplicación completa para establecer nuevos valores + Util::reload(); + + $this->saveConfig($Log); + } + + /** + * Guardar la configuración + * + * @param Log $Log instancia de Log + * @throws \SP\Core\Exceptions\SPException + */ + protected function saveConfig(Log $Log) + { + try { + Config::saveConfig(); + + $this->jsonResponse->setStatus(0); + $this->jsonResponse->setDescription(_('Configuración actualizada')); + } catch (SPException $e) { + $Log->addDescription(_('Error al guardar la configuración')); + $Log->addDetails($e->getMessage(), $e->getHint()); + + $this->jsonResponse->setDescription($e->getMessage()); + } + + $Log->writeLog(); + Email::sendEmail($Log); + } + + /** + * Acción para opciones de Wiki + * + * @throws \SP\Core\Exceptions\SPException + */ + protected function wikiAction() + { + $Log = Log::newLog(_('Modificar Configuración')); + $Config = Session::getConfig(); + + // Wiki + $wikiEnabled = Request::analyze('wiki_enabled', false, false, true); + $wikiSearchUrl = Request::analyze('wiki_searchurl'); + $wikiPageUrl = Request::analyze('wiki_pageurl'); + $wikiFilter = Request::analyze('wiki_filter'); + + // Valores para la conexión a la Wiki + if ($wikiEnabled && (!$wikiSearchUrl || !$wikiPageUrl || !$wikiFilter)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de Wiki')); + return; + } elseif ($wikiEnabled) { + $Config->setWikiEnabled(true); + $Config->setWikiSearchurl($wikiSearchUrl); + $Config->setWikiPageurl($wikiPageUrl); + $Config->setWikiFilter(explode(',', $wikiFilter)); + + $Log->addDescription(_('Wiki habiltada')); + } else { + $Config->setWikiEnabled(false); + + $Log->addDescription(_('Wiki deshabilitada')); + } + + // DokuWiki + $dokuWikiEnabled = Request::analyze('dokuwiki_enabled', false, false, true); + $dokuWikiUrl = Request::analyze('dokuwiki_url'); + $dokuWikiUrlBase = Request::analyze('dokuwiki_urlbase'); + $dokuWikiUser = Request::analyze('dokuwiki_user'); + $dokuWikiPass = Request::analyzeEncrypted('dokuwiki_pass'); + $dokuWikiNamespace = Request::analyze('dokuwiki_namespace'); + + // Valores para la conexión a la API de DokuWiki + if ($dokuWikiEnabled && (!$dokuWikiUrl || !$dokuWikiUrlBase)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de DokuWiki')); + return; + } elseif ($dokuWikiEnabled) { + $Config->setDokuwikiEnabled(true); + $Config->setDokuwikiUrl($dokuWikiUrl); + $Config->setDokuwikiUrlBase(trim($dokuWikiUrlBase, '/')); + $Config->setDokuwikiUser($dokuWikiUser); + $Config->setDokuwikiPass($dokuWikiPass); + $Config->setDokuwikiNamespace($dokuWikiNamespace); + + $Log->addDescription(_('DokuWiki habiltada')); + } else { + $Config->setDokuwikiEnabled(false); + + $Log->addDescription(_('DokuWiki deshabilitada')); + } + + $Log->addDetails(_('Sección'), _('Wiki')); + + $this->saveConfig($Log); + } + + /** + * Acción para opciones de LDAP + * + * @throws \SP\Core\Exceptions\SPException + */ + protected function ldapAction() + { + $Log = Log::newLog(_('Modificar Configuración')); + $Config = Session::getConfig(); + + // LDAP + $ldapEnabled = Request::analyze('ldap_enabled', false, false, true); + $ldapADSEnabled = Request::analyze('ldap_ads', false, false, true); + $ldapServer = Request::analyze('ldap_server'); + $ldapBase = Request::analyze('ldap_base'); + $ldapGroup = Request::analyze('ldap_group'); + $ldapDefaultGroup = Request::analyze('ldap_defaultgroup', 0); + $ldapDefaultProfile = Request::analyze('ldap_defaultprofile', 0); + $ldapBindUser = Request::analyze('ldap_binduser'); + $ldapBindPass = Request::analyzeEncrypted('ldap_bindpass'); + + // Valores para la configuración de LDAP + if ($ldapEnabled && (!$ldapServer || !$ldapBase || !$ldapBindUser)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de LDAP')); + return; + } elseif ($ldapEnabled) { + $Config->setLdapEnabled(true); + $Config->setLdapAds($ldapADSEnabled); + $Config->setLdapServer($ldapServer); + $Config->setLdapBase($ldapBase); + $Config->setLdapGroup($ldapGroup); + $Config->setLdapDefaultGroup($ldapDefaultGroup); + $Config->setLdapDefaultProfile($ldapDefaultProfile); + $Config->setLdapBindUser($ldapBindUser); + $Config->setLdapBindPass($ldapBindPass); + + $Log->addDescription(_('LDAP habiltado')); + } else { + $Config->setLdapEnabled(false); + + $Log->addDescription(_('LDAP deshabilitado')); + } + + $Log->addDetails(_('Sección'), _('LDAP')); + + $this->saveConfig($Log); + } + + /** + * Accion para opciones de correo + * + * @throws \SP\Core\Exceptions\SPException + */ + protected function mailAction() + { + $Log = Log::newLog(_('Modificar Configuración')); + $Config = Session::getConfig(); + + // Mail + $mailEnabled = Request::analyze('mail_enabled', false, false, true); + $mailServer = Request::analyze('mail_server'); + $mailPort = Request::analyze('mail_port', 25); + $mailUser = Request::analyze('mail_user'); + $mailPass = Request::analyzeEncrypted('mail_pass'); + $mailSecurity = Request::analyze('mail_security'); + $mailFrom = Request::analyze('mail_from'); + $mailRequests = Request::analyze('mail_requestsenabled', false, false, true); + $mailAuth = Request::analyze('mail_authenabled', false, false, true); + + // Valores para la configuración del Correo + if ($mailEnabled && (!$mailServer || !$mailFrom)) { + $this->jsonResponse->setDescription(_('Faltan parámetros de Correo')); + return; + } elseif ($mailEnabled) { + $Config->setMailEnabled(true); + $Config->setMailRequestsEnabled($mailRequests); + $Config->setMailServer($mailServer); + $Config->setMailPort($mailPort); + $Config->setMailSecurity($mailSecurity); + $Config->setMailFrom($mailFrom); + + if ($mailAuth) { + $Config->setMailAuthenabled($mailAuth); + $Config->setMailUser($mailUser); + $Config->setMailPass($mailPass); + } + + $Log->addDescription(_('Correo habiltado')); + } else { + $Config->setMailEnabled(false); + $Config->setMailRequestsEnabled(false); + $Config->setMailAuthenabled(false); + + $Log->addDescription(_('Correo deshabilitado')); + } + + $Log->addDetails(_('Sección'), _('Correo')); + + $this->saveConfig($Log); + } + + /** + * Acción para cambio de clave maestra + * + * @throws \SP\Core\Exceptions\SPException + */ + protected function masterPassAction() + { + $currentMasterPass = Request::analyzeEncrypted('curMasterPwd'); + $newMasterPass = Request::analyzeEncrypted('newMasterPwd'); + $newMasterPassR = Request::analyzeEncrypted('newMasterPwdR'); + $confirmPassChange = Request::analyze('confirmPassChange', 0, false, 1); + $noAccountPassChange = Request::analyze('chkNoAccountChange', 0, false, 1); + + if (!UserPass::getItem(Session::getUserData())->checkUserUpdateMPass()) { + $this->jsonResponse->setDescription(_('Clave maestra actualizada')); + $this->jsonResponse->addMessage(_('Reinicie la sesión para cambiarla')); + return; + } elseif ($newMasterPass === '' && $currentMasterPass === '') { + $this->jsonResponse->setDescription(_('Clave maestra no indicada')); + return; + } elseif ($confirmPassChange === 0) { + $this->jsonResponse->setDescription(_('Se ha de confirmar el cambio de clave')); + return; + } + + if ($newMasterPass === $currentMasterPass) { + $this->jsonResponse->setDescription(_('Las claves son idénticas')); + return; + } elseif ($newMasterPass !== $newMasterPassR) { + $this->jsonResponse->setDescription(_('Las claves maestras no coinciden')); + return; + } elseif (!Crypt::checkHashPass($currentMasterPass, ConfigDB::getValue('masterPwd'), true)) { + $this->jsonResponse->setDescription(_('La clave maestra actual no coincide')); + return; + } + + if (Checks::demoIsEnabled()) { + $this->jsonResponse->setDescription(_('Ey, esto es una DEMO!!')); + return; + } + + $hashMPass = Crypt::mkHashPassword($newMasterPass); + + if (!$noAccountPassChange) { + $Account = new Account(); + + if (!$Account->updateAccountsMasterPass($currentMasterPass, $newMasterPass)) { + $this->jsonResponse->setDescription(_('Errores al actualizar las claves de las cuentas')); + return; + } + + $AccountHistory = new AccountHistory(); + + if (!$AccountHistory->updateAccountsMasterPass($currentMasterPass, $newMasterPass, $hashMPass)) { + $this->jsonResponse->setDescription(_('Errores al actualizar las claves de las cuentas del histórico')); + return; + } + + if (!CustomFieldsUtil::updateCustomFieldsCrypt($currentMasterPass, $newMasterPass)) { + $this->jsonResponse->setDescription(_('Errores al actualizar datos de campos personalizados')); + return; + } + } + + ConfigDB::setCacheConfigValue('masterPwd', $hashMPass); + ConfigDB::setCacheConfigValue('lastupdatempass', time()); + + $Log = new Log(_('Actualizar Clave Maestra')); + + if (ConfigDB::writeConfig()) { + $Log->addDescription(_('Clave maestra actualizada')); + + $this->jsonResponse->setStatus(0); + } else { + $Log->setLogLevel(Log::ERROR); + $Log->addDescription(_('Error al guardar el hash de la clave maestra')); + } + + $this->jsonResponse->setDescription($Log->getDescription()); + + $Log->writeLog(); + Email::sendEmail($Log); + } + + /** + * Acción para generarclave maestra temporal + */ + protected function tempMasterPassAction() + { + $tempMasterMaxTime = Request::analyze('tmpass_maxtime', 3600); + $tempMasterPass = CryptMasterPass::setTempMasterPass($tempMasterMaxTime); + + $Log = new Log('Generar Clave Temporal'); + + if ($tempMasterPass !== false && !empty($tempMasterPass)) { + $Log->addDescription(_('Clave Temporal Generada')); + $Log->addDetails(Html::strongText(_('Clave')), $tempMasterPass); + + $this->jsonResponse->setStatus(0); + } else { + $Log->setLogLevel(Log::ERROR); + $Log->addDescription(_('Error al generar clave temporal')); + + } + + $this->jsonResponse->setDescription($Log->getDescription()); + + $Log->writeLog(); + Email::sendEmail($Log); + } +} \ No newline at end of file diff --git a/inc/SP/Controller/ItemActionController.class.php b/inc/SP/Controller/ItemActionController.class.php index c98e9968..9985a00b 100644 --- a/inc/SP/Controller/ItemActionController.class.php +++ b/inc/SP/Controller/ItemActionController.class.php @@ -606,7 +606,7 @@ class ItemActionController implements ItemControllerInterface * @throws \SP\Core\Exceptions\ValidationException * @throws \SP\Core\Exceptions\SPException */ - private function favoriteAction() + protected function favoriteAction() { $userId = Session::getUserData()->getUserId(); @@ -629,7 +629,7 @@ class ItemActionController implements ItemControllerInterface /** * Importar usuarios de LDAP */ - private function ldapImportAction() + protected function ldapImportAction() { if (UserLdapSync::run()) { $this->jsonResponse->setStatus(0); @@ -645,8 +645,10 @@ class ItemActionController implements ItemControllerInterface /** * Acciones sobre plugins + * + * @throws \SP\Core\Exceptions\SPException */ - private function pluginAction() + protected function pluginAction() { $PluginData = new PluginData(); $PluginData->setPluginId($this->itemId); diff --git a/inc/SP/Controller/MainController.class.php b/inc/SP/Controller/MainController.class.php index 696456a9..ff143cb7 100644 --- a/inc/SP/Controller/MainController.class.php +++ b/inc/SP/Controller/MainController.class.php @@ -391,6 +391,7 @@ class MainController extends ControllerBase implements ActionsInterface $this->view->addTemplate('update'); $this->view->assign('hasUpdates', false); + $this->view->assign('updateStatus', null); if (Config::getConfig()->isCheckUpdates()) { $updates = Util::checkUpdates(); diff --git a/inc/themes/material-blue/views/config/general.inc b/inc/themes/material-blue/views/config/general.inc index dab45262..1cfcc2f8 100644 --- a/inc/themes/material-blue/views/config/general.inc +++ b/inc/themes/material-blue/views/config/general.inc @@ -5,8 +5,11 @@ ?>