⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlrpc.pm

📁 Punjab is a jabber XMLRPC/SOAP/REST client. It is a xmlrpc, soap, or REST server that allows for p
💻 PM
📖 第 1 页 / 共 2 页
字号:
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 + -