File: SpotSettings.php

package info (click to toggle)
spotweb 20130826%2Bdfsg2-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 5,132 kB
  • ctags: 11,281
  • sloc: php: 31,367; xml: 1,009; sh: 148; makefile: 83
file content (253 lines) | stat: -rwxr-xr-x 9,687 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
<?php
define('SPOTWEB_SETTINGS_VERSION', '0.25');
define('SPOTWEB_VERSION', '0.' . (SPOTDB_SCHEMA_VERSION * 100) . '.' . (SPOTWEB_SETTINGS_VERSION * 100) . '.' . (SPOTWEB_SECURITY_VERSION * 100));
/*
 * Classe om de server settings in op te slaan
 */
class SpotSettings {
	private static $_instance = null;
	
	private $_db;
	/* Gemergede array met alle settings */
	private static $_settings;
	/* Settings die uit PHP komen */
	private static $_phpSettings;
	/* Settings die uit de database komen */
	private static $_dbSettings;
	
	/* 
	 * Instantieert een nieuwe settings klasse
	 */
	public static function singleton(SpotDb $db, array $phpSettings) {
		if (self::$_instance === null) {
			self::$_instance = new SpotSettings($db);
			
			# maak de array met PHP settings beschikbaar in de klasse
			self::$_phpSettings = $phpSettings;
			
			# haal alle settings op, en prepareer die 
			self::$_dbSettings = $db->getAllSettings();

			# en merge de settings met degene die we door krijgen 
			self::$_settings = array_merge(self::$_dbSettings, self::$_phpSettings);

			# Override NNTP header/comments settings, als er geen aparte NNTP header/comments server is opgegeven, gebruik die van 
			# de NZB server
			if ((empty(self::$_settings['nntp_hdr']['host'])) && (!empty(self::$_settings['nntp_nzb']))) {
				self::$_settings['nntp_hdr'] = self::$_settings['nntp_nzb'];
			} # if

			# Hetzelfde voor de NNTP upload server
			if ((empty(self::$_settings['nntp_post']['host'])) && (!empty(self::$_settings['nntp_nzb']))) {
				self::$_settings['nntp_post'] = self::$_settings['nntp_nzb'];
			} # if
		} # if
		
		return self::$_instance;
	} # singleton

	/*
	 * Geeft de waarde van de setting terug
	 */
	function get($name) {
		return self::$_settings[$name];
	} # get

	/*
	 * Unset een bepaalde waarde
	 */
	function remove($name) {
		unset(self::$_settings[$name]);
		
		$this->_db->removeSetting($name);
	} # remove
	
	/*
	 * Geeft terug of een bepaalde setting uit de database
	 * komt of uit de settings.php file. De settings-file
	 * heeft altijd prioriteit 
	 */
	function getOrigin($name) {
		if (isset(self::$_phpSettings[$name])) {
			return "php";
		} else {
			return "db";
		} # if
	} # getOrigin

	/*
	 * Set de waarde van de setting, maakt hem ook
	 * meteen persistent dus mee oppassen
	 */
	function set($name, $value) {
		# Als de setting uit PHP komt, dan mag die niet geupdate worden
		# hier omdat we dan niet meer weten wat er gebeurt.
		if (isset(self::$_phpSettings[$name])) {
			throw new InvalidSettingsUpdateException("InvalidSettingUpdat Exception for '" . $name . '"');
		} # if
		
		# Update onze eigen settings array zodat we meteen up-to-date zijn
		self::$_settings[$name] = $value;
		
		$this->_db->updateSetting($name, $value);
	} # set
	
	/*
	 * Validate settings
	 */
	function validateSettings($settings) {
		$errorList = array();

		# Define arrays with valid settings
		$validNntpEnc = array(false, 'ssl', 'tls');
		$validModerationAction = array('disable', 'act', 'markspot');
		$validRetentionTypes = array('fullonly', 'everything');

		# Get the given value for NNTP encryption
		$settings['nntp_nzb']['enc'] = (isset($settings['nntp_nzb']['enc']['switch'])) ? $settings['nntp_nzb']['enc']['select'] : false;
		$settings['nntp_hdr']['enc'] = (isset($settings['nntp_hdr']['enc']['switch'])) ? $settings['nntp_hdr']['enc']['select'] : false;
		$settings['nntp_post']['enc'] = (isset($settings['nntp_post']['enc']['switch'])) ? $settings['nntp_post']['enc']['select'] : false;

		# Trim human-entered text fields
		$settings['nntp_nzb']['host'] = trim($settings['nntp_nzb']['host']);
		$settings['nntp_hdr']['host'] = trim($settings['nntp_hdr']['host']);
		$settings['nntp_post']['host'] = trim($settings['nntp_post']['host']);

		# Verify settings with the previous declared arrays
		if (in_array($settings['nntp_nzb']['enc'], $validNntpEnc) === false || in_array($settings['nntp_hdr']['enc'], $validNntpEnc) === false || in_array($settings['nntp_post']['enc'], $validNntpEnc) === false) {
			$errorList[] = _('Invalid encryption setting');
		} # if
		if (in_array($settings['spot_moderation'], $validModerationAction) === false) {
			$errorList[] = _('Invalid spot moderation setting');
		} # if
		if (in_array($settings['retentiontype'], $validRetentionTypes) === false) {
			$errorList[] = _('Invalid spot retentiontype setting');
		} # if

		# Verify settings
		$settings['cookie_expires'] = (int) $settings['cookie_expires'];
		if ($settings['cookie_expires'] < 0) {
			$errorList[] = _('Invalid cookie_expires setting');
		} # if

		$settings['retention'] = (int) $settings['retention'];
		if ($settings['retention'] < 0) {
			$errorList[] = _('Invalid retention setting');
		} # if

		if (($settings['retrieve_newer_than'] = strtotime($settings['retrieve_newer_than'])) === false || $settings['retrieve_newer_than'] > time()) {
			$errorList[] = _('Invalid retrieve_newer_than setting');
		} elseif ($settings['retrieve_newer_than'] < 1230789600) {
			$settings['retrieve_newer_than'] = 1230789600;
		} # elseif

		$settings['retrieve_increment'] = (int) $settings['retrieve_increment'];
		if ($settings['retrieve_increment'] < 1) {
			$errorList[] = _('Invalid retrieve_increment setting');
		} # if

		# check the mailaddress
		if (!filter_var($settings['systemfrommail'], FILTER_VALIDATE_EMAIL)) {
			$errorList[] = _('Not a valid email address');
		} # if

		# We don't want to save megabyts of CSS, so put a limit to the size
		if (strlen($settings['customcss'] > 1024 * 10)) { 
			$errorList[] = _('Custom CSS is too large');
		} # if		

		# converteer overige settings naar boolean zodat we gewoon al weten wat er uitkomt
		$settings['deny_robots'] = (isset($settings['deny_robots'])) ? true : false;
		$settings['sendwelcomemail'] = (isset($settings['sendwelcomemail'])) ? true : false;
		$settings['nntp_nzb']['buggy'] = (isset($settings['nntp_nzb']['buggy'])) ? true : false;
		$settings['nntp_hdr']['buggy'] = (isset($settings['nntp_hdr']['buggy'])) ? true : false;
		$settings['nntp_post']['buggy'] = (isset($settings['nntp_post']['buggy'])) ? true : false;
		$settings['retrieve_full'] = (isset($settings['retrieve_full'])) ? true : false;
		$settings['prefetch_image'] = (isset($settings['prefetch_image'])) ? true : false;
		$settings['prefetch_nzb'] = (isset($settings['prefetch_nzb'])) ? true : false;
		$settings['retrieve_comments'] = (isset($settings['retrieve_comments'])) ? true : false;
		$settings['retrieve_full_comments'] = (isset($settings['retrieve_full_comments'])) ? true : false;
		$settings['retrieve_reports'] = (isset($settings['retrieve_reports'])) ? true : false;
		$settings['enable_timing'] = (isset($settings['enable_timing'])) ? true : false;
		$settings['enable_stacktrace'] = (isset($settings['enable_stacktrace'])) ? true : false;
		$settings['prepare_statistics'] = (isset($settings['prepare_statistics'])) ? true : false;
		$settings['external_blacklist'] = (isset($settings['external_blacklist'])) ? true : false;
		$settings['external_whitelist'] = (isset($settings['external_whitelist'])) ? true : false;

		# Default server settings if they won't be used
		if (!isset($settings['nntp_hdr']['use'])) { 
			$settings['nntp_hdr'] = array('host' => '', 
										  'user' => '', 
										  'pass' => '', 
										  'enc' => false, 
										  'port' => 119, 
										  'buggy' => false); 
		} # if
										
		if (!isset($settings['nntp_post']['use'])) { 
			$settings['nntp_post'] = array('host' => '', 
										   'user' => '', 
										   'pass' => '', 
										   'enc' => false, 
										   'port' => 119, 
										   'buggy' => false); 
		} # if

		unset($settings['nntp_hdr']['use'], $settings['nntp_post']['use']);

		return array($errorList, $settings);
	} # validateSettings

	function setSettings($settings) {
		# If we disable the external blacklist, clear all entries
		if ($settings['external_blacklist'] == false && $this->get('external_blacklist') == true) {
			$this->_db->removeOldList($this->get('blacklist_url'), SpotDb::spotterlist_Black);
		} # if

		# If we disable the external whitelist, clear all entries
		if ($settings['external_whitelist'] == false && $this->get('external_whitelist') == true) {
			$this->_db->removeOldList($this->get('whitelist_url'), SpotDb::spotterlist_White);
		} # if

		# clear some stuff we don't need to store
		unset($settings['xsrfid'], $settings['http_referer'], $settings['buttonpressed'], $settings['action'], $settings['submitedit']);

		# Store settings
		foreach ($settings as $key => $value) {
			# and write these updated settings to the database
			$this->set($key, $value);
		} # foreach
	} # setSettings

	/* 
	 * Is onze database versie nog wel geldig?
	 */
	function schemaValid() {
		# SPOTDB_SCHEMA_VERSION is gedefinieerd bovenin SpotDb
		return ($this->get('schemaversion') == SPOTDB_SCHEMA_VERSION);
	} # schemaValid
	
	
	/* 
	 * Zijn onze settings versie nog wel geldig?
	 */
	function settingsValid() {
		# SPOTWEB_SETTINGS_VERSION is gedefinieerd bovenin dit bestand
		return ($this->get('settingsversion') == SPOTWEB_SETTINGS_VERSION);
	} # settingsValid

	/* 
	 * Bestaat de opgegeven setting ?
	 */
	function exists($name) {
		return isset(self::$_settings[$name]);
	} # isSet

	/*
	 * Private constructor, moet altijd via singleton gaan
	 */
	private function __construct($db) {
		$this->_db = $db;
	} # ctor

} # class SpotSettings