📄 soap.pm
字号:
package PunJab::Soap;use strict;use warnings;use POE;use POE::Filter::XML;use POE::Filter::XML::Node;use POE::Filter::XML::NS qw/ :JABBER :IQ /;use POE::Filter::XML::Utils;use PunJab::Util;use PunJab::Session;use PunJab::Server::Soap;use POSIX qw(strftime);use Digest::MD5 qw(md5 md5_hex md5_base64);use Data::Uniqid qw ( suniqid uniqid luniqid );use Digest::SHA1;sub new { shift; my $config = shift; $config->{'type'} = "soap_client"; PunJab::Server::Soap->new($config,'soap_server'); POE::Session->create ( inline_states => { _start => sub { my $kernel = $_[KERNEL]; if ($config->{debug}>0) { &debug("Soap Interface Session Started\n"); } $kernel->alias_set("soap_client"); $kernel->post( soap_server => publish => soap_client => "dump_body" ); $kernel->post( soap_server => publish => soap_client => "send_xml" ); #$kernel->post( soap_server => publish => soap_client => "send_iq" ); $kernel->post( soap_server => publish => soap_client => "get_iq" ); $kernel->post( soap_server => publish => soap_client => "start_roster" ); #$kernel->post( soap_server => publish => soap_client => "check_roster" ); $kernel->post( soap_server => publish => soap_client => "start_contact" ); $kernel->post( soap_server => publish => soap_client => "send_presence" ); $kernel->post( soap_server => publish => soap_client => "get_presence" ); $kernel->post( soap_server => publish => soap_client => "get_roster" ); $kernel->post( soap_server => publish => soap_client => "get_message" ); $kernel->post( soap_server => publish => soap_client => "check_message" ); $kernel->post( soap_server => publish => soap_client => "send_message" ); $kernel->post( soap_server => publish => soap_client => "connect" ); $kernel->post( soap_server => publish => soap_client => "disconnect" ); }, session_register => sub { my $sid = $_[ARG0]; $punjab_session->register($sid); $punjab_session->logged_in($sid,1); $punjab_session->activity($sid,time()); if ($_[HEAP]->{'CONFIG'}->{debug} > 1) { &debug("SOAP Session $sid registered"); } }, session_unregister => sub { my $sid = $_[ARG0]; $punjab_session->unregister($sid); if ($_[HEAP]->{'CONFIG'}->{debug} > 1) { &debug("SOAP Session $sid unregistered"); } }, # -------------------------- # # client methods # -------------------------- # connect => \&jabber_connect, disconnect => \&jabber_disconnect, # send methods send_xml => \&jabber_send_xml, #send_iq => \&jabber_send_iq, send_presence => \&jabber_send_presence, send_message => \&jabber_send_message, # roster methods start_roster => \&jabber_start_roster, get_roster => \&jabber_get_roster, start_contact => \&jabber_start_contact, # get methods get_message => \&jabber_get_message, get_presence => \&jabber_get_presence, get_iq => \&jabber_get_iq, # check methods check_message => \&jabber_check_message, #check_roster #check_iq? send_soap => \&send_soap, #none soap functions return_iq => \&return_iq, return_roster => \&return_roster, return_contact => \&return_contact, check_timeout => \&check_timeout, check_timeout_continue => \&check_timeout_continue, }, heap => { CONFIG => $config }, options => { debug => $config->{'debug'}, trace => $config->{'debug'} } ); return undef;}### Handlers for the soap server. #my %users;sub shutdown_service { $_[KERNEL]->post( soapy => rescind => service => "connect" ); $_[KERNEL]->post( soapy => rescind => service => "disconnect" ); $_[KERNEL]->yield("shutdown");}sub jabber_connect { my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $soap_transaction->params(); my @order = sort(keys(%$params)); # is this what I have to do? my $jid = $params->{$order[0]}; my $pass = $params->{$order[1]}; my $port = $params->{$order[2]}; my ($session_id,$error); if ($jid eq "" or $pass eq "") { $soap_transaction->return(FALSE); return FALSE; } my ($username,$hostname,$resource) = &parse_jid($jid); #my $port_num = '5222' if not defined $port; if ($port eq "") { $port = 5222; } ### Create the session # put this in a soap header my $ip = $soap_transaction->request()->{remote_ip}; $ip = luniqid if not defined $ip; my $key = $jid.$pass.$resource.$ip; $session_id = $punjab_session->key($key); ### Start the jabber client. if ($heap->{'CONFIG'}->{server}->{debug} > 1) { &debug('Connecting : ' .$jid." : ". $session_id . ":" .$port."\n"); } if ($punjab_session->check_session($session_id)) { $soap_transaction->return($session_id); return; } PunJab::JabberConnection->new($session_id, $jid, $pass, $username, $resource, $hostname, $port, $heap->{'CONFIG'}, $soap_transaction, 'session_register', 'session_unregister'); $kernel->delay('check_timeout', $heap->{'CONFIG'}->{'idle_check'},$session_id); }sub jabber_disconnect { my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $soap_transaction->params(); my ($cruft,$sid) = each(%$params); $kernel->call($sid,'disconnect'); $soap_transaction->return(1); }sub jabber_send_xml{ my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $soap_transaction->params(); my @order = sort(keys(%$params)); # is this what I have to do? my $sid = $params->{$order[0]}; my $xml = $params->{$order[1]}; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # turn into a node my $node = &str_to_node($xml); # maybe add this to the manager? # $kernel->post('Manager'.$sid,'output_event',$node); if (defined($node)) { my $attrs = $node->get_attrs(); my $id = $attrs->{'id'}; if (defined($id) and $node->name() eq "iq") { $kernel->post($sid,'send_xml',$node); &debug("send_xml : Manage IQ"); $kernel->post('Manager'.$sid,'manage_events', 'return_iq', $soap_transaction,$node,$sid); return; } else { $kernel->post($sid,'send_xml',$node); } $soap_transaction->return(1); } else { $soap_transaction->return("Error in xml node."); } } else { $soap_transaction->return("Session does not exist"); }}sub jabber_send_message{ my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $soap_transaction->params(); my @order = sort(keys(%$params)); # is this what I have to do? my $sid = $params->{$order[0]}; my $to = $params->{$order[1]}; my $subject = $params->{$order[2]}; my $body = $params->{$order[3]}; my $type = $params->{$order[4]}; my $id = $params->{$order[5]}; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); my $xml = POE::Filter::XML::Node->new('message'); if ($id eq "") { $id = strftime("%m%d%y%H%M%S%Y", localtime); } $xml->attr('id',$id); $xml->attr('to',$to); $xml->attr('from',$heap->{'jid'}); $xml->attr('type',$type); if (defined($subject) and $subject ne "") { my $subject_t = $xml->insert_tag('subject'); $subject_t->data($subject); } my $body_t = $xml->insert_tag('body'); $body_t->data($body); $kernel->post($sid,'send_xml',$xml); $soap_transaction->return(1); } else { $soap_transaction->return("Session does not exist"); } }sub jabber_send_presence{ my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $soap_transaction->params(); my @order = sort(keys(%$params)); # is this what I have to do? my $sid = $params->{$order[0]} if defined $params->{$order[0]}; my $to = $params->{$order[1]} if defined $params->{$order[1]}; my $type = $params->{$order[2]} if defined $params->{$order[2]}; my $show = $params->{$order[3]} if defined $params->{$order[3]}; my $status = $params->{$order[4]} if defined $params->{$order[4]}; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); if (defined($to) and defined($type) and defined($show) and defined($status)) { if (length($to)>1) { $kernel->post('JABBER'.$sid,'send_presence',$type,$show,$status,$to); } else { $kernel->post('JABBER'.$sid,'send_presence',$type,$show,$status); } if ($type eq "subscribed") { $kernel->call('Manager'.$sid,'delete_presence',$to); } } else { $kernel->post('JABBER'.$sid,'send_presence'); } $soap_transaction->return(TRUE); } else { $soap_transaction->return(FALSE); }}sub jabber_start_contact{ my ($kernel,$heap,$session,$soap_transaction) = @_[KERNEL, HEAP, SESSION, ARG0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -