|
|
@@ -12,9 +12,14 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
* This action is called before every other action in that class. It is
|
|
|
* the common boiler plate for every action. It is triggered by the
|
|
|
* underlying framework.
|
|
|
+ *
|
|
|
+ * @todo clean up the access condition.
|
|
|
*/
|
|
|
public function firstAction() {
|
|
|
- if (!FreshRSS_Auth::hasAccess()) {
|
|
|
+ if (!FreshRSS_Auth::hasAccess() && !(
|
|
|
+ Minz_Request::actionName() === 'create' &&
|
|
|
+ !max_registrations_reached()
|
|
|
+ )) {
|
|
|
Minz_Error::error(403);
|
|
|
}
|
|
|
}
|
|
|
@@ -25,13 +30,17 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
public function profileAction() {
|
|
|
Minz_View::prependTitle(_t('conf.profile.title') . ' · ');
|
|
|
|
|
|
+ Minz_View::appendScript(Minz_Url::display(
|
|
|
+ '/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js')
|
|
|
+ ));
|
|
|
+
|
|
|
if (Minz_Request::isPost()) {
|
|
|
$ok = true;
|
|
|
|
|
|
- $passwordPlain = Minz_Request::param('passwordPlain', '', true);
|
|
|
+ $passwordPlain = Minz_Request::param('newPasswordPlain', '', true);
|
|
|
if ($passwordPlain != '') {
|
|
|
- Minz_Request::_param('passwordPlain'); //Discard plain-text password ASAP
|
|
|
- $_POST['passwordPlain'] = '';
|
|
|
+ Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP
|
|
|
+ $_POST['newPasswordPlain'] = '';
|
|
|
if (!function_exists('password_hash')) {
|
|
|
include_once(LIB_PATH . '/password_compat.php');
|
|
|
}
|
|
|
@@ -103,8 +112,24 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
$this->view->size_user = $entryDAO->size();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * This action creates a new user.
|
|
|
+ *
|
|
|
+ * Request parameters are:
|
|
|
+ * - new_user_language
|
|
|
+ * - new_user_name
|
|
|
+ * - new_user_passwordPlain
|
|
|
+ * - new_user_email
|
|
|
+ * - r (i.e. a redirection url, optional)
|
|
|
+ *
|
|
|
+ * @todo clean up this method. Idea: write a method to init a user with basic information.
|
|
|
+ * @todo handle r redirection in Minz_Request::forward directly?
|
|
|
+ */
|
|
|
public function createAction() {
|
|
|
- if (Minz_Request::isPost() && FreshRSS_Auth::hasAccess('admin')) {
|
|
|
+ if (Minz_Request::isPost() && (
|
|
|
+ FreshRSS_Auth::hasAccess('admin') ||
|
|
|
+ !max_registrations_reached()
|
|
|
+ )) {
|
|
|
$db = FreshRSS_Context::$system_conf->db;
|
|
|
require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
|
|
|
|
|
|
@@ -175,15 +200,37 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
Minz_Session::_param('notification', $notif);
|
|
|
}
|
|
|
|
|
|
- Minz_Request::forward(array('c' => 'user', 'a' => 'manage'), true);
|
|
|
+ $redirect_url = urldecode(Minz_Request::param('r', false, true));
|
|
|
+ if (!$redirect_url) {
|
|
|
+ $redirect_url = array('c' => 'user', 'a' => 'manage');
|
|
|
+ }
|
|
|
+ Minz_Request::forward($redirect_url, true);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * This action delete an existing user.
|
|
|
+ *
|
|
|
+ * Request parameter is:
|
|
|
+ * - username
|
|
|
+ *
|
|
|
+ * @todo clean up this method. Idea: create a User->clean() method.
|
|
|
+ */
|
|
|
public function deleteAction() {
|
|
|
- if (Minz_Request::isPost() && FreshRSS_Auth::hasAccess('admin')) {
|
|
|
+ $username = Minz_Request::param('username');
|
|
|
+ $redirect_url = urldecode(Minz_Request::param('r', false, true));
|
|
|
+ if (!$redirect_url) {
|
|
|
+ $redirect_url = array('c' => 'user', 'a' => 'manage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $self_deletion = Minz_Session::param('currentUser', '_') === $username;
|
|
|
+
|
|
|
+ if (Minz_Request::isPost() && (
|
|
|
+ FreshRSS_Auth::hasAccess('admin') ||
|
|
|
+ $self_deletion
|
|
|
+ )) {
|
|
|
$db = FreshRSS_Context::$system_conf->db;
|
|
|
require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
|
|
|
|
|
|
- $username = Minz_Request::param('username');
|
|
|
$ok = ctype_alnum($username);
|
|
|
$user_data = join_path(DATA_PATH, 'users', $username);
|
|
|
|
|
|
@@ -191,6 +238,16 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
$default_user = FreshRSS_Context::$system_conf->default_user;
|
|
|
$ok &= (strcasecmp($username, $default_user) !== 0); //It is forbidden to delete the default user
|
|
|
}
|
|
|
+ if ($ok && $self_deletion) {
|
|
|
+ // We check the password if it's a self-destruction
|
|
|
+ $nonce = Minz_Session::param('nonce');
|
|
|
+ $challenge = Minz_Request::param('challenge', '');
|
|
|
+
|
|
|
+ $ok &= FreshRSS_FormAuth::checkCredentials(
|
|
|
+ $username, FreshRSS_Context::$user_conf->passwordHash,
|
|
|
+ $nonce, $challenge
|
|
|
+ );
|
|
|
+ }
|
|
|
if ($ok) {
|
|
|
$ok &= is_dir($user_data);
|
|
|
}
|
|
|
@@ -200,6 +257,10 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
$ok &= recursive_unlink($user_data);
|
|
|
//TODO: delete Persona file
|
|
|
}
|
|
|
+ if ($ok && $self_deletion) {
|
|
|
+ FreshRSS_Auth::removeAccess();
|
|
|
+ $redirect_url = array('c' => 'index', 'a' => 'index');
|
|
|
+ }
|
|
|
invalidateHttpCache();
|
|
|
|
|
|
$notif = array(
|
|
|
@@ -209,6 +270,30 @@ class FreshRSS_user_Controller extends Minz_ActionController {
|
|
|
Minz_Session::_param('notification', $notif);
|
|
|
}
|
|
|
|
|
|
+ Minz_Request::forward($redirect_url, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * This action updates the max number of registrations.
|
|
|
+ *
|
|
|
+ * Request parameter is:
|
|
|
+ * - max-registrations (int >= 0)
|
|
|
+ */
|
|
|
+ public function setRegistrationAction() {
|
|
|
+ if (Minz_Request::isPost() && FreshRSS_Auth::hasAccess('admin')) {
|
|
|
+ $limits = FreshRSS_Context::$system_conf->limits;
|
|
|
+ $limits['max_registrations'] = Minz_Request::param('max-registrations', 1);
|
|
|
+ FreshRSS_Context::$system_conf->limits = $limits;
|
|
|
+ FreshRSS_Context::$system_conf->save();
|
|
|
+
|
|
|
+ invalidateHttpCache();
|
|
|
+
|
|
|
+ Minz_Session::_param('notification', array(
|
|
|
+ 'type' => 'good',
|
|
|
+ 'content' => _t('feedback.user.set_registration')
|
|
|
+ ));
|
|
|
+ }
|
|
|
+
|
|
|
Minz_Request::forward(array('c' => 'user', 'a' => 'manage'), true);
|
|
|
}
|
|
|
}
|