source: companies/serpro/instant_messenger/inc/class.Ujabber.inc.php @ 903

Revision 903, 16.3 KB checked in by niltonneto, 15 years ago (diff)

Importacao inicial do Expresso do Serpro

Line 
1<?php
2
3class Ujabber
4{
5        /*
6         * Listen
7         */
8         
9        final function listen()
10        {
11                $return = null;
12
13                if($_SESSION['phpgw_info']['instant_messenger']['IM_disconnect'])
14                {
15                        $_SESSION['phpgw_info']['instant_messenger']['IM_disconnect'] = false;
16                        return "disconnected";
17                }
18
19                $_SESSION['phpgw_info']['instant_messenger']['timeClient'] = time();
20                $_SESSION['phpgw_info']['instant_messenger']['socket']['block'] = true;
21                $xml = $_SESSION['phpgw_info']['instant_messenger']['socket']['in'];
22                //str_replace inserido por problemas com clientes que inserem
23                //quebra de linha no XML descomentar e retirar a seguinte para
24                //voltar ao padrão assim que possível
25                //24/10/2007 - problema verificado por usuários do SERPRO na
26                //plataforma Windows ocorrendo também no cliente Linux
27                //por Alexandre e Rodrigo
28                $xml = str_replace("\n","",$xml);
29                $xml = str_replace("\r","",$xml);
30
31                unset($_SESSION['phpgw_info']['instant_messenger']['socket']['in']);
32                $_SESSION['phpgw_info']['instant_messenger']['socket']['block'] = false;
33
34                ### Arranjo Tecnico ###
35                $vkrd = $xml;
36
37                if(isset($_SESSION['phpgw_info']['instant_messenger']['contacts']))
38                unset($_SESSION['phpgw_info']['instant_messenger']['contacts']);
39
40                ### - messages - ###
41                //Linha abaixo dentro do padrão xmpp, entretanto clientes como
42                //o PSI não seguem o padrão assim ocorre problemas de comunicação
43                //descomentar e retirar a seguinte para voltar ao padrão assim
44                //que possível
45                //24/10/2007 - problema verificado por usuários do SERPRO na
46                //plataforma Windows ocorrendo também no cliente Linux
47                //por Alexandre e Rodrigo
48                //$_messages = "/<message[^>]+from='(\S+)'[^>]*>(?(?=.*?<composing |.*?<paused ).*?<(composing|paused) )(?(?=.*?<html).*?<html[^>]*><body[^>]*>(.*?)<\/body><\/html>).*?<\/message>/s";
49                //retirar a linha abaixo para voltar ao padrão conforme acima
50                $_messages = "/<message[^>]+from='(\S+)'[^>]*>(?(?=.*?<composing |.*?<paused ).*?<(composing|paused) )(?(?=.*?<body).*?<body[^>]*>(.*?)<\/body>).*?<\/message>/s";
51                $_messages = preg_match_all($_messages, $xml, $messages);
52                if ( $_messages !== false && $_messages > 0 )
53                {
54                        $xml = preg_replace("/<message.*?<\/message>/", "", $xml);
55                        $return .= $this->getMessages($messages);
56                }
57                ### - Fim messages - ###
58
59                ### - contacts - ###
60                $_contacts = "/<iq[^>]+id='contacts'[^>]*>.*?<\/iq>/";
61                $_contacts = preg_match_all($_contacts, $xml, $_xml);
62
63                $_contacts = "/<item.*?(?(?=[^>]+name)[^>]+name='(.*?)')[^>]+subscription='(.*?)'[^>]+jid='(.*?)'";
64                $_contacts .= "(?(?=[^>]*\/>)[^>]*\/>|[^>]*><group>(.*?)<\/group><\/item>)/";
65                $_contacts = preg_match_all($_contacts, $_xml[0][0], $contacts);
66                if ( $_contacts !== false && $_contacts > 0 )
67                {
68                        $xml = preg_replace("/<iq[^>]+id='contacts'[^>]*>.*?<\/iq>/", "", $xml);
69                        $return .= rawurldecode(urldecode($this->getContacts($contacts)));
70                }
71                ### - Fim contacts - ###
72
73                ### - presence - ###
74                $xml = $_SESSION['phpgw_info']['instant_messenger']['presences'] . $xml;
75
76                $_presence  = "/<presence(?(?=[^>]+\/>)[^>]+\/>|[^>]+>.*?<\/presence>)/";
77                $_presence = preg_match_all($_presence, $xml, $presence);
78
79                $patterns[0] = '/<priority>[^<]*<\/priority>|<(\S) (?(?=[^>]*\/>)[^>]*\/>|[^>]*>.*?<\/\1>)/';
80                $patterns[1] = '/ xmlns=\'.*?\'| to=\'.*?\'/';
81                $patterns[2] = '/> +</';
82                $replacements[0] = '';
83                $replacements[1] = '';
84                $replacements[2] = '><';
85                $_xml = preg_replace($patterns, $replacements, implode('', $presence[0]));
86
87                $_presence  = "/<presence[^>]+from='(\S+)'[^>]*type='(unavailable)'(?(?=[^>]*\/>)[^>]*\/>|[^>]*>.*?<\/presence>)|";
88                $_presence .= "<presence[^>]+from='(\S+)'(?(?=[^>]+type)[^>]+type='(\S+)')[^>]*";
89                $_presence .= "(?(?=\/>)\/>|>";
90                $_presence .= "(?(?=<s[^>]*?>)<s[^>]*?>(.*?)<\/s[^>]*?>(?(?=<s[^>]*?>)<s[^>]*?>(.*?)<\/s[^>]*?>))";
91                $_presence .= "<\/presence>)/";
92                $_presence = preg_match_all($_presence, $_xml, $presence);
93                if ( $_presence !== false && $_presence > 0 )
94                {
95                        foreach ( $presence[5] as $key => $val )
96                        {
97                                if ( !empty($presence[1][$key]) && (strpos($presence[1][$key], '/') !== false) )
98                                $presence[1][$key] = substr($presence[1][$key], 0, strpos($presence[1][$key], '/'));
99
100                                if ( !empty($presence[3][$key]) && strpos($presence[3][$key], '/') !== false )
101                                $presence[3][$key] = substr($presence[3][$key], 0, strpos($presence[3][$key], '/'));
102                                 
103                                if ( !empty($val) && !preg_match("/^(away|chat|dnd|xa)$/", $val) )
104                                if ( preg_match("/^(away|chat|dnd|xa)$/", $presence[6][$key]) )
105                                {
106                                        $aux = $presence[5][$key];
107                                        $presence[5][$key] = $presence[6][$key];
108                                        $presence[6][$key] = $aux;
109                                }
110                                else
111                                {
112                                        if ( empty($presence[6][$key]) )
113                                        $presence[6][$key] = $presence[5][$key];
114                                        $presence[5][$key] = '';
115                                }
116                        }
117                        $xml = preg_replace("/<presence[^>]\/?>|<presence[^>]>.*?<\/presence>/", "", $xml);
118
119                        $return .= $this->getPresence($presence);
120                }
121                ### - Fim presence - ###
122
123
124                ### - vcard - ###
125                ### - Arranjo Tecnico - ###
126                $_xml = $vkrd;
127                $_vcard = "/<iq.*? id='(.*?)' .*?(<vCard [^>]+\/>|<vCard.*?<\/vCard>)<\/iq>/";
128                $_vcard = preg_match_all($_vcard, $_xml, $vcard);
129                if( $_vcard !== false && $_vcard > 0)
130                {
131                        $xml = preg_replace("/<iq.*?<vCard.*?<\/iq>/", "", $xml);
132                        $return .= urldecode($this->getVcard($vcard));
133                }
134                ### - Fim vcard - ###
135                ## Final do Listen;
136
137                return $return;
138        }
139         
140        function reconnect()
141        {
142                require_once("IMConfigure.php");
143
144                $_transport = TRANSPORT_NON_SECURITY;
145                $_port = PORT_NON_SECURITY;
146
147                $SERVER = "127.0.0.1";
148
149                $fp  = "";
150                @$fp = stream_socket_client($_transport . "://" . $SERVER . ":" . $_port, $errno, $errstr, 10);
151
152                if ( $fp )
153                {
154                        fwrite($fp, "GET /" . CONNECT . ";" . session_id() . " HTTP/1.1\r\nHost: " . $SERVER . ":" . $_port . "\r\nAccept: */*\r\n\r\n");
155                        return 'true';
156                }
157                else
158                return 'false';
159        }
160         
161        /*
162         * Contacts
163         */
164
165        function getContacts(array $pContacts)
166        {
167                $_group = array();
168                $return = NULL;
169                $jid = array_unique($pContacts[3]);
170
171                foreach ( $jid as $key => $val )
172                {
173                        $_SESSION['phpgw_info']['instant_messenger']['contacts'][] = $val;
174
175                        $item  = NULL;
176                        $item .= '<item name="' . (( !empty($pContacts[1][$key]) ) ? $pContacts[1][$key] : $val);
177                        $item .= '" jid="' . $val;
178                        $item .= '" subscription="' . $pContacts[2][$key];
179                        $item .= '" />';
180
181                        $_group[utf8_decode(strtolower(!empty($pContacts[4][$key]) ? $pContacts[4][$key] : 'default'))][] = $item;
182                }
183
184                ksort($_group);
185
186                foreach ( $_group as $key => $val )
187                $return .= '<group name="' . $key . '">' . implode('', $val) . '</group>';
188
189                return '<contacts>' . $return . '</contacts>';
190        }
191
192        function requireContacts()
193        {
194                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['getContacts'] = NULL;
195        }
196         
197        /*
198         * Presence
199         */
200
201        function setPresence($pPresence)
202        {
203                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['setPresence'] = $pPresence;
204                foreach($pPresence as $key=>$presence)
205                if($key == 'show' || $key == 'type')
206                {
207                        $_SESSION['phpgw_info']['instant_messenger']['MyPresence'] = $presence;
208                }
209        }
210         
211        function MyPresence()
212        {
213                if(isset($_SESSION['phpgw_info']['instant_messenger']['MyPresence']))
214                return $_SESSION['phpgw_info']['instant_messenger']['MyPresence'];
215        }
216         
217        function getPresence(array $pPresence)
218        {
219                $offline = array();
220                foreach ( $pPresence[1] as $key => $val )
221                {
222                        if ( empty($val) )
223                        continue;
224
225                        $_offline = true;
226                        for ( $i = $key; $i < sizeof($pPresence[1]); $i++ )
227                        if ( $pPresence[1][$key] == $pPresence[3][$i] || $pPresence[1][$key] == $pPresence[5][$i] )
228                        $_offline = false;
229
230                        if ( $_offline )
231                        $offline[$key] = $val;
232                }
233
234                $online = array();
235                foreach ( $pPresence[3] as $key => $val )
236                {
237                        if ( empty($val) )
238                        continue;
239
240                        $_online = true;
241                        for ( $i = ($key + 1); $i < sizeof($pPresence[3]); $i++ )
242                        if ( in_array($val, $offline) || $pPresence[3][$key] == $pPresence[3][$i] )
243                        $_online = false;
244
245                        if ( $_online )
246                        $online[$key] = $val;
247                }
248
249                $return = NULL;
250
251                foreach ( $offline as $key => $val )
252                {
253                        $val = ( strpos($val, '/') ) ? substr($val, 0, strpos($val, '/')) : $val;
254                        $return .= "<presence from='" . $val . "' type='unavailable' />";
255                }
256
257                foreach ( $online as $key => $val )
258                {
259                        $val = ( strpos($val, '/') ) ? substr($val, 0, strpos($val, '/')) : $val;
260
261                        if ( empty($pPresence[4][$key]) )
262                        $pPresence[4][$key] = ( empty($pPresence[5][$key]) ) ?
263               'available' : $pPresence[5][$key];
264
265                        $return .= "<presence from='" . $val . "' type='" . $pPresence[4][$key];
266                        if ( empty($pPresence[6][$key]) )
267                        $return .= "' />";
268                        else
269                        $return .= "'>" . $pPresence[6][$key] . "</presence>";
270
271                        if ( strpos($pPresence[4][$key], 'subscribe') === false )
272                        {
273                                $session .= "<presence from='" . $val . "'><show>" . $pPresence[4][$key] . "</show>";
274                                if ( !empty($pPresence[6][$key]) )
275                                $session .= "<status>" . $pPresence[6][$key] . "</status>";
276                                $session .= "</presence>";
277                        }
278                }
279
280                $_SESSION['phpgw_info']['instant_messenger']['presences'] = $session;
281
282                return $return;
283        }
284
285        /*
286         * GetMessage
287         */
288         
289        function getMessages(array $pMessages)
290        {
291                $_messages = array();
292                $return = NULL;
293
294                foreach ( $pMessages[1] as $key => $val )
295                {
296                        trim($pMessages[3][$key]);
297                        if ( !empty($pMessages[3][$key]) )
298                        $_messages[$val][] = $pMessages[3][$key];
299
300                        if ( !empty($pMessages[2][$key]) )
301                        {
302                                $return .= '<' . $pMessages[2][$key] . ' from="';
303                                $return .= ( strpos($val, '/') ) ? substr($val, 0, strpos($val, '/')) : $val;
304                                $return .= '" />';
305                        }
306                }
307
308                foreach ( $_messages as $key => $val )
309                {
310                        $return .= '<messages from="' . $key . '">';
311                        foreach ( $val as $msg )
312                        $return .= '<message>' . $msg . '</message>';
313                        $return .= '</messages>';
314                }
315
316                return $return;
317        }
318
319        /*
320         * SendMessage
321         */
322
323        function SendMessage($pSendMessage)
324        {
325                $pSendMessage['body'] = stripslashes($pSendMessage['body']);
326                $_emotions  = '/<img emotion="(\S+)?"[^>]+>/';
327                $_emotions = preg_match_all($_emotions, $pSendMessage['body'], $emotions);
328
329                foreach ( $emotions[0] as $key => $val )
330                $emotions[0][$key] = '/' . addcslashes($val, './()[]{}^$*&?') . '/i';
331
332                $pSendMessage['body'] = preg_replace($emotions[0], $emotions[1], $pSendMessage['body']);
333
334                $to = $pSendMessage['to'];
335                $type = "chat";
336                $id = "";
337                $content = array(
338         "subject" => $pSendMessage['subject'] ? $pSendMessage['subject'] : "",
339         "thread" => $pSendMessage['thread'] ? $pSendMessage['thread'] : "",
340         "body" => $pSendMessage['body'] ? $pSendMessage['body'] : ""
341         );
342
343         $payload = "";
344
345         if ($to && is_array($content))
346         {
347                if (!$id)
348                {
349                        $id = $type . "_" . time();
350                }
351
352                $xml = "<message to='$to' type='$type' id='$id'>";
353
354                if ($content['subject'])
355                {
356                        $xml .= "<subject>" . $content['subject'] . "</subject>";
357                }
358
359                if ($content['thread'])
360                {
361                        $xml .= "<thread>" . $content['thread'] . "</thread>";
362                }
363
364                //Linha abaixo dentro do padrão xmpp, entretanto clientes como
365                //o PSI não seguem o padrão assim ocorre problemas de comunicação
366                //descomentar e retirar a seguinte para voltar ao padrão assim
367                //que possível
368                //24/10/2007 - problema verificado por usuários do SERPRO na
369                //plataforma Windows ocorrendo também no cliente Linux
370                //por Alexandre e Rodrigo
371                //$xml .= "<html><body>" . $content['body'] . "</body></html>";
372                //retirar a linha abaixo para voltar ao padrão conforme acima
373                $xml .= "<body>" . $content['body'] . "</body>";
374                $xml .= $payload;
375                $xml .= "</message>";
376                unset($id);
377
378                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['message'] .= $xml;
379         }
380         else
381         {
382                $this->writeLog("ERROR: SendMessage() #2");
383                return FALSE;
384         }
385        }
386
387        /*
388         * Composing / Paused Message
389         */
390
391        function composingMessage($pComposing)
392        {
393
394                $xml  = "<message xmlns='jabber:client' to='".$pComposing['to']."' id='".time()."' type='chat'>";
395                $xml .= "<x xmlns='jabber:x:event'>";
396                $xml .= "<composing/>";
397                $xml .= "</x>";
398                $xml .= "<composing xmlns='http://jabber.org/protocol/chatstates'/>";
399                $xml .= "</message>";
400                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['message'] .= $xml;
401        }
402         
403        function pausedMessage($pComposing)
404        {
405                $xml  = "<message xmlns='jabber:client' to='".$pComposing['to']."' id='".time()."' type='chat'>";
406                $xml .= "<x xmlns='jabber:x:event'/>";
407                $xml .= "<paused xmlns='http://jabber.org/protocol/chatstates'/>";
408                $xml .= "</message>";
409
410                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['message'] .= $xml;
411        }
412         
413        /*
414         * UpdateContact
415         */
416         
417        function updateContact($pUser)
418        {
419                $jid   = $pUser['jid'];
420                $name  = $pUser['name'];
421                $group = $pUser['group'];
422
423                if ( $jid )
424                {
425                        $updatecontact  = "<item jid='$jid'";
426                        $updatecontact .= " name='" . $name . "'";
427                        $updatecontact .= "><group>" . $group . "</group></item>";
428                        $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['updateContact'] = $updatecontact;
429                }
430                $this->requireContacts();
431        }
432         
433        /*
434         * AddContact
435         */
436         
437        function addContacts($pUser)
438        {
439                $jid = explode("@",$pUser['email']);
440                $pJid = $jid[0]."@".$_SESSION['phpgw_info']['instant_messenger']['name_jabber'];
441                $pName = $pUser['name'];
442                $pGroup = $pUser['group'];
443
444                if(trim($jid[0]) != trim($this->username))
445                {
446                        if ( $pJid )
447                        {
448                                $newcontact  = "<item jid='$pJid'";
449                                $newcontact .= " name='" . $pName . "'";
450                                $newcontact .= "><group>" . $pGroup . "</group></item>";
451                                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['addContacts'] = $newcontact;
452                                $this->subscribe($pJid);
453                                $this->requireContacts();
454                        }
455                }
456        }
457         
458        /*
459         * RemoveContact
460         */
461
462        function removeContact($pUser)
463        {
464                $pJid = $pUser['jid'];
465                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['removeContact'] = $pJid;
466                $this->unsubscribed($pJid);
467                $this->requireContacts();
468        }
469
470        /*
471         * Vcard
472         */
473
474        function newVcard($pVcardUser)
475        {
476                $pVcard = explode("_vkrd_", $pVcardUser['vcard']);
477
478                $xmlVcard  = "<FN>".$pVcard[0]."</FN>";
479                $xmlVcard .= "<NICKNAME>".$pVcard[1]."</NICKNAME>";
480                $xmlVcard .= "<ORG>";
481                $xmlVcard .= "<ORGNAME>".$pVcard[2]."</ORGNAME>";
482                $xmlVcard .= "<ORGUNIT>".$pVcard[3]."</ORGUNIT>";
483                $xmlVcard .= "</ORG>";
484                $xmlVcard .= "<ROLE>".$pVcard[4]."</ROLE>";
485                $xmlVcard .= "<BDAY>".$pVcard[5]."</BDAY>";
486                $xmlVcard .= "<DESC>".$pVcard[6]."</DESC>";
487
488                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['newVcard'] = $xmlVcard;
489
490        }
491         
492        function getVcard(array $Vcard)
493        {
494                $div = "";
495                $_expr = "/<[^<vCard xmlns=\'vcard\-temp\'>].*[^<\/vCard>]>/";
496                array_shift($Vcard);
497                $div = '<vcard>';
498                $jid_user = $_SESSION['phpgw_info']['instant_messenger']['user'];
499                $jid_user .= "@" . $_SESSION['phpgw_info']['instant_messenger']['name_jabber'];
500                for($i = 0 ; $i < count($Vcard[0]) ; $i++)
501                {
502                        preg_match($_expr,$Vcard[1][$i],$div_vcard);
503                        $div_new[] = $div_vcard;
504
505                        if ( $jid_user == $Vcard[0][$i] )
506                        $_SESSION['phpgw_info']['instant_messenger']['vcard'] = $div_new[$i][0];
507                         
508                        $div .= '<div id="vcard_'.$Vcard[0][$i].'">'.urldecode($div_new[$i][0]).'</div>';
509                }
510                $div .= '</vcard>';
511                 
512                return $div;
513        }
514         
515        function Vcard()
516        {
517                $contacts = array();
518                $contacts = $_SESSION['phpgw_info']['instant_messenger']['contacts'];
519                $jid_user = $this->getJid();
520
521                if( count($contacts) > 0 )
522                {
523                        array_unshift($contacts,$jid_user);
524
525                        foreach($contacts as $user)
526                        $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['vcard'][] = $user;
527                        return "true";
528                }else{
529                        return "false";
530                }
531        }
532         
533        function VcardUser()
534        {
535                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['vcard'][] = $this->getJid();;
536        }
537         
538        function getJid()
539        {
540                $jid = $_SESSION['phpgw_info']['instant_messenger']['user'] . "@" . $_SESSION['phpgw_info']['instant_messenger']['name_jabber'];
541                return $jid;
542        }
543         
544        function subscribe($pJid)
545        {
546                $jid = (is_array($pJid)) ? $pJid['jid'] : $pJid ;
547                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['Subscribe'] = $jid;
548        }
549         
550        function subscribed($pJid)
551        {
552                $jid = (is_array($pJid)) ? $pJid['jid'] : $pJid ;
553                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['SubscriptionAcceptRequest'] = $jid;
554        }
555         
556        function unsubscribe($pJid)
557        {
558                $jid = (is_array($pJid)) ? $pJid['jid'] : $pJid ;
559                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['Unsubscribe'] = $jid;
560        }
561         
562        function unsubscribed($pJid)
563        {
564                $jid = (is_array($pJid)) ? $pJid['jid'] : $pJid ;
565                $_SESSION['phpgw_info']['instant_messenger']['socket']['out']['SubscriptionDenyRequest'] = $jid;
566        }
567}
568?>
Note: See TracBrowser for help on using the repository browser.