1: <?php
2:
3: /**
4: * Environment objects
5: * @package framework
6: * @subpackage environment
7: */
8:
9: class Hm_Environment {
10:
11: private static $instance;
12:
13: public static function getInstance() {
14: if (self::$instance === null) {
15: self::$instance = new static();
16: }
17: return self::$instance;
18: }
19:
20: public function load($file = '.env') {
21: $this->set_required_environment_variables($file);
22:
23: $dotenvLoader = new \Symfony\Component\Dotenv\Dotenv();
24: if (method_exists($dotenvLoader, 'usePutenv')) {
25: $dotenvLoader->usePutenv(true);
26: }
27: $envFile = static::get('CYPHT_DOTENV');
28: if (!file_exists($envFile)) {
29: Hm_Msgs::add('.env file not found at: "' . $envFile . '"', 'danger');
30: return;
31: }
32: $dotenvLoader->load($envFile);
33: }
34:
35: public static function get($key, $default = null) {
36: $variables = self::getInstance()->get_environment_variables();
37: return $variables[$key] ?? $default;
38: }
39:
40: public function define_default_constants($config) {
41: define('DEFAULT_SEARCH_SINCE', $config->get('default_setting_search_since', '-1 week'));
42: define('DEFAULT_UNREAD_SINCE', $config->get('default_setting_unread_since', '-1 week'));
43: define('DEFAULT_UNREAD_PER_SOURCE', $config->get('default_setting_unread_per_source', 20));
44: define('DEFAULT_FLAGGED_SINCE', $config->get('default_setting_flagged_since', '-1 week'));
45: define('DEFAULT_FLAGGED_PER_SOURCE', $config->get('default_setting_flagged_per_source', 20));
46: define('DEFAULT_ALL_SINCE', $config->get('default_setting_all_since', '-1 week'));
47: define('DEFAULT_ALL_PER_SOURCE', $config->get('default_setting_all_per_source', 20));
48: define('DEFAULT_ALL_EMAIL_SINCE', $config->get('default_setting_all_email_since', '-1 week'));
49: define('DEFAULT_ALL_EMAIL_PER_SOURCE', $config->get('default_setting_all_email_per_source', 20));
50: define('DEFAULT_FEED_SINCE', $config->get('default_setting_feed_since', '-1 week'));
51: define('DEFAULT_FEED_LIMIT', $config->get('default_setting_feed_limit', 20));
52: define('DEFAULT_SENT_SINCE', $config->get('default_setting_sent_since', '-1 week'));
53: define('DEFAULT_SENT_PER_SOURCE', $config->get('default_setting_sent_per_source', 20));
54: define('DEFAULT_UNREAD_EXCLUDE_FEEDS', $config->get('default_setting_unread_exclude_feeds', false));
55: define('DEFAULT_LIST_STYLE', $config->get('default_setting_list_style', 'email_style'));
56: define('DEFAULT_IMAP_PER_PAGE', $config->get('default_setting_imap_per_page', 20));
57: define('DEFAULT_JUNK_SINCE', $config->get('default_setting_junk_since', '-1 week'));
58: define('DEFAULT_JUNK_PER_SOURCE', $config->get('default_setting_junk_per_source', 20));
59: define('DEFAULT_SNOOZED_SINCE', $config->get('default_setting_snoozed_since', '-1 week'));
60: define('DEFAULT_SNOOZED_PER_SOURCE', $config->get('default_setting_snoozed_per_source', 20));
61: define('DEFAULT_ENABLE_SNOOZE', $config->get('default_setting_enable_snooze', true));
62: define('DEFAULT_TAGS_SINCE', $config->get('default_setting_tags_since', '-1 week'));
63: define('DEFAULT_TAGS_PER_SOURCE', $config->get('default_setting_tags_per_source', 20));
64: define('DEFAULT_TRASH_SINCE', $config->get('default_setting_trash_since', '-1 week'));
65: define('DEFAULT_TRASH_PER_SOURCE', $config->get('default_setting_trash_per_source', 20));
66: define('DEFAULT_DRAFT_SINCE', $config->get('default_setting_draft_since', '-1 week'));
67: define('DEFAULT_DRAFT_PER_SOURCE', $config->get('default_setting_draft_per_source', 20));
68: define('DEFAULT_SIMPLE_MSG_PARTS', $config->get('default_setting_simple_msg_parts', false));
69: define('DEFAULT_MSG_PART_ICONS', $config->get('default_setting_msg_part_icons', true));
70: define('DEFAULT_PAGINATION_LINKS', $config->get('default_setting_pagination_links', true));
71: define('DEFAULT_REVIEW_SENT_EMAIL', $config->get('default_setting_review_sent_email', true));
72: define('DEFAULT_TEXT_ONLY', $config->get('default_setting_text_only', false));
73: define('DEFAULT_NO_PASSWORD_SAVE', $config->get('default_setting_no_password_save', false));
74: define('DEFAULT_SHOW_LIST_ICONS', $config->get('default_setting_show_list_icons', true));
75: define('DEFAULT_START_PAGE', $config->get('default_setting_start_page', "none"));
76: define('DEFAULT_DISABLE_DELETE_PROMPT', $config->get('default_setting_disable_delete_prompt', false));
77: define('DEFAULT_NO_FOLDER_ICONS', $config->get('default_setting_no_folder_icons', false));
78: define('DEFAULT_SETTING_LANGUAGE', $config->get('default_setting_language', 'en'));
79: define('DEFAULT_SMTP_COMPOSE_TYPE', $config->get('default_setting_smtp_compose_type', 0));
80: define('DEFAULT_SMTP_AUTO_BCC', $config->get('default_setting_smtp_auto_bcc', false));
81: define('DEFAULT_THEME', $config->get('default_setting_theme', 'default'));
82: define('DEFAULT_UNREAD_EXCLUDE_WORDPRESS', $config->get('default_setting_unread_exclude_wordpress', false));
83: define('DEFAULT_WORDPRESS_SINCE', $config->get('default_setting_wordpress_since', '-1 week'));
84: define('DEFAULT_UNREAD_EXCLUDE_GITHUB', $config->get('default_setting_unread_exclude_github', false));
85: define('DEFAULT_GITHUB_PER_SOURCE', $config->get('default_setting_github_limit', 20));
86: define('DEFAULT_GITHUB_SINCE', $config->get('default_setting_github_since', '-1 week'));
87: define('DEFAULT_INLINE_MESSAGE', $config->get('default_setting_inline_message', false));
88: define('DEFAULT_INLINE_MESSAGE_STYLE', $config->get('default_setting_inline_message_style', 'right'));
89: define('DEFAULT_ENABLE_KEYBOARD_SHORTCUTS', $config->get('default_setting_enable_keyboard_shortcuts', false));
90: define('DEFAULT_ENABLE_SIEVE_FILTER', $config->get('default_setting_enable_sieve_filter', false));
91: define('DEFAULT_DEBUG_LOG', $config->get('debug_log', false));
92: define('DEFAULT_ENABLE_COLLECT_ADDRESS_ON_SEND', $config->get('default_setting_enable_collect_address_on_send', false));
93: }
94:
95: /**
96: * Sets required environment variables that are used within .env files
97: */
98: private function set_required_environment_variables($file) {
99: $_ENV['CYPHT_DOTENV'] = APP_PATH . $file;
100: }
101:
102: /**
103: * Get a merge of environment variables $_ENV and $_SERVER.
104: *
105: * @return array
106: */
107: protected function get_environment_variables() {
108: return array_merge($_ENV, $_SERVER);
109: }
110: }
111:
112: if (!function_exists('env')) {
113: /**
114: * Gets the value of an environment variable.
115: *
116: * @param string $key
117: * @param mixed $default
118: * @return mixed
119: */
120: function env($key, $default = null) {
121: return getenv($key) ?: $default;
122: }
123: }
124:
125: if (!function_exists('merge_config_files')) {
126: /**
127: * Merge configuration arrays from PHP files in the specified folder.
128: *
129: * This function includes each PHP file in the specified folder and retrieves its array.
130: * It then merges these arrays into a single configuration array, applying boolean conversion
131: * for values that are represented as "true" or "false" strings.
132: *
133: * @param string $folder_path The path to the folder containing PHP configuration files.
134: *
135: * @return array The merged configuration array.
136: */
137: function merge_config_files($folder_path) {
138: $configArray = [];
139:
140: // Get all PHP files in the specified folder
141: $files = glob($folder_path . '/*.php');
142:
143: foreach ($files as $file) {
144: $fileArray = process_config_array($file);
145: $configArray = array_merge($configArray, $fileArray);
146: }
147: return $configArray;
148: }
149: }
150:
151: if (!function_exists('config')) {
152: /**
153: * Get configuration data for a single file
154: *
155: * @param string $file_name The path to PHP configuration file.
156: *
157: * @return array The configuration array.
158: */
159: function config($file_name) {
160: $path = CONFIG_PATH.$file_name.'.php';
161: return process_config_array($path);
162: }
163: }
164:
165: if (!function_exists('process_config_array')) {
166: function process_config_array($filename) {
167: $array = require $filename;
168: if (is_array($array)) {
169: return array_map(function ($value) {
170: return is_array($value) ? $value : (
171: is_string($value) && mb_strtolower($value) === 'true' ? true : (
172: is_string($value) && mb_strtolower($value) === 'false' ? false : $value
173: )
174: );
175: }, $array);
176: }
177: return [];
178: }
179: }
180: