mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-02-26 03:27:16 -05:00
There is now an object to manipulate user queries. It allows to move logic to handle those from the view and the controller in the model. Thus making the view and the controller easier to read. I introduced a new interface to start using dependency injection. There is still some rough edges but we are moving in the right direction. The new object is fully tested but it still need some improvements, for instance, it is still tied to the search object. There might be a better way to do that.
370 lines
9.5 KiB
PHP
370 lines
9.5 KiB
PHP
<?php
|
|
|
|
class FreshRSS_ConfigurationSetter {
|
|
/**
|
|
* Return if the given key is supported by this setter.
|
|
* @param $key the key to test.
|
|
* @return true if the key is supported, false else.
|
|
*/
|
|
public function support($key) {
|
|
$name_setter = '_' . $key;
|
|
return is_callable(array($this, $name_setter));
|
|
}
|
|
|
|
/**
|
|
* Set the given key in data with the current value.
|
|
* @param $data an array containing the list of all configuration data.
|
|
* @param $key the key to update.
|
|
* @param $value the value to set.
|
|
*/
|
|
public function handle(&$data, $key, $value) {
|
|
$name_setter = '_' . $key;
|
|
call_user_func_array(array($this, $name_setter), array(&$data, $value));
|
|
}
|
|
|
|
/**
|
|
* A helper to set boolean values.
|
|
*
|
|
* @param $value the tested value.
|
|
* @return true if value is true and different from no, false else.
|
|
*/
|
|
private function handleBool($value) {
|
|
return ((bool)$value) && $value !== 'no';
|
|
}
|
|
|
|
/**
|
|
* The (long) list of setters for user configuration.
|
|
*/
|
|
private function _apiPasswordHash(&$data, $value) {
|
|
$data['apiPasswordHash'] = ctype_graph($value) && (strlen($value) >= 60) ? $value : '';
|
|
}
|
|
|
|
private function _content_width(&$data, $value) {
|
|
$value = strtolower($value);
|
|
if (!in_array($value, array('thin', 'medium', 'large', 'no_limit'))) {
|
|
$value = 'thin';
|
|
}
|
|
|
|
$data['content_width'] = $value;
|
|
}
|
|
|
|
private function _default_state(&$data, $value) {
|
|
$data['default_state'] = (int)$value;
|
|
}
|
|
|
|
private function _default_view(&$data, $value) {
|
|
switch ($value) {
|
|
case 'all':
|
|
$data['default_view'] = $value;
|
|
$data['default_state'] = (FreshRSS_Entry::STATE_READ +
|
|
FreshRSS_Entry::STATE_NOT_READ);
|
|
break;
|
|
case 'adaptive':
|
|
case 'unread':
|
|
default:
|
|
$data['default_view'] = $value;
|
|
$data['default_state'] = FreshRSS_Entry::STATE_NOT_READ;
|
|
}
|
|
}
|
|
|
|
// It works for system config too!
|
|
private function _extensions_enabled(&$data, $value) {
|
|
if (!is_array($value)) {
|
|
$value = array($value);
|
|
}
|
|
$data['extensions_enabled'] = $value;
|
|
}
|
|
|
|
private function _html5_notif_timeout(&$data, $value) {
|
|
$value = intval($value);
|
|
$data['html5_notif_timeout'] = $value >= 0 ? $value : 0;
|
|
}
|
|
|
|
private function _keep_history_default(&$data, $value) {
|
|
$value = intval($value);
|
|
$data['keep_history_default'] = $value >= -1 ? $value : 0;
|
|
}
|
|
|
|
// It works for system config too!
|
|
private function _language(&$data, $value) {
|
|
$value = strtolower($value);
|
|
$languages = Minz_Translate::availableLanguages();
|
|
if (!in_array($value, $languages)) {
|
|
$value = 'en';
|
|
}
|
|
$data['language'] = $value;
|
|
}
|
|
|
|
private function _mail_login(&$data, $value) {
|
|
$value = filter_var($value, FILTER_VALIDATE_EMAIL);
|
|
$data['mail_login'] = $value ? $value : '';
|
|
}
|
|
|
|
private function _old_entries(&$data, $value) {
|
|
$value = intval($value);
|
|
$data['old_entries'] = $value > 0 ? $value : 3;
|
|
}
|
|
|
|
private function _passwordHash(&$data, $value) {
|
|
$data['passwordHash'] = ctype_graph($value) && (strlen($value) >= 60) ? $value : '';
|
|
}
|
|
|
|
private function _posts_per_page(&$data, $value) {
|
|
$value = intval($value);
|
|
$data['posts_per_page'] = $value > 0 ? $value : 10;
|
|
}
|
|
|
|
private function _queries(&$data, $values) {
|
|
$data['queries'] = array();
|
|
foreach ($values as $value) {
|
|
$data['queries'][] = $value->toArray();
|
|
}
|
|
}
|
|
|
|
private function _sharing(&$data, $values) {
|
|
$data['sharing'] = array();
|
|
foreach ($values as $value) {
|
|
if (!is_array($value)) {
|
|
continue;
|
|
}
|
|
|
|
// Verify URL and add default value when needed
|
|
if (isset($value['url'])) {
|
|
$is_url = (
|
|
filter_var($value['url'], FILTER_VALIDATE_URL) ||
|
|
(version_compare(PHP_VERSION, '5.3.3', '<') &&
|
|
(strpos($value, '-') > 0) &&
|
|
($value === filter_var($value, FILTER_SANITIZE_URL)))
|
|
); //PHP bug #51192
|
|
if (!$is_url) {
|
|
continue;
|
|
}
|
|
} else {
|
|
$value['url'] = null;
|
|
}
|
|
|
|
$data['sharing'][] = $value;
|
|
}
|
|
}
|
|
|
|
private function _shortcuts(&$data, $values) {
|
|
if (!is_array($values)) {
|
|
return;
|
|
}
|
|
|
|
$data['shortcuts'] = $values;
|
|
}
|
|
|
|
private function _sort_order(&$data, $value) {
|
|
$data['sort_order'] = $value === 'ASC' ? 'ASC' : 'DESC';
|
|
}
|
|
|
|
private function _ttl_default(&$data, $value) {
|
|
$value = intval($value);
|
|
$data['ttl_default'] = $value >= -1 ? $value : 3600;
|
|
}
|
|
|
|
private function _view_mode(&$data, $value) {
|
|
$value = strtolower($value);
|
|
if (!in_array($value, array('global', 'normal', 'reader'))) {
|
|
$value = 'normal';
|
|
}
|
|
$data['view_mode'] = $value;
|
|
}
|
|
|
|
/**
|
|
* A list of boolean setters.
|
|
*/
|
|
private function _anon_access(&$data, $value) {
|
|
$data['anon_access'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _auto_load_more(&$data, $value) {
|
|
$data['auto_load_more'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _auto_remove_article(&$data, $value) {
|
|
$data['auto_remove_article'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _display_categories(&$data, $value) {
|
|
$data['display_categories'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _display_posts(&$data, $value) {
|
|
$data['display_posts'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _hide_read_feeds(&$data, $value) {
|
|
$data['hide_read_feeds'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _lazyload(&$data, $value) {
|
|
$data['lazyload'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _mark_when(&$data, $values) {
|
|
foreach ($values as $key => $value) {
|
|
$data['mark_when'][$key] = $this->handleBool($value);
|
|
}
|
|
}
|
|
|
|
private function _onread_jump_next(&$data, $value) {
|
|
$data['onread_jump_next'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _reading_confirm(&$data, $value) {
|
|
$data['reading_confirm'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _sticky_post(&$data, $value) {
|
|
$data['sticky_post'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _bottomline_date(&$data, $value) {
|
|
$data['bottomline_date'] = $this->handleBool($value);
|
|
}
|
|
private function _bottomline_favorite(&$data, $value) {
|
|
$data['bottomline_favorite'] = $this->handleBool($value);
|
|
}
|
|
private function _bottomline_link(&$data, $value) {
|
|
$data['bottomline_link'] = $this->handleBool($value);
|
|
}
|
|
private function _bottomline_read(&$data, $value) {
|
|
$data['bottomline_read'] = $this->handleBool($value);
|
|
}
|
|
private function _bottomline_sharing(&$data, $value) {
|
|
$data['bottomline_sharing'] = $this->handleBool($value);
|
|
}
|
|
private function _bottomline_tags(&$data, $value) {
|
|
$data['bottomline_tags'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _topline_date(&$data, $value) {
|
|
$data['topline_date'] = $this->handleBool($value);
|
|
}
|
|
private function _topline_favorite(&$data, $value) {
|
|
$data['topline_favorite'] = $this->handleBool($value);
|
|
}
|
|
private function _topline_link(&$data, $value) {
|
|
$data['topline_link'] = $this->handleBool($value);
|
|
}
|
|
private function _topline_read(&$data, $value) {
|
|
$data['topline_read'] = $this->handleBool($value);
|
|
}
|
|
|
|
/**
|
|
* The (not so long) list of setters for system configuration.
|
|
*/
|
|
private function _allow_anonymous(&$data, $value) {
|
|
$data['allow_anonymous'] = $this->handleBool($value) && FreshRSS_Auth::accessNeedsAction();
|
|
}
|
|
|
|
private function _allow_anonymous_refresh(&$data, $value) {
|
|
$data['allow_anonymous_refresh'] = $this->handleBool($value) && $data['allow_anonymous'];
|
|
}
|
|
|
|
private function _api_enabled(&$data, $value) {
|
|
$data['api_enabled'] = $this->handleBool($value);
|
|
}
|
|
|
|
private function _auth_type(&$data, $value) {
|
|
$value = strtolower($value);
|
|
if (!in_array($value, array('form', 'http_auth', 'persona', 'none'))) {
|
|
$value = 'none';
|
|
}
|
|
$data['auth_type'] = $value;
|
|
$this->_allow_anonymous($data, $data['allow_anonymous']);
|
|
}
|
|
|
|
private function _db(&$data, $value) {
|
|
if (!isset($value['type'])) {
|
|
return;
|
|
}
|
|
|
|
switch ($value['type']) {
|
|
case 'mysql':
|
|
if (empty($value['host']) ||
|
|
empty($value['user']) ||
|
|
empty($value['base']) ||
|
|
!isset($value['password'])) {
|
|
return;
|
|
}
|
|
|
|
$data['db']['type'] = $value['type'];
|
|
$data['db']['host'] = $value['host'];
|
|
$data['db']['user'] = $value['user'];
|
|
$data['db']['base'] = $value['base'];
|
|
$data['db']['password'] = $value['password'];
|
|
$data['db']['prefix'] = isset($value['prefix']) ? $value['prefix'] : '';
|
|
break;
|
|
case 'sqlite':
|
|
$data['db']['type'] = $value['type'];
|
|
$data['db']['host'] = '';
|
|
$data['db']['user'] = '';
|
|
$data['db']['base'] = '';
|
|
$data['db']['password'] = '';
|
|
$data['db']['prefix'] = '';
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
private function _default_user(&$data, $value) {
|
|
$user_list = listUsers();
|
|
if (in_array($value, $user_list)) {
|
|
$data['default_user'] = $value;
|
|
}
|
|
}
|
|
|
|
private function _environment(&$data, $value) {
|
|
$value = strtolower($value);
|
|
if (!in_array($value, array('silent', 'development', 'production'))) {
|
|
$value = 'production';
|
|
}
|
|
$data['environment'] = $value;
|
|
}
|
|
|
|
private function _limits(&$data, $values) {
|
|
$max_small_int = 16384;
|
|
$limits_keys = array(
|
|
'cache_duration' => array(
|
|
'min' => 0,
|
|
),
|
|
'timeout' => array(
|
|
'min' => 0,
|
|
),
|
|
'max_inactivity' => array(
|
|
'min' => 0,
|
|
),
|
|
'max_feeds' => array(
|
|
'min' => 0,
|
|
'max' => $max_small_int,
|
|
),
|
|
'max_categories' => array(
|
|
'min' => 0,
|
|
'max' => $max_small_int,
|
|
),
|
|
);
|
|
|
|
foreach ($values as $key => $value) {
|
|
if (!isset($limits_keys[$key])) {
|
|
continue;
|
|
}
|
|
|
|
$limits = $limits_keys[$key];
|
|
if (
|
|
(!isset($limits['min']) || $value > $limits['min']) &&
|
|
(!isset($limits['max']) || $value < $limits['max'])
|
|
) {
|
|
$data['limits'][$key] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
private function _unsafe_autologin_enabled(&$data, $value) {
|
|
$data['unsafe_autologin_enabled'] = $this->handleBool($value);
|
|
}
|
|
}
|