summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2011-10-04 22:19:45 -0400
committerLuke Shumaker <LukeShu@sbcglobal.net>2011-10-04 22:19:45 -0400
commitf72b9a7658cea71ee1edf4ae678a2c8043d9e5bf (patch)
treead815ede91026d8ed0df23785d4ff3b6170b3de4
parent2f1d74bdd48e3beaf6b52cad126de0271875e7ac (diff)
Begin work on safely allowing concurrent edits on data, giving better form interface.
-rw-r--r--src/controllers/Config.class.php30
-rw-r--r--src/controllers/Users.class.php71
-rw-r--r--src/lib/Form.class.php57
3 files changed, 113 insertions, 45 deletions
diff --git a/src/controllers/Config.class.php b/src/controllers/Config.class.php
new file mode 100644
index 0000000..37d1f09
--- /dev/null
+++ b/src/controllers/Config.class.php
@@ -0,0 +1,30 @@
+<?php
+require_once('Auth.class.php');
+
+Router::register('config', 'Config', 'index');
+
+class Config extends Controller {
+ public function index($routed, $remainder) {
+ $uid = Login::isLoggedIn();
+ if ($uid===false || !Auth::getObj($uid)->isAdmin()) {
+ $this->http401($routed, $remainder);
+ return;
+ }
+
+ $method = $_SERVER['REQUEST_METHOD'];
+ switch ($method) {
+ case 'PUT': $_POST = $_PUT;
+ case 'POST':
+ // We're PUTing an updated configuration.
+ $this->update();
+ break;
+ }
+ $this->show_index();
+ }
+ private function show_index() {
+
+ }
+ private function update() {
+
+ }
+}
diff --git a/src/controllers/Users.class.php b/src/controllers/Users.class.php
index a5d23fc..b8c9244 100644
--- a/src/controllers/Users.class.php
+++ b/src/controllers/Users.class.php
@@ -251,50 +251,31 @@ class Users extends Controller {
*/
private function update_users() {
$attribs = $this->getIndexAttribs();
+ $form = new Form(null, null);
foreach ($attribs as $attrib) {
$key = $attrib['key'];
if (isset($_POST[$key]) && is_array($_POST[$key])) {
$old = $_POST['_old'][$key];
foreach ($_POST[$key] as $uid => $value) {
- $doit = true;
- $forked = false;
- $have_old = isset($old[$uid]);
- if ($have_old) {
- @$value_base = $old[$uid];
- $we_changed_it = $value_base != $value;
- if ($we_changed_it) {
- $user = Auth::getObj($uid);
- $value_fork = $this->getConf($user,$key);
- $value_fork = $value_fork['value'];
- if ($value_fork===false) $value_fork = 'false';
- if ($value_fork===true) $value_fork = 'true';
-
- $someone_else_changed_it = $value_fork != $value_base;
- if ($someone_else_changed_it) {
- if ($value == $value_fork) {
- // we might as well not have
- $we_changed_it = false;
- } else {
- $forked = true;
- }
- }
- }
- if (!$we_changed_it) {
- $doit = false;// nothing to do
- }
- }
- if ($doit) {
- $this->setConf($uid, $key, $value);
- }
- if ($forked) {
+ // FIXME
+ $form->setter = create_function('$k,$v', "return Users::setConf($uid, \$k, \$v)");
+ $form->getter = create_function('$k' , "return Users::getConf($uid, \$k)");
+ @$value_old = $_POST[$key];
+ $set = $form->updateValue($value, $value_old);
+ if (is_string($set)) {
echo "<pre>\n";
- echo "Error: Value changed elsewhere, and I don't have real handling for this yet.\n";
+ echo "Error: Value changed elsewhere, ".
+ "and I don't have real handling ".
+ "for this yet.\n";
echo "UID: $uid\n";
echo "Name: ".$user->getName()."\n";
echo "Key: $key\n";
- echo "Value: Original : "; var_dump($value_base);
- echo "Value: Other edit: "; var_dump($value_fork);
- echo "Value: This edit : "; var_dump($value);
+ echo "Value: Original : ";
+ var_dump($value_base);
+ echo "Value: Other edit: ";
+ var_dump($value_fork);
+ echo "Value: This edit : ";
+ var_dump($value);
echo "</pre>";
}
}
@@ -319,20 +300,20 @@ class Users extends Controller {
$vars['users'] = array();
$uids = $db->listUsers();
foreach ($uids as $uid) {
- $user = Auth::getObj($uid);
$vars['users'][$uid] = array();
foreach ($vars['attribs'] as $attrib) {
$key = $attrib['key'];
- $props = $this->getConf($user, $key);
+ $props = $this->getConf($uid, $key);
$vars['users'][$uid][$key] = $props;
}
}
$this->showView('users/index', $vars);
}
- private function getConf($user, $key) {
+ public static function getConf($uid, $key) {
+ $user = Auth::getObj($uid);
$logged_in_user = Auth::getObj(Login::isLoggedIn());
- $uid = $user->getUID();
+
$post_key = $key."[$uid]";
@$value = $_POST[$post_key];
$editable = $user->canEdit();
@@ -363,25 +344,25 @@ class Users extends Controller {
'post_key'=>$post_key,
'editable'=>$editable);
}
- private function setConf($uid, $key, $value) {
+ public static function setConf($uid, $key, $value) {
// So, this rocks because we don't have to check permissions,
// the User object does that.
$user = Auth::getObj($uid);
switch ($key) {
case 'auth_name':
- $user->setName($value);
+ return $user->setName($value);
break;
case 'auth_user':
- $user->setUser($value=='true');
+ return $user->setUser($value=='true');
break;
case 'auth_admin':
- $user->setAdmin($value=='true');
+ return $user->setAdmin($value=='true');
break;
case 'auth_delete':
- if ($value=='true') $user->delete();
+ if ($value=='true') return $user->delete();
default:
- $user->setConf($key, $value);
+ return $user->setConf($key, $value);
break;
}
}
diff --git a/src/lib/Form.class.php b/src/lib/Form.class.php
new file mode 100644
index 0000000..725bac5
--- /dev/null
+++ b/src/lib/Form.class.php
@@ -0,0 +1,57 @@
+<?php
+
+require_once('Auth.class.php');
+
+class Form {
+ public $getter = null;
+ public $setter = null;
+ public function __constructor($get, $set) {
+ $this->getter = $get;
+ $this->setter = $set;
+ }
+ private function getConf($key) {
+ call_user_func($getter, $key);
+ }
+ public function setConf($key, $value) {
+ call_user_func($setter, $key, $value);
+ }
+ private function getConfString($key) {
+ $raw = $this->getConf($key);
+ $value = $raw['value'];
+ if ($value===false) return 'false';
+ if ($value===true) return 'true';
+ return $value;
+ }
+
+ public function updateValue($value, $value_base=null) {
+ $doit = true;
+ $forked = false;
+ $have_old = ($value_base!==null);
+ if ($have_old) {
+ @$value_base = $old[$uid];
+ $we_changed_it = $value_base != $value;
+ if ($we_changed_it) {
+ $value_fork = $this->getConfString($key);
+ $someone_else_changed_it =
+ $value_fork != $value_base;
+ if ($someone_else_changed_it) {
+ if ($value == $value_fork) {
+ // we might as well not have
+ $we_changed_it = false;
+ } else {
+ $forked = true;
+ }
+ }
+ }
+ if (!$we_changed_it) {
+ $doit = false;// nothing to do
+ }
+ }
+ if ($doit) {
+ return $this->setConf($key, $value);
+ }
+ if ($forked) {
+ return $value_fork;
+ }
+ }
+}