Author: dylan
Date: 2005-11-11 18:19:12 -0500 (Fri, 11 Nov 2005)
New Revision: 918

Modified:
   trunk/
   trunk/docs/spec/lib/Haver/Spec.pod
   trunk/perl/server/lib/Haver/Server/Entity.pm
   trunk/perl/server/lib/Haver/Server/Entity/Avatar.pm
   trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
   trunk/perl/server/lib/Haver/Server/Store.pm
   trunk/perl/server/lib/Haver/Server/Talker.pm
   trunk/perl/server/lib/Haver/Server/Wheel/Auth.pm
   trunk/perl/server/lib/Haver/Server/Wheel/Login.pm
Log:
Added GHOST to the server.
Doesn't work for auth-supporting clients yet.


Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/winch/trunk:43192
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1560
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/winch/trunk:43192
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1569
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Modified: trunk/docs/spec/lib/Haver/Spec.pod
===================================================================
--- trunk/docs/spec/lib/Haver/Spec.pod  2005-11-10 12:58:04 UTC (rev 917)
+++ trunk/docs/spec/lib/Haver/Spec.pod  2005-11-11 23:19:12 UTC (rev 918)
@@ -258,7 +258,10 @@
 
 Tried to part a channel you're not in.
 
+=head2 ip.mismatch
 
+Tried to GHOST with a different IP.
+
 =head1 I MEAN, HI
 
 I could describe the messages here in greater detail, but I think that belongs 
in the

Modified: trunk/perl/server/lib/Haver/Server/Entity/Avatar.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Avatar.pm 2005-11-10 12:58:04 UTC 
(rev 917)
+++ trunk/perl/server/lib/Haver/Server/Entity/Avatar.pm 2005-11-11 23:19:12 UTC 
(rev 918)
@@ -9,11 +9,13 @@
 
 
 field -weak    => 'wheel';
+field sid      => undef;
 field _access  => {};
 field passcode => undef;
 field address  => '0.0.0.*';
 field version  => 'unknown';
 field email    => '';
+field authenticated   => 0;
 
 sub initialize {
        my ($self) = @_;
@@ -22,6 +24,11 @@
        }
 }
 
+sub call {
+       my $self = shift;
+       $POE::Kernel::poe_kernel->call($self->sid, @_);
+}
+
 sub put {
        my ($self, $msg) = @_;
 

Modified: trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Channel.pm        2005-11-10 
12:58:04 UTC (rev 917)
+++ trunk/perl/server/lib/Haver/Server/Entity/Channel.pm        2005-11-11 
23:19:12 UTC (rev 918)
@@ -70,7 +70,7 @@
 
 sub fetch {
     my $self = shift;
-    carp "fetch() is deprecated";
+    carp "fetch() is deprecated use get()";
     $self->get(@_);
 }
 

Modified: trunk/perl/server/lib/Haver/Server/Entity.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity.pm        2005-11-10 12:58:04 UTC 
(rev 917)
+++ trunk/perl/server/lib/Haver/Server/Entity.pm        2005-11-11 23:19:12 UTC 
(rev 918)
@@ -34,7 +34,7 @@
 
 
 sub load {
-    my ($this, $data) = @_;
+    my ($this, $data, $store) = @_;
     my $self = $this->new;
     $self->name($data->{name});
     $self->attr($data->{attr});
@@ -42,7 +42,7 @@
 }
 
 sub dump {
-    my ($self) = @_;
+    my ($self, $store) = @_;
     return {
         name => $self->name,
         attr => $self->attr,

Modified: trunk/perl/server/lib/Haver/Server/Store.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Store.pm 2005-11-10 12:58:04 UTC (rev 
917)
+++ trunk/perl/server/lib/Haver/Server/Store.pm 2005-11-11 23:19:12 UTC (rev 
918)
@@ -10,6 +10,8 @@
 
 our $VERSION = 0.01;
 
+field locks => {};
+
 sub initialize {
        my $self = shift;
        $self->{storedir} ||= File::Spec->curdir;
@@ -30,18 +32,38 @@
        }
 }
 
+sub lock {
+       my ($self, $ns, $name) = @_;
+       $self->{locks}{"$ns/$name"} = 1;
+}
+
+sub unlock {
+       my ($self, $ns, $name) = @_;
+       delete $self->{locks}{"$ns/$name"};
+}
+
+sub is_locked {
+       my ($self, $ns, $name) = @_;
+       exists $self->{locks}{"$ns/$name"};
+}
+
 sub insert {
        my ($self, $entity) = @_;
        my $data = $entity->dump($self);
        my $file = $self->filename($entity->namespace, $entity->name);
-       
+
+       $self->unlock($entity->namespace, $entity->name);
        $self->_save_file($file, ref($entity), $data);
 }
 
 sub fetch {
        my ($self, $ns, $name) = @_;
        my $file = $self->filename($ns, $name);
+       if ($self->is_locked($ns, $name)) {
+               die "can't fetch $ns/$name: locked.";
+       }
        my ($class, $data)  = @{ $self->_load_file($file) };
+       $self->lock($ns, $name);
        return $class->load($data, $self);
 }
 

Modified: trunk/perl/server/lib/Haver/Server/Talker.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Talker.pm        2005-11-10 12:58:04 UTC 
(rev 917)
+++ trunk/perl/server/lib/Haver/Server/Talker.pm        2005-11-11 23:19:12 UTC 
(rev 918)
@@ -65,7 +65,7 @@
                        Log('warning', 'Probably a search engine...');
                        $heap->{error} = 1;
                        $heap->{client} = undef;
-                       post('shutdown');
+                       call('shutdown');
                } else {
                        Log('warning', "Client isseud unknown command $cmd");
                        call('fail', 'unknown.cmd');

Modified: trunk/perl/server/lib/Haver/Server/Wheel/Auth.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Wheel/Auth.pm    2005-11-10 12:58:04 UTC 
(rev 917)
+++ trunk/perl/server/lib/Haver/Server/Wheel/Auth.pm    2005-11-11 23:19:12 UTC 
(rev 918)
@@ -23,6 +23,7 @@
        my ($kernel, $heap, $user) = @_[KERNEL, HEAP, ARG0];
        Log('notice', "client is authorized as $heap->{name}");
        $heap->{loader}->unload_wheel(__PACKAGE__);
+       $user->authenticated(1);
        $kernel->yield('accept', delete $heap->{name}, $user);
 }
 

Modified: trunk/perl/server/lib/Haver/Server/Wheel/Login.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Wheel/Login.pm   2005-11-10 12:58:04 UTC 
(rev 917)
+++ trunk/perl/server/lib/Haver/Server/Wheel/Login.pm   2005-11-11 23:19:12 UTC 
(rev 918)
@@ -34,8 +34,38 @@
        $heap->{extensions} = \%ext;
        $self->undefine('msg_HAVER');
        $self->define('msg_IDENT', 'msg_IDENT');
+       $self->define('msg_GHOST', 'msg_GHOST');
 }
 
+sub msg_GHOST {
+       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
+       my ($name) = @$args;
+       my $ns     = 'user';
+       my $lobby  = $heap->{lobby};
+       my $store  = $heap->{store};
+
+       if ($lobby->contains($ns, $name)) {
+               if (exists $heap->{extensions}{auth}) {
+                       Log("notice", "not supported");
+                       call('fail', "unsupported");
+               } else {
+                       my $user = $lobby->get($ns, $name);
+                       if ((not $user->authenticated) and $user->address eq 
$heap->{address}) {
+                               Log('notice', "Removing $ns/$name from &lobby");
+                               $lobby->remove($ns, $name);
+                               $user->call('shutdown', 'ghost');
+                               call('msg_IDENT', [$name]);
+                       } else {
+                               Log('notice', "$user->{address} ne 
$heap->{address}");
+                               call('fail', "ip.mismatch", $heap->{address});
+                       }
+               }
+       } else {
+               Log("notice", "GHOST Passthrough");
+               call('msg_IDENT', [$name]);
+       }
+}
+
 sub msg_IDENT {
        my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
        my ($name) = @$args;
@@ -71,6 +101,7 @@
 
 
        $user->wheel($heap->{client});
+       $user->sid($_[SESSION]->ID);
        $user->version($heap->{version});
        $user->address($heap->{address});
        $lobby->add($user);


Reply via email to