| 
<?php/**
 * This file is a part of the CIDRAM package.
 * Homepage: https://cidram.github.io/
 *
 * CIDRAM COPYRIGHT 2016 and beyond by Caleb Mazalevskis (Maikuolan).
 *
 * License: GNU/GPLv2
 * @see LICENSE.txt
 *
 * This file: Configuration handler (last modified: 2019.08.31).
 */
 
 /** Prevents execution from outside of CIDRAM. */
 if (!defined('CIDRAM')) {
 die('[CIDRAM] This should not be accessed directly.');
 }
 
 /** CIDRAM version number (SemVer). */
 $CIDRAM['ScriptVersion'] = '2.1.0';
 
 /** CIDRAM version identifier (complete notation). */
 $CIDRAM['ScriptIdent'] = 'CIDRAM v' . $CIDRAM['ScriptVersion'];
 
 /** CIDRAM User Agent (for external requests). */
 $CIDRAM['ScriptUA'] = $CIDRAM['ScriptIdent'] . ' (https://cidram.github.io/)';
 
 /** Default timeout (for external requests). */
 $CIDRAM['Timeout'] = 12;
 
 /** Determine PHP path. */
 $CIDRAM['CIDRAM_PHP'] = defined('PHP_BINARY') ? PHP_BINARY : '';
 
 /** Fetch domain segment of HTTP_HOST (needed for writing cookies safely). */
 $CIDRAM['HTTP_HOST'] = empty($_SERVER['HTTP_HOST']) ? '' : (
 strpos($_SERVER['HTTP_HOST'], ':') === false ? $_SERVER['HTTP_HOST'] : substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], ':'))
 );
 
 /** CIDRAM favicon. */
 $CIDRAM['favicon'] =
 'R0lGODlhEAAQAMIBAAAAAGYAAJkAAMz//2YAAGYAAGYAAGYAACH5BAEKAAQALAAAAAAQABA' .
 'AAANBCLrcKjBK+eKQN76RIb+g0oGewAmiZZbZRppnC0y0BgR4rutK8OWfn2jgI3KKxeHvyB' .
 'wMkc0kIEp13nZYnGPLSAAAOw==';
 
 /** Checks whether the CIDRAM configuration file is readable. */
 if (!isset($GLOBALS['CIDRAM_Config']) && !is_readable($CIDRAM['Vault'] . 'config.ini')) {
 header('Content-Type: text/plain');
 die('[CIDRAM] Can\'t read the configuration file! Please reconfigure CIDRAM.');
 }
 
 /** Checks whether the CIDRAM configuration defaults file is readable. */
 if (!is_readable($CIDRAM['Vault'] . 'config.yaml')) {
 header('Content-Type: text/plain');
 die('[CIDRAM] Can\'t read the configuration defaults file! Please reconfigure CIDRAM.');
 }
 
 if (isset($GLOBALS['CIDRAM_Config'])) {
 /** Provides a means of running tests with configuration values specific to those tests. */
 $CIDRAM['Config'] = $GLOBALS['CIDRAM_Config'];
 } else {
 /** Attempts to parse the standard CIDRAM configuration file. */
 $CIDRAM['Config'] = parse_ini_file($CIDRAM['Vault'] . 'config.ini', true);
 }
 
 /** Kills the script if it isn't able to load any configuration. */
 if ($CIDRAM['Config'] === false) {
 header('Content-Type: text/plain');
 die('[CIDRAM] Configuration file is corrupt! Please reconfigure CIDRAM.');
 }
 
 /** Checks for the existence of the HTTP_HOST "configuration overrides file". */
 if (
 !empty($_SERVER['HTTP_HOST']) &&
 ($CIDRAM['Domain'] = preg_replace('/^www\./', '', strtolower($_SERVER['HTTP_HOST']))) &&
 !preg_match('/[^.\da-z-]/', $CIDRAM['Domain']) &&
 is_readable($CIDRAM['Vault'] . $CIDRAM['Domain'] . '.config.ini')
 ) {
 /** Attempts to parse the overrides file found (this is configuration specific to the requested domain). */
 if ($CIDRAM['Overrides'] = parse_ini_file($CIDRAM['Vault'] . $CIDRAM['Domain'] . '.config.ini', true)) {
 array_walk($CIDRAM['Overrides'], function ($Keys, $Category) use (&$CIDRAM) {
 foreach ($Keys as $Directive => $Value) {
 $CIDRAM['Config'][$Category][$Directive] = $Value;
 }
 });
 $CIDRAM['Overrides'] = true;
 }
 }
 
 /** Kills the script if parsing the configuration overrides file fails. */
 if (isset($CIDRAM['Overrides']) && $CIDRAM['Overrides'] === false) {
 header('Content-Type: text/plain');
 die('[CIDRAM] Configuration overrides file is corrupt! Can\'t continue until this is resolved.');
 }
 
 /** Attempts to parse the CIDRAM configuration defaults file. */
 $CIDRAM['YAML']->process($CIDRAM['ReadFile']($CIDRAM['Vault'] . 'config.yaml'), $CIDRAM['Config']);
 
 /** Kills the script if parsing the configuration defaults file fails. */
 if (empty($CIDRAM['Config']['Config Defaults'])) {
 header('Content-Type: text/plain');
 die('[CIDRAM] Configuration defaults file is corrupt! Please reinstall CIDRAM.');
 }
 
 /** Check for supplementary configuration relating to IPv4 signature files. */
 if (!empty($CIDRAM['Config']['signatures']['ipv4'])) {
 foreach ($CIDRAM['Supplementary']($CIDRAM['Config']['signatures']['ipv4']) as $CIDRAM['Supplement']) {
 $CIDRAM['YAML']->process($CIDRAM['ReadFile']($CIDRAM['Vault'] . $CIDRAM['Supplement']), $CIDRAM['Config']);
 }
 }
 
 /** Check for supplementary configuration relating to IPv6 signature files. */
 if (!empty($CIDRAM['Config']['signatures']['ipv6'])) {
 foreach ($CIDRAM['Supplementary']($CIDRAM['Config']['signatures']['ipv6']) as $CIDRAM['Supplement']) {
 $CIDRAM['YAML']->process($CIDRAM['ReadFile']($CIDRAM['Vault'] . $CIDRAM['Supplement']), $CIDRAM['Config']);
 }
 }
 
 /** Check for supplementary configuration relating to modules. */
 if (!empty($CIDRAM['Config']['signatures']['modules'])) {
 foreach ($CIDRAM['Supplementary']($CIDRAM['Config']['signatures']['modules']) as $CIDRAM['Supplement']) {
 $CIDRAM['YAML']->process($CIDRAM['ReadFile']($CIDRAM['Vault'] . $CIDRAM['Supplement']), $CIDRAM['Config']);
 }
 }
 
 /** Cleanup. */
 unset($CIDRAM['Supplement']);
 
 /** Perform fallbacks and autotyping for missing configuration directives. */
 $CIDRAM['Fallback']($CIDRAM['Config']['Config Defaults'], $CIDRAM['Config']);
 
 /** Failsafe for weird ipaddr configuration. */
 $CIDRAM['IPAddr'] = (
 $CIDRAM['Config']['general']['ipaddr'] !== 'REMOTE_ADDR' && empty($_SERVER[$CIDRAM['Config']['general']['ipaddr']])
 ) ? 'REMOTE_ADDR' : $CIDRAM['Config']['general']['ipaddr'];
 
 /** Ensure we have an IP address variable to work with. */
 if (!isset($_SERVER[$CIDRAM['IPAddr']])) {
 $_SERVER[$CIDRAM['IPAddr']] = '';
 }
 
 /** Adjusted present time. */
 $CIDRAM['Now'] = time() + ($CIDRAM['Config']['general']['time_offset'] * 60);
 
 /** Set timezone. */
 if (!empty($CIDRAM['Config']['general']['timezone']) && $CIDRAM['Config']['general']['timezone'] !== 'SYSTEM') {
 date_default_timezone_set($CIDRAM['Config']['general']['timezone']);
 }
 
 /**
 * Process the request query and query variables (if any exist); These may be
 * occasionally used by certain extended rulesets.
 */
 if (!empty($_SERVER['QUERY_STRING'])) {
 $CIDRAM['Query'] = $_SERVER['QUERY_STRING'];
 parse_str($_SERVER['QUERY_STRING'], $CIDRAM['QueryVars']);
 } else {
 $CIDRAM['Query'] = '';
 $CIDRAM['QueryVars'] = [];
 }
 
 /** Set default hashing algorithm. */
 $CIDRAM['DefaultAlgo'] = (
 !empty($CIDRAM['Config']['general']['default_algo']) && defined($CIDRAM['Config']['general']['default_algo'])
 ) ? constant($CIDRAM['Config']['general']['default_algo']) : 1;
 
 /** Revert script ident if "hide_version" is true. */
 if (!empty($CIDRAM['Config']['general']['hide_version'])) {
 $CIDRAM['ScriptIdent'] = 'CIDRAM';
 }
 
 |