diff options
Diffstat (limited to 'mod/beechat/lib/beechat.php')
-rw-r--r-- | mod/beechat/lib/beechat.php | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/mod/beechat/lib/beechat.php b/mod/beechat/lib/beechat.php new file mode 100644 index 000000000..bf002d648 --- /dev/null +++ b/mod/beechat/lib/beechat.php @@ -0,0 +1,250 @@ +<? +/* + allow_change_subj + allow_private_messages + allow_query_users + allow_user_invites + anonymous + logging + max_users + members_by_default + members_only + moderated + password + password_protected + persistent + public + public_list + title + +muc_room_set_affiliation struct[{name, String}, {service, String}, + {jid, String}, {affiliation, Affiliation}] Integer + + +*/ + //$request = xmlrpc_encode_request('muc_online_rooms', "global", (array('encoding' => 'utf-8'))); + + +function ejabberd_xmlrpc_send($request) +{ + $context = stream_context_create(array('http' => array( + 'method' => "POST", + 'header' => "User-Agent: XMLRPC::Client mod_xmlrpc\r\n" . + "Content-Type: text/xml\r\n" . + "Content-Length: ".strlen($request), + 'content' => $request + ))); + + $file = file_get_contents("http://".elgg_get_plugin_setting("xmlrpcip", "beechat").":4560/RPC2", false, $context); + + $response = xmlrpc_decode($file); + if (is_array($response) && xmlrpc_is_fault($response)) { + trigger_error("xmlrpc: $response[faultString] ($response[faultCode])"); + } else { + // print_r($response); + } +} + +function ejabberd_xmlrpc_command($command, $params) +{ + //error_log("send xmlrpc: ".$command); + $request = xmlrpc_encode_request($command, $params, (array('encoding' => 'utf-8'))); + return ejabberd_xmlrpc_send($request); +} + +function xmpp_escape($name) { + // http://xmpp.org/extensions/xep-0106.html#escaping + $name = str_replace(' ', '\\20', $name); + $name = str_replace('"', '\\22', $name); + $name = str_replace('&', '\\26', $name); + $name = str_replace("'", '\\27', $name); + $name = str_replace('/', '\\2f', $name); + $name = str_replace(';', '\\3a', $name); + $name = str_replace('<', '\\3c', $name); + $name = str_replace('>', '\\3e', $name); + $name = str_replace('@', '\\40', $name); + $name = str_replace('\\', '\\5c', $name); + return $name; +} + +class EjabberdMucRoom { + function __construct($group) { + $this->group = $group; + } + function setOption($name, $value) { + $group = $this->group; + $param=array("name"=>elgg_get_friendly_title($group->name), + "service"=>elgg_get_plugin_setting("groupdomain", "beechat"), + "option"=>$name, + "value"=>$value); + ejabberd_xmlrpc_command('muc_room_change_option', $param); + } + function addMember($member) { + //"outcast" | "none" | "member" | "admin" | "owner" + $group = $this->group; + if ($member->guid === $group->owner_guid) + $affiliation = "owner"; + elseif ($group->canEdit($member->guid)) + $affiliation = "admin"; + else + $affiliation = "member"; + $this->setAffiliation($member, $affiliation); + } + + function setAffiliation($member, $affiliation) { + $group = $this->group; + $param = array("name" => elgg_get_friendly_title($group->name), + "service" => elgg_get_plugin_setting("groupdomain", "beechat"), + "jid" => xmpp_escape($member->username) . '@' . elgg_get_plugin_setting("domain", "beechat"), + "affiliation" => $affiliation); + ejabberd_xmlrpc_command('muc_room_set_affiliation', $param); + //echo "set affiliation ".$member->username."<br/>"; + } +} + +function ejabberd_create_group($group) +{ + //echo "creating " . $group->name . "<br/>"; + // create room + $param=array("name"=>elgg_get_friendly_title($group->name), + "service"=>elgg_get_plugin_setting("groupdomain", "beechat"), + "server"=>elgg_get_plugin_setting("domain", "beechat")); + ejabberd_xmlrpc_command('create_muc_room', $param); + + // persistency + + $room = new EjabberdMucRoom($group); + $room->setOption("persistent", true); + $room->setOption("title", $group->name); + // open to public? + if ($group->isPublicMembership()) { + $room->setOption("members_only", false); + } + else + $room->setOption("members_only", true); + + if ($group->access_id === ACCESS_PUBLIC) { + $room->setOption("public_list", true); + $room->setOption("public", true); + } + else { + $room->setOption("public_list", false); + $room->setOption("public", false); + } + $members = $group->getMembers(0); + foreach($members as $member) { + $room->addMember($member); + } + $room->addMember(get_entity($group->owner_guid)); +} + +function ejabberd_destroy_group($group) +{ + $param=array("name"=>elgg_get_friendly_title($group->name), + "service"=>elgg_get_plugin_setting("groupdomain", "beechat"), + "server"=>elgg_get_plugin_setting("domain", "beechat")); + ejabberd_xmlrpc_command('delete_muc_room', $param); +} + +function ejabberd_getjid($user, $do_external=false) +{ + if ($user->foreign || ($do_external && $user->alias && get_plugin_usersetting("usealias", $user->guid,"openid_client"))) { + if ($user->foreign) + $webid = $user->webid; + else + $webid = $user->alias; + if (strpos($webid, 'http') === 0) { + // http or https addresses + $hostparts = parse_url($webid); + $urlparts = explode('/', $webid); + $host = $hostparts['host']; + $username = $urlparts[count($urlparts)-1]; + } else { + if (strpos($webid, ':') > 0) { + $webidparts = explode(':', $webid); + $hostparts = explode('@',$webidparts[1]); + } else { + $hostparts = explode('@',$webid); + } + $username = $hostparts[0]; + $host = $hostparts[1]; + } + } + else { + $username = $user->username; + $host = elgg_get_plugin_setting("domain", "beechat"); + } + return xmpp_escape($username) . '@' . $host; +} + +function ejabberd_friend_command($user, $friend, $command, $is_out) // $user adds $friend +{ + error_log(" * ".$friend->username."->".ejabberd_getjid($user)." ".$command); + if ($friend->foreign) { + error_log(" * beechat: friend is foreign!"); + return; + } + $param = array("user" => elgg_get_friendly_title($friend->username), + "server" => elgg_get_plugin_setting("domain", "beechat"), + "from" => ejabberd_getjid($user), + "subs" => $command); + if ($is_out) { + error_log("out"); + ejabberd_xmlrpc_command('send_roster_request_out', $param); + } + else { + $param['reason'] = 'unknown'; + ejabberd_xmlrpc_command('send_roster_request_in', $param); + } +} + + +function ejabberd_friend_request($user, $friend) // $user adds $friend +{ + error_log('ejabberd_friend_request'); + ejabberd_friend_command($friend, $user, 'subscribe', true); // out:$user : $friend + error_log('ejabberd_friend_requested'); +} +function ejabberd_friend_accept($user, $friend) // $user adds $friend +{ + error_log('ejabberd_friend_accept'); + ejabberd_friend_command($friend, $user, 'subscribed', true); + // following might be needed to have symmetry (and important for remote) + if ($friend->foreign) { + // following is needed for xmpp nodes + ejabberd_friend_command($friend, $user, 'subscribe', true); + } + // ejabberd_friend_command($friend, $user, 'subscribed', false); + // following can't be faked + if (!$friend->foreign) + ejabberd_friend_command($user, $friend, 'subscribed', true); + error_log('ejabberd_friend_accepted'); +} +function ejabberd_friend_deny($user, $friend) // $user adds $friend +{ + error_log('ejabberd_friedeny'); + ejabberd_friend_command($friend, $user, 'unsubscribed', true); +} +function ejabberd_friend_remove($user, $friend) // $user adds $friend +{ + error_log('ejabberd_friend_remove'); + if ($friend->foreign) { + ejabberd_friend_command($friend, $user, 'unsubscribed', true); + ejabberd_friend_command($friend, $user, 'unsubscribed', false); + } + else + ejabberd_friend_command($friend, $user, 'unsubscribed', false); + if (!$friend->foreign) + ejabberd_friend_command($user, $friend, 'unsubscribed', false); + error_log('ejabberd_friend_removed'); +} + +/*function ejabberd_send_chat($from, $to, $body) { // $user adds $friend + $param = array("body"=>$body, + "from"=>$from, + "to"=>$to); + ejabberd_xmlrpc_command('send_chat_message', $param); +}*/ + + +?> |