Forráskód Böngészése

NEW Add $dolibarr_main_db_readonly in conf.php for readonly access.

Laurent Destailleur 3 éve
szülő
commit
3fadd5cda5

+ 8 - 0
htdocs/admin/system/dolibarr.php

@@ -327,6 +327,7 @@ $configfileparameters = array(
 	'dolibarr_main_db_character_set' => $langs->trans("DBStoringCharset"),
 	'dolibarr_main_db_collation' => $langs->trans("DBSortingCollation"),
 	'?dolibarr_main_db_prefix' => $langs->trans("DatabasePrefix"),
+	'dolibarr_main_db_readonly' => $langs->trans("ReadOnlyMode"),
 	'separator2' => '',
 	'dolibarr_main_authentication' => $langs->trans("AuthenticationMode"),
 	'?multicompany_transverse_mode'=>  $langs->trans("MultiCompanyMode"),
@@ -449,6 +450,13 @@ foreach ($configfileparameters as $key => $value) {
 				if (!empty($valuetoshow)) {
 					print img_warning($langs->trans('SwitchThisForABetterSecurity', 0));
 				}
+			} elseif ($newkey == 'dolibarr_main_db_readonly') {
+				print ${$newkey};
+
+				$valuetoshow = ${$newkey};
+				if (!empty($valuetoshow)) {
+					print img_warning($langs->trans('ReadOnlyMode', 1));
+				}
 			} else {
 				print (empty(${$newkey}) ? '' : ${$newkey});
 			}

+ 9 - 0
htdocs/conf/conf.php.example

@@ -151,6 +151,15 @@ $dolibarr_main_db_character_set='utf8';
 $dolibarr_main_db_collation='utf8_unicode_ci';
 
 
+// dolibarr_main_db_readonly
+// Set this to 1 to have the application working in readonly mode. All sql access INSERT/UPDATE/DELETE/CREATE/ALTER/TRUNCATE/DROP will be disabled. 
+// Default value: 0
+// Examples:
+// $dolibarr_main_db_readonly='0';
+//
+$dolibarr_main_db_readonly=0;
+
+
 // dolibarr_main_instance_unique_id
 // An secret ID that is unique for each installation.
 // This value is also visible and never propagated outside of Dolibarr, so it can be used as a salt / key for some encryption.

+ 10 - 1
htdocs/core/db/mysqli.class.php

@@ -266,7 +266,7 @@ class DoliDBMysqli extends DoliDB
 	 */
 	public function query($query, $usesavepoint = 0, $type = 'auto')
 	{
-		global $conf;
+		global $conf, $dolibarr_main_db_readonly;
 
 		$query = trim($query);
 
@@ -278,6 +278,15 @@ class DoliDBMysqli extends DoliDB
 			return false; // Return false = error if empty request
 		}
 
+		if (!empty($dolibarr_main_db_readonly)) {
+			if (preg_match('/^(INSERT|UPDATE|DELETE|CREATE|ALTER|TRUNCATE|DROP)/i', $query)) {
+				$this->lasterror = 'Application in read-only mode';
+				$this->lasterrno = 'APPREADONLY';
+				$this->lastquery = $query;
+				return false;
+			}
+		}
+
 		if (!$this->database_name) {
 			// Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE)
 			$ret = $this->db->query($query);

+ 13 - 1
htdocs/core/db/pgsql.class.php

@@ -498,7 +498,7 @@ class DoliDBPgsql extends DoliDB
 	 */
 	public function query($query, $usesavepoint = 0, $type = 'auto')
 	{
-		global $conf;
+		global $conf, $dolibarr_main_db_readonly;
 
 		$query = trim($query);
 
@@ -527,6 +527,18 @@ class DoliDBPgsql extends DoliDB
 			$SYSLOG_SQL_LIMIT = 10000; // limit log to 10kb per line to limit DOS attacks
 			dol_syslog('sql='.substr($query, 0, $SYSLOG_SQL_LIMIT), LOG_DEBUG);
 		}
+		if (empty($query)) {
+			return false; // Return false = error if empty request
+		}
+
+		if (!empty($dolibarr_main_db_readonly)) {
+			if (preg_match('/^(INSERT|UPDATE|DELETE|CREATE|ALTER|TRUNCATE|DROP)/i', $query)) {
+				$this->lasterror = 'Application in read-only mode';
+				$this->lasterrno = 'APPREADONLY';
+				$this->lastquery = $query;
+				return false;
+			}
+		}
 
 		$ret = @pg_query($this->db, $query);
 

+ 10 - 1
htdocs/core/db/sqlite3.class.php

@@ -397,7 +397,7 @@ class DoliDBSqlite3 extends DoliDB
 	 */
 	public function query($query, $usesavepoint = 0, $type = 'auto')
 	{
-		global $conf;
+		global $conf, $dolibarr_main_db_readonly;
 
 		$ret = null;
 
@@ -455,6 +455,15 @@ class DoliDBSqlite3 extends DoliDB
 			return false; // Return false = error if empty request
 		}
 
+		if (!empty($dolibarr_main_db_readonly)) {
+			if (preg_match('/^(INSERT|UPDATE|DELETE|CREATE|ALTER|TRUNCATE|DROP)/i', $query)) {
+				$this->lasterror = 'Application in read-only mode';
+				$this->lasterrno = 'APPREADONLY';
+				$this->lastquery = $query;
+				return false;
+			}
+		}
+
 		// Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE)
 		try {
 			//$ret = $this->db->exec($query);

+ 4 - 4
scripts/accountancy/export-thirdpartyaccount.php

@@ -96,9 +96,12 @@ if (empty($date_start) || empty($date_end)) { // We define date_start and date_e
 		$date_start = dol_get_first_day($year_start, 10, false);
 		$date_end = dol_get_last_day($year_start, 12, false);
 	}
-} else {
 }
 
+/*
+ * Main
+ */
+
 llxHeader();
 
 $form = new Form($db);
@@ -186,9 +189,6 @@ if ($resql) {
 		$i++;
 	}
 
-	/*
-	 * View
-	 */
 
 	$thirdpartystatic = new Societe($db);
 

+ 5 - 0
scripts/company/sync_contacts_dolibarr2ldap.php

@@ -69,6 +69,11 @@ foreach ($argv as $key => $val) {
 
 $now = $argv[1];
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 print "Mails sending disabled (useless in batch mode)\n";
 $conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
 print "\n";

+ 5 - 0
scripts/cron/cron_run_jobs.php

@@ -108,6 +108,11 @@ if ($key != $conf->global->CRON_KEY) {
 	exit(-1);
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-only mode\n";
+	exit(-1);
+}
+
 // If param userlogin is reserved word 'firstadmin'
 if ($userlogin == 'firstadmin') {
 	$sql = 'SELECT login, entity from '.MAIN_DB_PREFIX.'user WHERE admin = 1 and statut = 1 ORDER BY entity LIMIT 1';

+ 5 - 0
scripts/emailings/mailing-send.php

@@ -86,6 +86,11 @@ if (!empty($conf->global->MAILING_DELAY)) {
 if ($conf->global->MAILING_LIMIT_SENDBYCLI == '-1') {
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-only mode\n";
+	exit(-1);
+}
+
 $user = new User($db);
 // for signature, we use user send as parameter
 if (!empty($login)) {

+ 6 - 0
scripts/emailings/reset-invalid-emails.php

@@ -57,6 +57,7 @@ require_once DOL_DOCUMENT_ROOT."/comm/mailing/class/mailing.class.php";
 $version = DOL_VERSION;
 $error = 0;
 
+
 /*
  * Main
  */
@@ -71,6 +72,11 @@ if (!in_array($type, array('all', 'thirdparties', 'contacts', 'users', 'members'
 	exit(-1);
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $db->begin();
 
 

+ 5 - 0
scripts/invoices/email_unpaid_invoices_to_customers.php

@@ -80,6 +80,11 @@ if ($mode != 'confirm') {
 	$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date,";
 $sql .= " s.rowid as sid, s.nom as name, s.email, s.default_lang";
 if ($targettype == 'contacts') {

+ 5 - 0
scripts/invoices/email_unpaid_invoices_to_representatives.php

@@ -76,6 +76,11 @@ if ($mode != 'confirm') {
 	$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date, s.nom as name, s.email, s.default_lang,";
 $sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang";
 $sql .= " FROM ".MAIN_DB_PREFIX."facture as f";

+ 6 - 0
scripts/invoices/rebuild_merge_pdf.php

@@ -52,6 +52,7 @@ $langs->load("main");
 $version = DOL_VERSION;
 $error = 0;
 
+
 /*
  * Main
  */
@@ -66,6 +67,11 @@ if (!isset($argv[1])) {
 	exit(-1);
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $diroutputpdf = $conf->facture->dir_output.'/temp';
 $newlangid = 'en_EN'; // To force a new lang id
 $filter = array();

+ 5 - 0
scripts/members/sync_members_dolibarr2ldap.php

@@ -68,6 +68,11 @@ foreach ($argv as $key => $val) {
 	}
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $now = $argv[1];
 
 print "Mails sending disabled (useless in batch mode)\n";

+ 5 - 0
scripts/members/sync_members_ldap2dolibarr.php

@@ -146,6 +146,11 @@ if ($typeid <= 0) {
 	exit(-2);
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 if (!$confirmed) {
 	print "Hit Enter to continue or CTRL+C to stop...\n";
 	$input = trim(fgets(STDIN));

+ 6 - 0
scripts/members/sync_members_types_dolibarr2ldap.php

@@ -70,6 +70,12 @@ dol_syslog($script_file." launched with arg ".join(',', $argv));
  * }
  */
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
+
 $sql = "SELECT rowid";
 $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type";
 

+ 5 - 0
scripts/members/sync_members_types_ldap2dolibarr.php

@@ -88,6 +88,11 @@ foreach ($argv as $key => $val) {
 	}
 }
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 print "Mails sending disabled (useless in batch mode)\n";
 $conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
 print "\n";

+ 10 - 0
scripts/website/migrate-news-joomla2dolibarr.php

@@ -63,8 +63,18 @@ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
 include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
 include_once DOL_DOCUMENT_ROOT.'/core/lib/website2.lib.php';
 
+
+/*
+ * Main
+ */
+
 $langs->load('main');
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $joomlaserverinfoarray = preg_split('/(:|@|\/)/', $joomlaserverinfo);
 $joomlalogin = $joomlaserverinfoarray[0];
 $joomlapass = $joomlaserverinfoarray[1];

+ 10 - 0
scripts/website/regenerate-pages.php

@@ -58,8 +58,18 @@ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
 include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
 include_once DOL_DOCUMENT_ROOT.'/core/lib/website2.lib.php';
 
+
+/*
+ * Main
+ */
+
 $langs->load('main');
 
+if (!empty($dolibarr_main_db_readonly)) {
+	print "Error: instance in read-onyl mode\n";
+	exit(-1);
+}
+
 $website = new Website($db);
 $result = $website->fetch(0, $websiteref);
 if ($result <= 0) {