Changeset 851
- Timestamp:
- 02/11/09 21:57:06 (10 months ago)
- Location:
- trunk/DJabberd
- Files:
-
- 5 modified
-
lib/DJabberd/Bot.pm (modified) (1 diff)
-
lib/DJabberd/IQ.pm (modified) (8 diffs)
-
lib/DJabberd/JID.pm (modified) (2 diffs)
-
lib/DJabberd/VHost.pm (modified) (2 diffs)
-
t/sasl-login.t (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/DJabberd/lib/DJabberd/Bot.pm
r795 r851 52 52 sub register { 53 53 my ($self, $vhost) = @_; 54 $self->{jid} = DJabberd::JID->new("$self->{nodename}\@" . $vhost->server_name . "/$self->{resource}"); 54 my $barejid = DJabberd::JID->new("$self->{nodename}\@" . $vhost->server_name ); 55 my $resource = $self->{resource}; 55 56 56 57 $self->{vhost} = $vhost; 57 58 Scalar::Util::weaken($self->{vhost}); 58 59 60 my $reg_jid; 59 61 my $regcb = DJabberd::Callback->new({ 60 62 registered => sub { 61 $logger->debug("Bot $self->{jid} is now registered"); 63 (undef, my $reg_jid) = @_; 64 $logger->debug("Bot $reg_jid is now registered"); 62 65 }, 63 66 error => sub { 64 $logger->error("Bot $ self->{jid}failed to register");67 $logger->error("Bot $barejid/$resource failed to register"); 65 68 }, 66 69 }); 67 70 68 $vhost->register_jid($self->{jid}, $self , $regcb); 69 DJabberd::Presence->set_local_presence( 70 $self->{jid}, 71 DJabberd::Presence->available( from => $self->{jid} ) 72 ); 71 $vhost->register_jid($barejid, $resource, $self, $regcb); 72 if ($reg_jid) { 73 $self->{jid} = $reg_jid; 74 DJabberd::Presence->set_local_presence( 75 $self->{jid}, 76 DJabberd::Presence->available( from => $self->{jid} ) 77 ); 78 } 73 79 } 74 80 -
trunk/DJabberd/lib/DJabberd/IQ.pm
r849 r851 496 496 my $digest = $get->("digest"); 497 497 498 return unless $username =~ /^\w+$/; 498 # "Both the username and the resource are REQUIRED for client 499 # authentication" Section 3.1 of XEP 0078 500 return unless $username && $username =~ /^\w+$/; 501 return unless $resource; 499 502 500 503 my $vhost = $conn->vhost; … … 518 521 519 522 # register 520 my $jid = DJabberd::JID->new("$authjid /$resource");523 my $jid = DJabberd::JID->new("$authjid"); 521 524 522 525 unless ($jid) { … … 527 530 my $regcb = DJabberd::Callback->new({ 528 531 registered => sub { 529 $conn->set_bound_jid($jid); 532 (undef, my $fulljid) = @_; 533 $conn->set_bound_jid($fulljid); 530 534 $DJabberd::Stats::counter{'auth_success'}++; 531 535 $iq->send_result; … … 540 544 }); 541 545 542 $vhost->register_jid($jid, $ conn, $regcb);546 $vhost->register_jid($jid, $resource, $conn, $regcb); 543 547 }; 544 548 … … 627 631 }; 628 632 629 my $resource = $get->("resource") 630 || Digest::SHA1::sha1_hex(rand() . rand() . rand()); 633 my $resource = $get->("resource") || DJabberd::JID->rand_resource; 631 634 632 635 my $vhost = $conn->vhost; … … 669 672 670 673 # register 671 my $jid = DJabberd::JID->new( "$authjid/$resource");674 my $jid = DJabberd::JID->new($authjid); 672 675 673 676 unless ($jid) { … … 678 681 my $regcb = DJabberd::Callback->new({ 679 682 registered => sub { 680 $conn->set_bound_jid($jid); 683 (undef, my $fulljid) = @_; 684 $conn->set_bound_jid($fulljid); 681 685 $DJabberd::Stats::counter{'auth_success'}++; 682 686 my $xml = <<EOX; 683 <iq id='$ id' type='result'>687 <iq id='$fulljid' type='result'> 684 688 <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> 685 <jid>$ jid</jid>689 <jid>$fulljid</jid> 686 690 </bind> 687 691 </iq> … … 699 703 }); 700 704 701 $vhost->register_jid($jid, $ conn, $regcb);705 $vhost->register_jid($jid, $resource, $conn, $regcb); 702 706 return 1; 703 707 } -
trunk/DJabberd/lib/DJabberd/JID.pm
r672 r851 2 2 use strict; 3 3 use DJabberd::Util qw(exml); 4 use Digest::SHA1; 4 5 5 6 use overload … … 76 77 } 77 78 79 sub rand_resource { 80 Digest::SHA1::sha1_hex(rand() . rand() . rand()); 81 } 82 78 83 1; 79 84 -
trunk/DJabberd/lib/DJabberd/VHost.pm
r841 r851 5 5 use DJabberd::Util qw(tsub as_bool); 6 6 use DJabberd::Log; 7 use DJabberd::JID; 7 8 use DJabberd::Roster; 8 9 … … 364 365 365 366 sub register_jid { 366 my ($self, $jid, $conn, $cb) = @_; 367 my ($self, $jid, $resource, $conn, $cb) = @_; 368 369 my $barestr = $jid->as_bare_string; ## $jid should be bare anyway 370 my $fullstr = "$barestr/$resource"; 371 367 372 # $cb can ->registered, ->error 368 $logger->info("Registering '$jid' to connection '$conn->{id}'"); 369 370 my $barestr = $jid->as_bare_string; 371 my $fullstr = $jid->as_string; 372 373 $logger->info("Registering '$fullstr' to connection '$conn->{id}'"); 374 375 ## deprecated 0078 appears a bit conflicting with RFC 3920 376 ## the recommended behaviour in the latter is to generate a resource for 377 ## the dupe. Don't ask me if one resource uses RFC 3920 and the other 378 ## XEP 0078 :D. If we detect a sasl connection, we go with the RFC way. 373 379 if (my $econn = $self->{jid2sock}{$fullstr}) { 374 $econn->stream_error("conflict"); 375 } 380 if ($conn->sasl) { 381 my $resource = DJabberd::JID->rand_resource; 382 $fullstr = "$barestr/$resource"; 383 } 384 else { 385 $econn->stream_error("conflict"); 386 } 387 } 388 my $fulljid = DJabberd::JID->new($fullstr); 376 389 377 390 $self->{jid2sock}{$fullstr} = $conn; 378 391 ($self->{bare2fulls}{$barestr} ||= {})->{$fullstr} = 1; # TODO: this should be the connection, not a 1, saves work in unregister JID? 379 392 380 $cb->registered ;393 $cb->registered($fulljid); 381 394 } 382 395 -
trunk/DJabberd/t/sasl-login.t
r850 r851 66 66 { 67 67 two_parties(sub { 68 my ($pa, $pb) = @_; 68 my ($pa1, $pb) = @_; 69 my $conflicted_res = "yann"; 69 70 71 my $pa2 = Test::DJabberd::Client->new(server => $pa1->server, 72 name => $pa1->username, 73 resource => $conflicted_res, 74 ); 70 75 my $sasl = Authen::SASL->new( 71 76 mechanism => "DIGEST-MD5", 72 77 callback => { 73 pass => sub { $pa ->password },74 user => sub { $pa ->{name} },78 pass => sub { $pa1->password }, 79 user => sub { $pa1->{name} }, 75 80 }, 76 81 ); 77 my $pa_res = $pa->sasl_login($sasl, "yann")->resource; 78 my $pb_res = $pb->sasl_login($sasl, "yann")->resource; 79 cmp_ok $pa_res, 'ne', $pb_res, "resources are different"; 80 is $pa_res, "yann", "first got what it wanted"; 81 isnt $pb_res, "yann", "second didn't"; 82 my $pa1_res = $pa1->sasl_login($sasl, $conflicted_res)->resource; 83 84 my $pa2_res = $pa2->sasl_login($sasl, $conflicted_res)->resource; 85 cmp_ok $pa1_res, 'ne', $pa2_res, "resources are different"; 86 is $pa1_res, $conflicted_res, "first got what it wanted"; 87 isnt $pa2_res, $conflicted_res, "second didn't"; 82 88 }); 83 89 }
