📄 xmlrpc.pm
字号:
package PunJab::XMLRPC;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 XMLRPC::Lite;use PunJab;use PunJab::Util;use PunJab::Session;use PunJab::Server::XMLRPC;use POSIX qw(strftime);use Digest::MD5 qw(md5 md5_hex md5_base64);use Data::Uniqid qw ( suniqid uniqid luniqid );# xmlrpc code adapted from POE::Component::Server::XMLRPCsub new { shift; my $config = shift; $config->{'type'} = "xmlrpc_client"; PunJab::Server::XMLRPC->new($config,'xmlrpc_server'); POE::Session->create ( inline_states => { _start => sub { my $kernel = $_[KERNEL]; if ($config->{debug}>0) { &debug("XMLRPC Interface Session Started\n"); } $kernel->alias_set("xmlrpc_client"); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "send_xml" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "get_iq" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "vcard" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "browse" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "start_roster" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "start_contact" ); # need a remove contact $kernel->post( xmlrpc_server => publish => xmlrpc_client => "send_presence" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "get_presence" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "get_roster" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "get_message" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "check_message" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "send_message" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "connect" ); $kernel->post( xmlrpc_server => publish => xmlrpc_client => "disconnect" ); }, # -------------------------- # # 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, vcard => \&vcard, browse => \&browse, # check methods check_message => \&jabber_check_message, #check_roster #check_iq? send_xmlrpc => \&send_xmlrpc, #none xmlrpc functions check_timeout => \&check_timeout, check_timeout_continue => \&check_timeout_continue, return_iq => \&return_iq, return_vcard => \&return_vcard, return_browse => \&return_browse, return_roster => \&return_roster, return_contact => \&return_contact, 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("Session $sid registered"); } }, session_unregister => sub { my $sid = $_[ARG0]; $punjab_session->unregister($sid); if ($_[HEAP]->{'CONFIG'}->{debug} > 1) { &debug("Session $sid unregistered"); } }, }, heap => { CONFIG => $config }, options => { debug => $config->{'debug'}, trace => $config->{'debug'} } ); return undef;}### Handlers for the xmlrpc server. sub shutdown_service { # loop and delete all interfaces $_[KERNEL]->post( xmlrpc_server => rescind => xmlrpc_client => "connect" ); $_[KERNEL]->post( xmlrpc_server => rescind => xmlrpc_client => "disconnect" ); $_[KERNEL]->yield("shutdown");}sub jabber_connect { my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $jid = $params->[0] if defined $params->[0]; my $pass = $params->[1] if defined $params->[1]; my $port = $params->[2] if defined $params->[2]; my ($session_id,$error); if ($jid eq "" or $pass eq "") { $xmlrpc_transaction->error("You need a jid and a password"); return FALSE; } ### Grab hostname and port (PXR::Utils::get_host) #my $hostname = &get_host($jid); my ($username,$hostname,$resource) = &parse_jid($jid); if (not defined($port) or $port eq "") { $port = 5222; } ### Create the session # put this in a xmlrpc header? my $ip = $xmlrpc_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'}->{debug} > 1) { &debug('Connecting : ' .$jid." : ". $session_id . ":" .$port."\n"); } if ($punjab_session->check_session($session_id)) { $xmlrpc_transaction->return($session_id); return; } PunJab::JabberConnection->new($session_id, $jid, $pass, $username, $resource, $hostname, $port, $heap->{'CONFIG'}, $xmlrpc_transaction, 'session_register', 'session_unregister'); $kernel->delay('check_timeout', $heap->{'CONFIG'}->{'idle_check'}); }sub jabber_disconnect { my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; $kernel->post($sid,'disconnect'); $xmlrpc_transaction->return(1);}sub jabber_send_xml{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; my $xml = $params->[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); $kernel->post('Manager'.$sid,'manage_events', 'return_iq', $xmlrpc_transaction,$node,$sid); } else { $kernel->post($sid,'send_xml',$node); } $xmlrpc_transaction->return(1); } else { $xmlrpc_transaction->error("Error in xml node."); } } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_send_message{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; my $to = $params->[1]; my $subject = $params->[2]; my $body = $params->[3]; my $type = $params->[4]; my $id = $params->[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); $xmlrpc_transaction->return(1); } else { $xmlrpc_transaction->error("Session does not exist"); } }sub jabber_send_presence{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0] if defined $params->[0]; my $to = $params->[1] if defined $params->[1]; my $type = $params->[2] if defined $params->[2]; my $show = $params->[3] if defined $params->[3]; my $status = $params->[4] if defined $params->[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($sid,'send_presence',$type,$show,$status,$to); } else { $kernel->post($sid,'send_presence',$type,$show,$status); } if ($type eq "subscribed") { $kernel->post('Manager'.$sid,'delete_presence',$to); } } else { $kernel->post($sid,'send_presence'); } $xmlrpc_transaction->return(TRUE); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_start_contact{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0] if defined $params->[0]; my $service = $params->[1] if defined $params->[1]; my $to = $params->[2] if defined $params->[2]; my $nick = $params->[3] if defined $params->[3]; my $group = $params->[4] if defined $params->[4]; my $request = $params->[5] if defined $params->[5]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); my $id = luniqid; if (defined($to)) { if (defined($request)) { $kernel->post($sid, 'send_presence', 'subscribe', 'Online', 'Online',$to); } my $node = POE::Filter::XML::Node->new('iq'); $node->attr('type','set'); $node->attr('id',$id); my $query = $node->insert_tag('query'); $query->attr('xmlns',NS_JABBER_ROSTER); my $item = $query->insert_tag('item'); my $g_tag = $query->insert_tag('group'); $g_tag->data($group); $item->attr('name',$nick); $item->attr('jid',$to); $kernel->post($sid,'send_xml',$node); $kernel->post('Manager'.$sid,'manage_events', 'return_contact', $xmlrpc_transaction,$node,$sid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -