scaldfeen
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Скорее всего надо править LDAP-фильтр ldap.searchFilter в системных настройках openfire, т.к. обычно он ищет только пользователей, а не контакты. Как грамотно составить такой запрос - не подскажу, но думаю что не очень сложно. | Не поможет. Т.к. Пользователи имеют JIDы вида username@foo, а бродкаст имеет JID all@broadcast.foo, т.е. он как бы даже на другом сервере. Цитата: Openfire 3.7.1 + AD. Возникла необходимость в плагине "Broadcast". Теперь не знаю как добавить контакт типа all@broadcast.foo в shared roster ldap для того чтоб все пользователи могли пользоваться. | Я решил проблему с помощью бота. Бот, с JID all@foo (создается в AD такой пользователь), получает сообщения и отправляет их на all@broadcast.foo. Таким образом создал несколько ботов для различных групп ростера. Единственный нюанс такой схемы работы - ответы на бродкаст сообщения так же являются бродкастами. Для быстроты проверки самого принципа работы, набросал бота на том языке, какой знаю. По свободе надо переписать бот на языке, более приспособленном для работы как сервис или демон. код для примера и проверки работы: Код: <?php set_time_limit(0); error_reporting(E_ALL & E_STRICT); include 'XMPPHP/XMPP.php'; function Get_User_Name ($id){ $username="all@foo"; // username $password="PASSWORD!!!"; // password $ad = ldap_connect('ldap://192.168.0.15'); // ip domain controller if ($ad) { ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ad, LDAP_OPT_REFERRALS, 0); $result = ldap_bind($ad, $username, $password); $returnVal = ($result) ? true : false; $JID=explode('/',$id); $name=explode('@',$JID[0]); $ext=$name[0]; $filter="(&(objectClass=organizationalPerson)(samaccountname=$ext))"; $search=ldap_search($ad,'DC=world, DC=local', $filter, array('displayname')); $entr=ldap_get_entries($ad, $search); $qqq=$entr[0]['displayname'][0]; return $qqq; } else { echo 'НЕУДАЧНОЕ СОЕДИНЕНИЕ С СЕРВЕРОМ<BR/>'; } } while (true){ $conn = new XMPPHP_XMPP('servim.world.local', 5222, 'username', 'password', 'xmpphp', 'gmail.com', $printlog=true, $loglevel=XMPPHP_Log::LEVEL_INFO); $conn->autoSubscribe(); $vcard_request = array(); try { $conn->connect(); while(!$conn->isDisconnected()) { $payloads = $conn->processUntil(array('message', 'presence', 'end_stream', 'session_start', 'vcard' )); foreach($payloads as $event) { $pl = $event[1]; switch($event[0]) { case 'message': if ($pl['from']!='all@world.local/xmpphp'){ if ($pl['body']!=''){ print "--------------------------------------------------------------------------------\n"; print "Message from: {$pl['from']}\n"; if($pl['subject']) print "Subject: {$pl['subject']}\n"; print $pl['body'] . "\n"; $name=@Get_User_Name($pl['from']); $conn->message('all@broadcast.foo', $body="$name:\n {$pl['body']}", $type=$pl['type']); $cmd = explode(' ', $pl['body']); if($cmd[0] == 'quit') $conn->disconnect(); if($cmd[0] == 'break') $conn->send("</end>"); if($cmd[0] == 'vcard') { if(!($cmd[1])) $cmd[1] = $conn->user . '@' . $conn->server; // take a note which user requested which vcard $vcard_request[$pl['from']] = $cmd[1]; // request the vcard $conn->getVCard($cmd[1]); } } } break; case 'session_start': print "Session Start\n"; $conn->getRoster(); $conn->presence($status="Cheese!"); break; } } } } catch(XMPPHP_Exception $e) { die($e->getMessage()); } //$conn->saveSession(); print "</pre>"; sleep(10); } | Использовал эту библиотеку: http://webi.ru/base/files/tovar/jabber_xmpp.zip |