Index: trunk/Nebulous-Server/Changes
===================================================================
--- trunk/Nebulous-Server/Changes	(revision 24290)
+++ trunk/Nebulous-Server/Changes	(revision 24291)
@@ -2,4 +2,5 @@
 
 0.17
+    - restrict creation/modification/remove of xattrs to the user.* namespace
     - add chmod_object() method
     - retry database transactions when a deadlock is detected
Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 24290)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 24291)
@@ -740,4 +740,6 @@
     }
 
+    # check to see if the user.mode xattr exists
+
     $log->debug("leaving");
 
@@ -982,4 +984,8 @@
         {
             type        => SCALAR,
+            callbacks   => {
+                'xattr is in user. namespace'
+                    => sub { ($_[0]) =~ qr/^user\./ },
+            },
         },
         {
@@ -1065,4 +1071,8 @@
         {
             type        => SCALAR,
+            callbacks   => {
+                'xattr is in user. namespace'
+                    => sub { ($_[0]) =~ qr/^user\./ },
+            },
         },
     );
@@ -1161,4 +1171,8 @@
         {
             type        => SCALAR,
+            callbacks   => {
+                'xattr is in user. namespace'
+                    => sub { ($_[0]) =~ qr/^user\./ },
+            },
         },
     );
@@ -1180,6 +1194,11 @@
             $query->finish;
 
+            # no rows affected means the xattr did not exist
+            if ($rows == 0) {
+                $log->logdie( "xattr $key:$name does not exist" );
+            }
+
             # if we affected more then one row something very bad has happened.
-            unless ($rows == 1) {
+            if ($rows > 1) {
                 $log->logdie( "affected row count is $rows instead of 1" );
             }
Index: trunk/Nebulous-Server/t/14_server_xattr.t
===================================================================
--- trunk/Nebulous-Server/t/14_server_xattr.t	(revision 24290)
+++ trunk/Nebulous-Server/t/14_server_xattr.t	(revision 24291)
@@ -8,5 +8,5 @@
 use warnings FATAL => qw( all );
 
-use Test::More tests => 36;
+use Test::More tests => 44;
 
 use lib qw( ./t ./lib );
@@ -28,15 +28,15 @@
     my $uri = $neb->create_object('foo');
 
-    ok($neb->setxattr_object('foo', 'bar', 'baz', 'create'), 'set object xattr');
+    ok($neb->setxattr_object('foo', 'user.bar', 'baz', 'create'), 'set object xattr');
     {
         my $xattrs = $neb->listxattr_object('foo');
         is(scalar @$xattrs, 1, 'number of xattrs');
-        is(@$xattrs[0], 'bar', 'xattr name');
-    }
-
-    my $value = $neb->getxattr_object('foo', 'bar');
+        is(@$xattrs[0], 'user.bar', 'xattr name');
+    }
+
+    my $value = $neb->getxattr_object('foo', 'user.bar');
     is($value, 'baz', 'xattr value');
 
-    ok($neb->removexattr_object('foo', 'bar'), "remove object xattr");
+    ok($neb->removexattr_object('foo', 'user.bar'), "remove object xattr");
     {
         my $xattrs = $neb->listxattr_object('foo');
@@ -52,21 +52,21 @@
     my $uri = $neb->create_object('foo');
 
-    ok($neb->setxattr_object('foo', 'bar', 'baz', 'create'), 'set object xattr');
-    ok($neb->setxattr_object('foo', 'bonk', 'quix', 'create'), 'set object xattr');
+    ok($neb->setxattr_object('foo', 'user.bar', 'baz', 'create'), 'set object xattr');
+    ok($neb->setxattr_object('foo', 'user.bonk', 'quix', 'create'), 'set object xattr');
     
     {
         my $xattrs = $neb->listxattr_object('foo');
         is(scalar @$xattrs, 2, 'number of xattrs');
-        is(@$xattrs[0], 'bar', 'xattr name');
-        is(@$xattrs[1], 'bonk', 'xattr name');
-    }
-
-    my $value = $neb->getxattr_object('foo', 'bar');
+        is(@$xattrs[0], 'user.bar', 'xattr name');
+        is(@$xattrs[1], 'user.bonk', 'xattr name');
+    }
+
+    my $value = $neb->getxattr_object('foo', 'user.bar');
     is($value, 'baz', 'xattr value');
-    $value = $neb->getxattr_object('foo', 'bonk');
+    $value = $neb->getxattr_object('foo', 'user.bonk');
     is($value, 'quix', 'xattr value');
 
-    ok($neb->removexattr_object('foo', 'bar'), "remove object xattr");
-    ok($neb->removexattr_object('foo', 'bonk'), "remove object xattr");
+    ok($neb->removexattr_object('foo', 'user.bar'), "remove object xattr");
+    ok($neb->removexattr_object('foo', 'user.bonk'), "remove object xattr");
     {
         my $xattrs = $neb->listxattr_object('foo');
@@ -82,17 +82,17 @@
     my $uri = $neb->create_object('foo');
 
-    ok($neb->setxattr_object('foo', 'bar', 'baz', 'create'), 'set object xattr');
-    ok($neb->setxattr_object('foo', 'bar', 'quix', 'replace'), 're-set object xattr');
+    ok($neb->setxattr_object('foo', 'user.bar', 'baz', 'create'), 'set object xattr');
+    ok($neb->setxattr_object('foo', 'user.bar', 'quix', 'replace'), 're-set object xattr');
     
     {
         my $xattrs = $neb->listxattr_object('foo');
         is(scalar @$xattrs, 1, 'number of xattrs');
-        is(@$xattrs[0], 'bar', 'xattr name');
-    }
-
-    my $value = $neb->getxattr_object('foo', 'bar');
+        is(@$xattrs[0], 'user.bar', 'xattr name');
+    }
+
+    my $value = $neb->getxattr_object('foo', 'user.bar');
     is($value, 'quix', 'xattr value');
 
-    ok($neb->removexattr_object('foo', 'bar'), "remove object xattr");
+    ok($neb->removexattr_object('foo', 'user.bar'), "remove object xattr");
     {
         my $xattrs = $neb->listxattr_object('foo');
@@ -106,10 +106,21 @@
 
 eval {
-    $neb->setxattr_object('foo', 'bar', 'baz', 'create');
+    $neb->setxattr_object('foo', 'user.bar', 'baz', 'create');
 };
 like($@, qr/is valid object key/, "create xattr on non-existant key");
 
-eval {
-    $neb->setxattr_object('foo', 'bar', 'baz', 'replace');
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+
+    $neb->setxattr_object('foo', 'luser.bar', 'baz', 'create');
+};
+like($@, qr/xattr is in user. namespace/, "user. namspace");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->setxattr_object('foo', 'user.bar', 'baz', 'replace');
 };
 like($@, qr/is valid object key/, "replace xattr on non-existant key");
@@ -127,5 +138,5 @@
     $neb->create_object('foo');
 
-    $neb->setxattr_object('foo', 'bar');
+    $neb->setxattr_object('foo', 'user.bar');
 };
 like($@, qr/4 were expected/, "too few params");
@@ -136,5 +147,5 @@
     $neb->create_object('foo');
 
-    $neb->setxattr_object('foo', 'bar', 'baz');
+    $neb->setxattr_object('foo', 'user.bar', 'baz');
 };
 like($@, qr/4 were expected/, "too few params");
@@ -145,5 +156,5 @@
     $neb->create_object('foo');
 
-    $neb->setxattr_object('foo', 'bar', 'baz', 'create', 'quix');
+    $neb->setxattr_object('foo', 'user.bar', 'baz', 'create', 'quix');
 };
 like($@, qr/4 were expected/, "too many params");
@@ -162,7 +173,16 @@
 eval {
     $neb->create_object('foo');
-    $neb->getxattr_object('foo', 'bar');
-};
-like($@, qr|xattr neb:///foo:bar does not exist|,
+
+    $neb->getxattr_object('foo', 'luser.bar');
+};
+like($@, qr/xattr is in user. namespace/, "user. namespace");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+    $neb->getxattr_object('foo', 'user.bar');
+};
+like($@, qr|xattr neb:///foo:user.bar does not exist|,
     "get xattr from non-existant xattr key");
 
@@ -188,5 +208,5 @@
     $neb->create_object('foo');
 
-    $neb->getxattr_object('foo', 'bar', 'baz');
+    $neb->getxattr_object('foo', 'user.bar', 'baz');
 };
 like($@, qr/2 were expected/, "too many params");
@@ -212,3 +232,55 @@
 like($@, qr/1 was expected/, "too many params");
 
+# removexattr_object
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->removexattr_object('foo', 'user.bar');
+};
+like($@, qr/is valid object key/, "remove xattr from non-existant nebulous key");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+
+    $neb->getxattr_object('foo', 'luser.bar');
+};
+like($@, qr/xattr is in user. namespace/, "user. namespace");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+    $neb->removexattr_object('foo', 'user.bar');
+};
+like($@, qr|xattr neb:///foo:user.bar does not exist|,
+    "remove xattr from non-existant xattr key");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->removexattr_object();
+};
+like($@, qr/2 were expected/, "no params");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+
+    $neb->removexattr_object('foo');
+};
+like($@, qr/2 were expected/, "too few params");
+
+Test::Nebulous->setup;
+
+eval {
+    $neb->create_object('foo');
+
+    $neb->removexattr_object('foo', 'user.bar', 'baz');
+};
+like($@, qr/2 were expected/, "too many params");
+
 Test::Nebulous->cleanup;
