diff --git a/htaccess.txt b/htaccess.txt index c105bc7..b3d3c45 100644 --- a/htaccess.txt +++ b/htaccess.txt @@ -1,26 +1,50 @@ - - - ExpiresActive On - ExpiresDefault "access plus 10 years" - - - - RewriteEngine On - - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*\.(js|css))$ smartoptimizer/?$1 - - - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^(.*\.(js|css|html?|xml|txt))$ smartoptimizer/?$1 - - - - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^(.*\.(gif|jpg|jpeg|png|swf|css|js|html?|xml|txt|ico))$ smartoptimizer/?$1 - - - - FileETag none - +# crmv@272658 + + # disable access to composer files, to avoid library enumeration + Order Allow,Deny + Deny from all + + +# crmv@301301 +# disable the server signature for server generated pages +# beware: this is not hiding the header "Server" +ServerSignature Off + +# crmv@343310 + + + + Header set Content-Type "application/manifest+json" + + + +# crmv@343310e + +# Enable this if you want to use smartoptimizer (can be buggy with some files) +# +# +# +# ExpiresActive On +# ExpiresDefault "access plus 10 years" +# +# +# +# RewriteEngine On +# +# RewriteCond %{REQUEST_FILENAME} !-f +# RewriteCond %{REQUEST_FILENAME} !-d +# RewriteRule ^(.*\.(js|css))$ smartoptimizer/?$1 +# +# +# RewriteCond %{REQUEST_FILENAME} -f +# RewriteRule ^(.*\.(js|css|html?|xml|txt))$ smartoptimizer/?$1 +# +# +# +# RewriteCond %{REQUEST_FILENAME} -f +# RewriteRule ^(.*\.(gif|jpg|jpeg|png|swf|css|js|html?|xml|txt|ico))$ smartoptimizer/?$1 +# +# +# +# FileETag none +# diff --git a/include/Webservices/Language.php b/include/Webservices/Language.php index 47f596f..a49edd0 100644 --- a/include/Webservices/Language.php +++ b/include/Webservices/Language.php @@ -15,13 +15,21 @@ function vte_get_labels($username, $language, $module){ $language = $user->default_language; } - $query = "SELECT label,trans_label - FROM sdk_language - WHERE language = ? "; - if($module != ''){ - $query .= " AND module = '$module' "; + // crmv@341207 + $query = " + SELECT label,trans_label + FROM sdk_language + WHERE language = ? + "; + $params = [$language]; + + if ($module != '') { + $query .= " AND module = ? "; + $params[] = $module; } - $res = $adb->pquery($query, array($language)); + + $res = $adb->pquery($query, $params); + // crmv@341207e $labels = Array(); diff --git a/include/utils/GDPRWS/templates/privacy_policy.html b/include/utils/GDPRWS/templates/privacy_policy.html index 518e981..b55dce8 100644 --- a/include/utils/GDPRWS/templates/privacy_policy.html +++ b/include/utils/GDPRWS/templates/privacy_policy.html @@ -1,252 +1 @@ -

INFORMATIVA PRIVACY FINALIZZATA ALL’AUTORIZZAZIONE AL TRATTAMENTO DI DATI PERSONALI

- -

 

- -

Ai sensi del combinato disposto del Decreto Legislativo 30 giugno 2003, n. 196 recante “Codice in materia di protezione dei dati personali” (Testo Unico in materia di Privacy)

- -

e del Regolamento (UE) 2016/679 del Parlamento Europeo e del Consiglio del 27 aprile 2016

- -

relativo alla protezione delle persone fisiche con riguardo al trattamento dei dati personali

- -

nonché alla libera circolazione di tali dati da qui in poi anche soltanto “GDPR

- -

 

- -

 

- -

P R E M E S S O

- -

 

- -
    -
  1. -

    che il GDPR, pubblicato nella Gazzetta Ufficiale dell’Unione Europea (GUUE) L. 119 del 4 maggio 2016 e, ai sensi dell’art. 99 del GDPR, è entrato in vigore il 25 maggio 2016 e si applicherà obbligatoriamente in ciascuno Stato membro a far data dal 25 maggio 2018;

    -
  2. -
- -

 

- -
    -
  1. -

    che, fino all’emanazione di provvedimenti diretti ad adeguare il quadro normativo nazionale alle disposizioni del Regolamento UE n. 679/2016 (GDPR), si rende necessaria, anche, l’applicazione del Codice della Privacy (D.lgs.n.196/2003), ancorché, nei limiti di quanto ciò non risulterà incompatibile con le previsioni contenute nel GDPR stesso;

    -
  2. -
- -

 

- -
    -
  1. -

    che, pertanto, fermo restando quanto già previsto e disciplinato dal D.lgs.n.196/2003, il GDPR, con le eccezioni previste all’articolo 2, trova applicazione al trattamento interamente o parzialmente automatizzato di dati personali e al trattamento non automatizzato di dati personali contenuti in un archivio o destinati a figurarvi;

    -
  2. -
- -

 

- -
    -
  1. -

    che, secondo quanto previsto dall’art. 5 GDPR (“Principi applicabili al trattamento di dati personali”), i dati personali dell’interessato sono trattati secondo principi di

    -
  2. -
- -

 

- - - -

 

- -
    -
  1. -

    che, in particolare, il trattamento è “lecito” se, e nella misura in cui, cfr. art. 6 GDPR (“Liceità del trattamento”) ricorra almeno una delle seguenti condizioni:

    -
  2. -
- -

 

- - - -

 

- -

tutto quanto sopra premesso, in ottemperanza al disposto normativo di cui all’art. 13 (“Informazioni da fornire qualora i dati personali siano raccolti presso l’interessato”) – Sezione 2 (“Informazioni e accesso ai dati personali”) del GDPR, e di cui all’art. 13 (“Informativa”) del D.lgs.n.196/2003

- -

 

- -

Identificazione del “Titolare del Trattamento”

- -

 

- -

(cfr. definizione “Titolare del trattamento” punto 7 – art. 4 “Definizioni” GDPR: “persona fisica o giuridica, autorità pubblica, il servizio o altro organismo che, singolarmente o insieme ad altri, determina le finalità e i mezzi del trattamento di dati personali” e definizione “Titolare” lettera f) – art. 4 “Definizioni” D.lgs.n.196/2003: “la persona fisica, la persona giuridica, la pubblica amministrazione e qualsiasi altro ente associazione od organismo, cui competono anche unitamente a ad altro titolare, le decisioni in ordine alle finalità, alle modalità del trattamento di dati personali e agli strumenti utilizzati, ivi compreso il profilo della sicurezza”):

- -

 

- -

Oggetto e Modalità del Trattamento:

- -

 

- -

(cfr. definizione “Trattamento” – art. 4 “Definizioni” GDPR: “qualsiasi operazione o insieme di operazioni, compiute con o senza l’ausilio di processi automatizzati e applicati a dati personali o insiemi di dati personali, come la raccolta, la registrazione, l’organizzazione, la strutturazione, la conservazione, l’adattamento o la modifica, l’estrazione, la consultazione, l’uso, la comunicazione meditante trasmissione, diffusione o qualsiasi altra forma di messa a disposizione, il raffronto o l’interconnessione, la limitazione, la cancellazione o la distruzione” e definizione “Trattamento” – lettera a) art. 4, D.lgs.n.196/2003: “qualunque operazione o complesso di operazioni, effettuati anche senza l’ausilio di strumenti elettronici, concernenti la raccolta, la registrazione, l’organizzazione, la conservazione, la consultazione, l’elaborazione, la modificazione, la selezione, l’estrazione, il raffronto, l’utilizzo, l’interconnessione, il blocco, la comunicazione, la diffusione, la cancellazione e la distruzione di dati, anche, se non registrati in una banca dati” cfr. definizione di “Dato Personalepunto 1 – art. 4 “Definizioni” GDPR: “qualsiasi informazione riguardante una persona identificata o identificabile (“interessato”) considerandosi per “identificabile” la persona fisica che può essere identificata, direttamente o indirettamente, con particolare riferimento a un identificativo come il nome, un numero di identificazione, dati relativi all’ubicazione, un identificativo online o a uno o più elementi caratteristici della sua identità fisica, fisiologica, generica, psichica, economica, culturale o sociale”); e definizione “Dato Personale” – lettera b), art. 4, D.lgs.n.196/2003: “qualunque informazione relativa a persona fisica, persona giuridica, ente od associazione, identificati o identificabili, anche indirettamente, mediante riferimento a qualsiasi altra informazione, ivi compreso un numero di identificazione personale”;

- -

 

- -

Il titolare tratta i dati personali identificativi forniti dall’interessato.

- -

Il trattamento dei dati personali è realizzato sulla base delle operazioni indicate all’articolo 4, n.2), GDPR e dall’art. 4, lettera a), D.lgs.n.196/2003 e precisamente: raccolta, anche, attraverso l’ausilio di strumenti elettronici ed automatizzati; registrazione per scopi determinati, espliciti e legittimi ed utilizzo in ulteriori operazioni di trattamento, comunque, compatibili con tali scopi; organizzazione, conservazione, consultazione, elaborazione, modificazione, selezione, estrazione, raffronto, utilizzo, interconnessione, blocco, comunicazione, cancellazione e distruzione dei dati.

- -

I dati verranno trattati nel rispetto della sicurezza e riservatezza necessaire e saranno sottoposti a trattamento sia cartaceo che elettronico e/o automatizzato.

- -

Il Titolare tratterà i dati personali per il tempo necessario per adempiere alle finalità di cui sopra avendo cura di conservarli, comunque, nei limiti di quanto di seguito specificato.

- -

 

- -

Finalità del trattamento a cui sono destinati i dati personali:

- -

 

- -

I dati vengono qui raccolti e trattati:

- -

 

- -
    -
  1. -

    senza consenso espresso (cfr. art. 24, D.lgs.n.196/2003 e cfr. art. 6 GDPR), per le seguenti finalità di Servizio:

    -
  2. -
- -

 

- - - -

 

- -
    -
  1. -

    solo previo specifico e distinto consenso (cfr. art. 7 GDPR), per le seguenti finalità di Marketing:

    -
  2. -
- -

 

- - - -

 

- -

Precisazioni in ordine al trattamento per “Finalità di Marketing” e di “Profilazione

- -

 

- -

A beneficio dell’interessato, si precisa quanto segue:

- -

 

- -
    -
  1. -

    I dati personali raccolti saranno trattati anche per perseguire finalità di promozione commerciale, comunicazione pubblicitaria, sollecitazione a comportamenti di acquisto, ricerche di mercato, sondaggi (anche telefonici, on-line o mediante formulari), elaborazioni statistiche (in forma identificativa), altre ricerche campionarie di marketing in senso lato di prodotti e/o servizi riferibili alla Società (di seguito, complessivamente, “Trattamento per Finalità di Marketing”) sia attraverso marketing “generico” sia “profilatoconseguente cioè all’ “attività di profilazione(cfr. definizione “Profilazione” – art. 4 “Definizioni”: “qualsiasi forma di trattamento automatizzato di dati personali consistente nell’utilizzo di tali dati personali per valutare determinati aspetti personali relativi a una persona fisica […]”)

    -
  2. -
  3. -

    In ogni caso, anche laddove l’interessato abbia prestato il consenso, resterà comunque libero in ogni momento di revocarlo, modificando le impostazioni dei consensi nell’area “Comunicazione e Privacy” del sito. A seguito della ricezione di tale richiesta di opt-out, il Titolare del Trattamento procederà tempestivamente alla rimozione e cancellazione dei dati dai database utilizzati per il “Trattamento per Finalità di Marketing” e di “Profilazione” e informerà per le medesime finalità di cancellazione eventuali terzi cui i dati siano stati comunicati.

    -
  4. -
  5. -

    Nel caso sia richiesta – per le finalità sopra illustrate – l’indicazione del numero di utenza telefonica dell’interessato e questi abbia prestato il consenso opzionale e specifico (che copre anche il trattamento di tale dato personale) per le finalità di promozione commerciale, di marketing e di profilazione sopra illustrate, il Titolare del Trattamento informa l’interessato che potrà legalmente trattare l’utenza telefonica per scopi marketing e di profilazione anche se essa risulti iscritta al Registro Pubblico delle Opposizioni, in quanto tratta da fonte diversa dagli elenchi telefonici pubblici e coperta da specifico consenso, salvo il diritto di opposizione successiva al trattamento ove sia formalmente revocato il consenso.

    -
  6. -
  7. -

    Si informa specificatamente e separatamente, come richiesto dall’art. 21 del GDPR che l'interessato ha il diritto di opporsi in qualsiasi momento al trattamento dei dati personali che lo riguardano effettuato per tali finalità e che qualora l'interessato si opponga al trattamento per finalità di marketing diretto e profilazione, i dati personali non potranno più essere oggetto di trattamento per tali finalità.

    -
  8. -
- -

 

- -

Diritti dell’interessato:

- -

 

- -

In conformità a quanto previsto dall’art. 7, D.lgs.n.196/2003 e GDPR l’interessato potrà esercitare i seguenti diritti

- -

 

- - - -

 

+Before usage read: https://usermanual.vtenext.com/books/user-manual-vtenext-2205/page/71-how-to-create-contact-campaigns diff --git a/include/utils/RequestHandler.php b/include/utils/RequestHandler.php index 3f52433..47db1b1 100644 --- a/include/utils/RequestHandler.php +++ b/include/utils/RequestHandler.php @@ -8,106 +8,219 @@ class RequestHandler { - // crmv@177677 - /** - * Return a "unique" id for each requests - * Remember: not guaranteed to be 100% unique, but enough for common use - */ - static public function getId() { - static $requestId = null; - if (is_null($requestId)) { - global $application_unique_key; - $cliflag = (php_sapi_name() == 'cli' ? 'C' : 'W'); - $prefix = substr($application_unique_key, 0, 2) . $cliflag; - $requestId = uniqid($prefix, true); - } - return $requestId; - } - // crmv@177677e + // crmv@177677 + /** + * Return a "unique" id for each requests + * Remember: not guaranteed to be 100% unique, but enough for common use + */ + static public function getId() { + static $requestId = null; + if (is_null($requestId)) { + global $application_unique_key; + $cliflag = (php_sapi_name() == 'cli' ? 'C' : 'W'); + $prefix = substr($application_unique_key, 0, 2) . $cliflag; + $requestId = uniqid($prefix, true); + } + return $requestId; + } + // crmv@177677e - static public function processCompressedRequest() { - $compressedData = $_REQUEST['compressedData'] ?? ''; - - if ($compressedData === 'true' && isset($_FILES['payload'])) { - if ($_FILES['payload']['error'] != 0) throw new Exception('File upload error'); - - $fmt = $_REQUEST['compressFormat']; - $serial = $_REQUEST['serializeFormat']; + static public function processCompressedRequest() { + $compressedData = $_REQUEST['compressedData'] ?? ''; - // uncompress - if ($fmt === 'gzip') { - $zp = gzopen($_FILES['payload']['tmp_name'], 'rb'); - if ($zp) { - $rawdata = ''; - while (!gzeof($zp)) { - $rawdata .= gzread($zp, 10000); - } - gzclose($zp); - } else { - throw new Exception('Unable to open compressed data'); - } - } else { - throw new Exception('Unknown compression format'); - } - - // decode - $payload = null; - if ($serial === 'serialize') { - // beware, this is still subjected to max_input_vars :( - // see http://php.net/manual/en/function.parse-str.php#108642 - parse_str($rawdata, $payload); - } elseif ($serial === 'json') { - $payload = json_decode($rawdata, true); - } else { - throw new Exception('Unknown serialization format'); - } - - // merge with request - if (is_array($payload)) { - // crmv@162674 - // Using replace to keep numeric keys - $_REQUEST = array_replace($_REQUEST, $payload); - if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $_POST = array_replace($_POST, $payload); - } - // crmv@162674e - } - } - } - - static public function outputRedirect($url, $rformat = null) { - if (!$rformat) $rformat = $_REQUEST['responseFormat']; - - if ($rformat === 'json') { - $result = array('success' => true, 'redirect' => $url); - header('Content-type: application/json'); - echo json_encode($result); - exit(); - } - - header("Location: $url"); - } - - // crmv@171581 - static public function getCSRFToken() { - $VP = VTEProperties::getInstance(); - if ($VP->getProperty('security.csrf.enabled')) { - $VTECSRF = new VteCsrf(); - return $VTECSRF->csrf_get_tokens(); - } else { - return ''; - } - } + if ($compressedData === 'true' && isset($_FILES['payload'])) { + if ($_FILES['payload']['error'] != 0) throw new Exception('File upload error'); - static public function validateCSRFToken() { - $VP = VTEProperties::getInstance(); - if ($VP->getProperty('security.csrf.enabled')) { - $VTECSRF = new VteCsrf(); - return $VTECSRF->csrf_check(); - } else { - return true; - } - } - // crmv@171581e - -} \ No newline at end of file + $fmt = $_REQUEST['compressFormat']; + $serial = $_REQUEST['serializeFormat']; + + // uncompress + if ($fmt === 'gzip') { + $zp = gzopen($_FILES['payload']['tmp_name'], 'rb'); + if ($zp) { + $rawdata = ''; + while (!gzeof($zp)) { + $rawdata .= gzread($zp, 10000); + } + gzclose($zp); + } else { + throw new Exception('Unable to open compressed data'); + } + } else { + throw new Exception('Unknown compression format'); + } + + // decode + $payload = null; + if ($serial === 'serialize') { + // beware, this is still subjected to max_input_vars :( + // see http://php.net/manual/en/function.parse-str.php#108642 + parse_str($rawdata, $payload); + } elseif ($serial === 'json') { + $payload = json_decode($rawdata, true); + } else { + throw new Exception('Unknown serialization format'); + } + + // merge with request + if (is_array($payload)) { + // crmv@162674 + // Using replace to keep numeric keys + $_REQUEST = array_replace($_REQUEST, $payload); + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $_POST = array_replace($_POST, $payload); + } + // crmv@162674e + } + } + } + + static public function outputRedirect($url, $rformat = null) { + if (!$rformat) $rformat = $_REQUEST['responseFormat']; + + if ($rformat === 'json') { + $result = array('success' => true, 'redirect' => $url); + header('Content-type: application/json'); + echo json_encode($result); + exit(); + } + + header("Location: $url"); + } + + // crmv@171581 + static public function getCSRFToken() { + $VP = VTEProperties::getInstance(); + if ($VP->getProperty('security.csrf.enabled')) { + $VTECSRF = new VteCsrf(); + return $VTECSRF->csrf_get_tokens(); + } else { + return ''; + } + } + + static public function validateCSRFToken() { + $VP = VTEProperties::getInstance(); + if ($VP->getProperty('security.csrf.enabled')) { + $VTECSRF = new VteCsrf(); + return $VTECSRF->csrf_check(); + } else { + return true; + } + } + // crmv@171581e + + //crmv@211287 + static public function paramGet($name){ + return $_GET[$name]; + } + + static public function paramPost($name){ + return $_POST[$name]; + } + + static public function param($name){ + return $_REQUEST[$name]; + } + + static public function filterIntParam($value){ + return intval($value); + } + + static public function filterStringParam($value, $maxLength=100){ + return substr(strip_tags($value), 0, $maxLength); + } + + static public function filterHtmlParam($value){ + return vtlib_purify($value); + } + + static public function filterFloatParam($value){ + return floatval($value); + } + + static public function filterBoolParam($value){ + return filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + static public function filterModuleParam($value){ + return preg_replace("/[^a-zA-Z0-9_\-\s]/", '', $value);//allow only letters, numbers and '-' '_' ' ' + } + + static public function paramInt($name){ + return self::filterIntParam(self::param($name)); + } + + static public function paramString($name, $maxLength = 100){ + return self::filterStringParam(self::param($name), $maxLength); + } + + static public function paramFloat($name){ + return self::filterFloatParam(self::param($name)); + } + + static public function paramHtml($name){ + return self::filterHtmlParam(self::param($name)); + } + + static public function paramBool($name){ + return self::filterBoolParam(self::param($name)); + } + + static public function paramGetInt($name){ + return self::filterIntParam(self::paramGet($name)); + } + + static public function paramGetString($name, $maxLength = 100){ + return self::filterStringParam(self::paramGet($name), $maxLength); + } + + static public function paramGetFloat($name){ + return self::filterFloatParam(self::paramGet($name)); + } + + static public function paramGetHtml($name){ + return self::filterHtmlParam(self::paramGet($name)); + } + + static public function paramGetBool($name){ + return self::filterBoolParam(self::paramGet($name)); + } + + static public function paramPostInt($name){ + return self::filterIntParam(self::paramPost($name)); + } + + static public function paramPostString($name, $maxLength = 100){ + return self::filterStringParam(self::paramPost($name), $maxLength); + } + + static public function paramPostFloat($name){ + return self::filterFloatParam(self::paramPost($name)); + } + + static public function paramPostHtml($name){ + return self::filterHtmlParam(self::paramPost($name)); + } + + static public function paramPostBool($name){ + return self::filterBoolParam(self::paramPost($name)); + } + + static public function paramModule($name){ + return self::filterModuleParam(self::param($name)); + } + + static public function paramAction($name){ + return self::filterModuleParam(self::param($name)); + } + + static public function paramField($name){ + return self::filterModuleParam(self::param($name)); + } + + static public function paramParentTab($name){ + return self::filterModuleParam(self::param($name)); + } + //crmv@211287 + +} diff --git a/include/utils/UserAuthtoken.php b/include/utils/UserAuthtoken.php index 9099d2b..066c82a 100644 --- a/include/utils/UserAuthtoken.php +++ b/include/utils/UserAuthtoken.php @@ -9,7 +9,7 @@ function getUserAuthtokenKey($type,$user_id,$seconds_to_expire, $securetoken = f global $adb; emptyUserAuthtokenKey($type,$user_id); //crmv@29377 - //genera un token più sicuro + //genera un token pi? sicuro if ($securetoken){ $authToken = md5(crypt(strval(microtime(true)+(mt_rand(0, 10000) / 10.0)).strval($user_id).$type)); // crmv@179766 } else { @@ -26,26 +26,28 @@ function getUserAuthtokenKey($type,$user_id,$seconds_to_expire, $securetoken = f } } -function validateUserAuthtokenKey($type,$key) { +// crmv@341733: always check key as string, move check into query +function validateUserAuthtokenKey($type, $key) { global $adb; $tmp = Zend_Json::decode(base64_decode($key)); $user_id = (int)$tmp['userid']; - $token = $tmp['token']; - $sql_d = "delete from vte_userauthtoken where type=? and userid=? and expiretime < ?"; - $result_d = $adb->pquery($sql_d,array($type,$user_id,time())); - $sql = "select * from vte_userauthtoken where type=? and userid=? and expiretime >= ?"; - $result = $adb->pquery($sql,array($type,$user_id,time())); - if($result != null && isset($result) && $adb->num_rows($result)>0){ - $token_saved = $adb->query_result($result,0,'token'); - if ($token_saved == $token) { - return $user_id; - } + $token = strval($tmp['token']); + + $sql_d = "delete from vte_userauthtoken where type = ? and userid = ? and expiretime < ?"; + $result_d = $adb->pquery($sql_d, [$type, $user_id, time()]); + + $sql = "select * from vte_userauthtoken where type = ? and userid = ? and token = ? and expiretime >= ?"; + $result = $adb->pquery($sql, [$type, $user_id, $token, time()]); + + if ($result && $adb->num_rows($result) > 0) { + return $user_id; } return false; } +// crmv@341733e function emptyUserAuthtokenKey($type,$user_id) { global $adb; $sql = "delete from vte_userauthtoken where type=? and userid=?"; $adb->pquery($sql,array($type,$user_id)); -} \ No newline at end of file +} diff --git a/modules/Calendar/ActivityAjax.php b/modules/Calendar/ActivityAjax.php index d64e1b2..83afdaf 100644 --- a/modules/Calendar/ActivityAjax.php +++ b/modules/Calendar/ActivityAjax.php @@ -4,9 +4,11 @@ * SPDX-License-Identifier: AGPL-3.0-only ************************************/ +require_once('include/utils/utils.php'); require_once("modules/Calendar/calendarLayout.php"); require_once("modules/Calendar/Calendar.php"); + global $theme,$mod_strings,$app_strings, $current_language,$currentModule,$current_user; global $adb, $table_prefix; @@ -178,7 +180,10 @@ if((isset($_REQUEST['type']) && $_REQUEST['type'] !='') || (isset($_REQUEST['n_t echo constructTodoListView($todo_list,$calendar_arr,$subtab,$navigation_arr)."####".getTodoInfo($calendar_arr,'listcnt'); } } elseif($type == 'view') { - require_once('modules/Calendar/'.$_REQUEST['file'].'.php'); + // crmv@345820 + $reqfile = preg_replace("/[^a-zA-Z0-9_\-\/]/", '', $_REQUEST['file']); + require_once("modules/Calendar/{$reqfile}.php"); + // crmv@345820e } else { die("View option is not defined"); } diff --git a/modules/Calendar/wdCalendar.php b/modules/Calendar/wdCalendar.php index 6ed5b58..43d2ce7 100644 --- a/modules/Calendar/wdCalendar.php +++ b/modules/Calendar/wdCalendar.php @@ -26,6 +26,9 @@ if ($theme === 'next') { } // crmv@187406e -include("modules/Calendar/wdCalendar/$file.php"); +// crmv@345820 +$file = preg_replace("/[^a-zA-Z0-9_\-\/]/", '', $file); +include("modules/Calendar/wdCalendar/{$file}.php"); +// crmv@345820e //crmv@17001e ?> \ No newline at end of file diff --git a/modules/Fax/EditView.php b/modules/Fax/EditView.php index 6577118..ef76deb 100644 --- a/modules/Fax/EditView.php +++ b/modules/Fax/EditView.php @@ -19,15 +19,15 @@ if($_REQUEST['fax_error'] != '') } //added to select the module in combobox of compose-popup if(isset($_REQUEST['par_module']) && $_REQUEST['par_module']!=''){ - $smarty->assign('select_module',$_REQUEST['par_module']); + $smarty->assign('select_module',RequestHandler::paramModule("par_module"));//crmv@211287 } elseif(isset($_REQUEST['pmodule']) && $_REQUEST['pmodule']!='') { - $smarty->assign('select_module',$_REQUEST['pmodule']); + $smarty->assign('select_module',RequestHandler::paramModule("pmodule"));//crmv@211287 } if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') { - $focus->id = $_REQUEST['record']; + $focus->id = RequestHandler::paramInt("record");//crmv@211287 $focus->mode = 'edit'; $focus->retrieve_entity_info($_REQUEST['record'],"Fax"); if(isset($_REQUEST['forward']) && $_REQUEST['forward'] != '') @@ -62,37 +62,54 @@ if($_REQUEST["internal_mailer"] == "true") { $rec_type = $_REQUEST["type"]; $rec_id = $_REQUEST["rec_id"]; $fieldname = $_REQUEST["fieldname"]; + + //crmv@345820 + function get_entity_fax($modulename, $fieldname, $id, $html = false) { + global $current_user; + $fail = ''; + + if ($modulename == 'Users') { + if (!preg_match('/^phone/', $fieldname)) { + return $fail; + } + } elseif (isPermitted($modulename, 'DetailView', $id) !== 'yes') { + return $fail; + } elseif (!in_array(getFieldVisibilityPermission($modulename, $current_user->id, $fieldname), [0, '0'], true)) { + return $fail; + } + + $fieldinfo = FieldUtils::getField($modulename, $fieldname); + if (!$fieldinfo) { + return $fail; + } + $tablename = $fieldinfo['tablename']; + + switch ($modulename) { + case "Users": $keycol = "id"; break; + case "Leads": $keycol = "leadaddressid"; break; + case "Contacts": $keycol = "contactid"; break; + case "Accounts": $keycol = "accountid"; break; + case "Vendors": $keycol = "vendorid"; break; + default: return $fail; + } + + return getSingleFieldValue($tablename, $fieldinfo['columnname'], $keycol, $id, $html) ?? $fail; + } + //crmv@345820e //added for getting list-ids to compose email popup from list view(Accounts,Contacts,Leads) if(isset($_REQUEST['field_id']) && strlen($_REQUEST['field_id']) != 0) { if($_REQUEST['par_module'] == "Users") $id_list = $_REQUEST['rec_id'].'@'.'-1|'; else - $id_list = $_REQUEST['rec_id'].'@'.$_REQUEST['field_id'].'|'; + $id_list = RequestHandler::paramString("rec_id").'@'.RequestHandler::paramString("field_id").'|';//crmv@211287 $smarty->assign("IDLISTS", $id_list); } if($rec_type == "record_id") { $type = $_REQUEST['par_module']; - //check added for email link in user detail view - // crmv@64542 - $modInstance = CRMEntity::getInstance($type); - if(substr($fieldname,0,2)=="cf") - $tablename = $modInstance->customFieldTable[0]; - else - $tablename = $modInstance->table_name; - // crmv@64542e - if($type == "Users") - $q = "select $fieldname from $tablename where id=?"; - elseif($type == "Leads") - $q = "select $fieldname from $tablename where leadaddressid=?"; - elseif ($type == "Contacts") - $q = "select $fieldname from $tablename where contactid=?"; - elseif ($type == "Accounts") - $q = "select $fieldname from $tablename where accountid=?"; - elseif ($type == "Vendors") - $q = "select $fieldname from $tablename where vendorid=?"; - $to_fax = $adb->query_result($adb->pquery($q, array($rec_id)),0,$fieldname); + $to_fax = get_entity_fax($type, $fieldname, $rec_id, true); //crmv@345820 + } elseif ($rec_type == "email_addy") { $to_fax = $_REQUEST["email_addy"]; } @@ -140,15 +157,15 @@ if (isset($_REQUEST['parent_type'])) } if (isset($_REQUEST['filename']) && $_REQUEST['isDuplicate'] != 'true') { - $focus->filename = $_REQUEST['filename']; + $focus->filename = RequestHandler::paramString("filename"); } elseif (is_null($focus->parent_type)) { $focus->parent_type = $app_list_strings['record_type_default_key']; } -$smarty->assign("ENTITY_ID", $_REQUEST["record"]); -$smarty->assign("ENTITY_TYPE",$_REQUEST["fax_directing_module"]); +$smarty->assign("ENTITY_ID", RequestHandler::paramInt("record"));//crmv@211287 +$smarty->assign("ENTITY_TYPE",RequestHandler::paramModule("fax_directing_module"));//crmv@211287 $smarty->assign("OLD_ID", $old_id ); //Display the FCKEditor or not? -- configure $FCKEDITOR_DISPLAY in config.php $smarty->assign("FCKEDITOR_DISPLAY",$FCKEDITOR_DISPLAY); diff --git a/modules/Home/HomeWidgetBlockList.php b/modules/Home/HomeWidgetBlockList.php index c4f1de6..477faa3 100644 --- a/modules/Home/HomeWidgetBlockList.php +++ b/modules/Home/HomeWidgetBlockList.php @@ -19,6 +19,8 @@ require_once('include/home.php'); $homeObj=new Homestuff; +$widgetTypes = ['URL','SDKIframe','Iframe','Charts','Module','RSS','Default']; // crmv@345820 + Zend_Json::$useBuiltinEncoderDecoder = true; $widgetInfoList = Zend_Json::decode($_REQUEST['widgetInfoList']); $widgetHTML = array(); @@ -28,9 +30,21 @@ $smarty->assign("APP",$app_strings); $smarty->assign("THEME", $theme); $smarty->assign("IMAGE_PATH",$image_path); +// crmv@345820 +$accessibleWidgets = []; +$homedetails = $homeObj->getHomePageFrame(); +if (!empty($homedetails)) { + foreach($homedetails as $homedetail) { + $accessibleWidgets[] = $homedetail['Stuffid']; + } +} +// crmv@345820e + foreach ($widgetInfoList as $widgetInfo) { - $widgetType = $widgetInfo['widgetType']; - $widgetId = $widgetInfo['widgetId']; + $widgetType = array_intersect([$widgetInfo['widgetType']], $widgetTypes)[0] ?? ''; // crmv@345820 + $widgetId = intval($widgetInfo['widgetId']); // crmv@345820 + if (!in_array($widgetId, $accessibleWidgets)) continue; // crmv@345820 + if($widgetType == 'URL'){ $url = $homeObj->getWidgetURL($widgetId); if(strpos($url, "://") === false){ @@ -106,5 +120,7 @@ foreach ($widgetInfoList as $widgetInfo) { $html .= $smarty->fetch("Home/HomeBlock.tpl"); $widgetHTML[$widgetId] = $html; } + +header('Content-Type: application/json'); // crmv@345820 echo Zend_JSON::encode($widgetHTML); ?> \ No newline at end of file diff --git a/modules/Import/controllers/Import_ListView_Controller.php b/modules/Import/controllers/Import_ListView_Controller.php index 40363ea..051cd51 100644 --- a/modules/Import/controllers/Import_ListView_Controller.php +++ b/modules/Import/controllers/Import_ListView_Controller.php @@ -31,11 +31,11 @@ class Import_ListView_Controller { $viewer = new Import_UI_Viewer(); - $ownerId = $userInputObject->get('foruser'); + $ownerId = intval($userInputObject->get('foruser')); // crmv@341226 $owner = CRMEntity::getInstance('Users'); $owner->id = $ownerId; $owner->retrieve_entity_info($ownerId, 'Users'); - if(!is_admin($user) && $user->id != $owner->id) { + if (!is_admin($user) && $user->id !== $owner->id) { // crmv@341226 $viewer->display('OperationNotPermitted.tpl', 'VteCore'); exit; } @@ -96,4 +96,4 @@ class Import_ListView_Controller { } } } -?> \ No newline at end of file +?> diff --git a/modules/Import/resources/Utils.php b/modules/Import/resources/Utils.php index 70a0e3f..b3d4133 100644 --- a/modules/Import/resources/Utils.php +++ b/modules/Import/resources/Utils.php @@ -49,7 +49,7 @@ class Import_Utils { public static function getImportFilePath($user) { $importDirectory = self::getImportDirectory(); - return $importDirectory. "IMPORT_".$user->id; + return $importDirectory. "IMPORT_".intval($user->id); // crmv@341226 } @@ -82,7 +82,7 @@ class Import_Utils { public static function getDbTableName($user) { $configReader = new ConfigReader('modules/Import/config.inc', 'ImportConfig'); $userImportTablePrefix = $configReader->getConfig('userImportTablePrefix'); - return $userImportTablePrefix . $user->id; + return $userImportTablePrefix . intval($user->id); // crmv@341226 } public static function showErrorPage($errorMessage, $errorDetails=false, $customActions=false) { diff --git a/modules/Morphsuit/RequestMorphsuit.php b/modules/Morphsuit/RequestMorphsuit.php index c9d3d24..88b2dc6 100644 --- a/modules/Morphsuit/RequestMorphsuit.php +++ b/modules/Morphsuit/RequestMorphsuit.php @@ -29,7 +29,7 @@ if ($_REQUEST['morph_mode'] == 'installation' || VteSession::get('morph_mode') = if ($enterprise_mode == 'VTENEXTCE') { // crmv@192073 // recalc application_unique_key - $application_unique_key = md5(time() + rand(1,9999999) + md5($root_directory)); + $application_unique_key = md5(time() . rand(1,9999999) . md5($root_directory)); $configInc = file_get_contents('config.inc.php'); $configInc = preg_replace('/^\$application_unique_key.*$/m', "\$application_unique_key = '{$application_unique_key}';", $configInc); if (is_writable('config.inc.php')) file_put_contents('config.inc.php', $configInc); diff --git a/modules/SDK/src/205/SaveCrop.php b/modules/SDK/src/205/SaveCrop.php index 8df5b9e..cd50b2c 100644 --- a/modules/SDK/src/205/SaveCrop.php +++ b/modules/SDK/src/205/SaveCrop.php @@ -13,6 +13,12 @@ if ($_REQUEST['mode'] == 'save' && $_REQUEST['avatar'] != '') { $focus->id = $record; $focus->mode = 'edit'; $focus->column_fields['avatar'] = $_REQUEST['avatar']; + // crmv@341228 + if (!$focus->filterOrDenySave()) { + RequestHandler::outputRedirect("index.php?module=Users&action=Logout"); + exit; + } + // crmv@341228e $focus->save("Users"); echo "