mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-06-21 12:09:31 -04:00
Add a ZM_DB_SSL_VERIFY_SERVER_CERT setting so a database connection that uses ZM_DB_SSL_CA_CERT can talk to a server with a self-signed or otherwise non-matching certificate. When enabled, verification is by identity (the cert must chain to the CA and its CN/SAN must match ZM_DB_HOST), consistent across the C++ daemons, the PHP web interface, the CakePHP API and the Perl scripts. This re-does the reverted #3817. That PR broke the build because it called mysql_options(MYSQL_OPT_SSL_VERIFY_SERVER_CERT, ...), and that enum was removed from the MySQL 8.0 C client in favour of MYSQL_OPT_SSL_MODE; it also passed a c_str() where a my_bool* was expected, and referenced the PHP constant unconditionally (fatal on PHP 8 for an upgraded install whose zm.conf predates the option). The option that controls server-cert verification differs by client library and the symbols are enum values, not macros, so CMake feature-detects them by compiling: - HAVE_MYSQL_OPT_SSL_MODE (MySQL 5.7.11+/8.0, MariaDB Connector/C 3.1+) - HAVE_MYSQL_OPT_SSL_VERIFY_SERVER_CERT (older MariaDB/MySQL) zm_db.cpp uses SSL_MODE_VERIFY_IDENTITY / SSL_MODE_REQUIRED when the former is available, else falls back to the latter with a proper my_bool. Value handling is three-way in every layer: a truthy value verifies, a false-y value (0/false/no/off) skips verification, and an empty/unset value leaves the client default in place so existing installs are unchanged on upgrade. PHP, the API datasource (via PDO flags) and the Perl DSN are all guarded with defined() checks. Fresh installs default to 1. Documents the full ZM_DB_* connection and SSL settings, including the hostname verification gotcha when connecting by IP, in docs/userguide/configfiles.rst. refs #3816
116 lines
4.0 KiB
Plaintext
116 lines
4.0 KiB
Plaintext
<?php
|
|
/**
|
|
*
|
|
*
|
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
*
|
|
* Licensed under The MIT License
|
|
* For full copyright and license information, please see the LICENSE.txt
|
|
* Redistributions of files must retain the above copyright notice.
|
|
*
|
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
* @link https://cakephp.org CakePHP(tm) Project
|
|
* @package app.Config
|
|
* @since CakePHP(tm) v 0.2.9
|
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
|
*/
|
|
|
|
/**
|
|
* Database configuration class.
|
|
*
|
|
* You can specify multiple configurations for production, development and testing.
|
|
*
|
|
* datasource => The name of a supported datasource; valid options are as follows:
|
|
* Database/Mysql - MySQL 4 & 5,
|
|
* Database/Sqlite - SQLite (PHP5 only),
|
|
* Database/Postgres - PostgreSQL 7 and higher,
|
|
* Database/Sqlserver - Microsoft SQL Server 2005 and higher
|
|
*
|
|
* You can add custom database datasources (or override existing datasources) by adding the
|
|
* appropriate file to app/Model/Datasource/Database. Datasources should be named 'MyDatasource.php',
|
|
*
|
|
*
|
|
* persistent => true / false
|
|
* Determines whether or not the database should use a persistent connection
|
|
*
|
|
* host =>
|
|
* the host you connect to the database. To add a socket or port number, use 'port' => #
|
|
*
|
|
* prefix =>
|
|
* Uses the given prefix for all the tables in this database. This setting can be overridden
|
|
* on a per-table basis with the Model::$tablePrefix property.
|
|
*
|
|
* schema =>
|
|
* For Postgres/Sqlserver specifies which schema you would like to use the tables in.
|
|
* Postgres defaults to 'public'. For Sqlserver, it defaults to empty and use
|
|
* the connected user's default schema (typically 'dbo').
|
|
*
|
|
* encoding =>
|
|
* For MySQL, Postgres specifies the character encoding to use when connecting to the
|
|
* database. Uses database default not specified.
|
|
*
|
|
* unix_socket =>
|
|
* For MySQL to connect via socket specify the `unix_socket` parameter instead of `host` and `port`
|
|
*
|
|
* settings =>
|
|
* Array of key/value pairs, on connection it executes SET statements for each pair
|
|
* For MySQL : http://dev.mysql.com/doc/refman/5.6/en/set-statement.html
|
|
* For Postgres : http://www.postgresql.org/docs/9.2/static/sql-set.html
|
|
* For Sql Server : http://msdn.microsoft.com/en-us/library/ms190356.aspx
|
|
*
|
|
* flags =>
|
|
* A key/value array of driver specific connection options.
|
|
*/
|
|
class DATABASE_CONFIG {
|
|
|
|
public $default = array(
|
|
'datasource' => 'Database/Mysql',
|
|
'persistent' => false,
|
|
'login' => ZM_DB_USER,
|
|
'password' => ZM_DB_PASS,
|
|
'database' => ZM_DB_NAME,
|
|
'ssl_ca' => ZM_DB_SSL_CA_CERT,
|
|
'ssl_key' => ZM_DB_SSL_CLIENT_KEY,
|
|
'ssl_cert' => ZM_DB_SSL_CLIENT_CERT,
|
|
'prefix' => '',
|
|
'encoding' => 'utf8',
|
|
);
|
|
|
|
public $test = array(
|
|
'datasource' => 'Database/Mysql',
|
|
'persistent' => false,
|
|
'host' => 'localhost',
|
|
'login' => 'user',
|
|
'password' => 'password',
|
|
'database' => 'test_database_name',
|
|
'prefix' => '',
|
|
//'encoding' => 'utf8',
|
|
);
|
|
|
|
public function __construct() {
|
|
if (strpos(ZM_DB_HOST, ':')):
|
|
$array = explode(':', ZM_DB_HOST, 2);
|
|
if (ctype_digit($array[1])):
|
|
$this->default['host'] = $array[0];
|
|
$this->default['port'] = $array[1];
|
|
else:
|
|
$this->default['unix_socket'] = $array[1];
|
|
endif;
|
|
else:
|
|
$this->default['host'] = ZM_DB_HOST;
|
|
endif;
|
|
|
|
// Identity-verify the server cert when ZM_DB_SSL_VERIFY_SERVER_CERT is
|
|
// set: truthy verifies, false-y (0/false/no/off) allows a self-signed or
|
|
// non-matching cert. Empty/unset leaves the default so existing installs
|
|
// are unchanged on upgrade. The Mysql datasource merges 'flags' into the
|
|
// PDO connection options. Refs #3816.
|
|
if (defined('ZM_DB_SSL_VERIFY_SERVER_CERT') and (ZM_DB_SSL_VERIFY_SERVER_CERT !== '')):
|
|
$this->default['flags'] = array(
|
|
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => !in_array(strtolower(ZM_DB_SSL_VERIFY_SERVER_CERT), array('0', 'false', 'no', 'off'))
|
|
);
|
|
endif;
|
|
}
|
|
}
|