예제 #1
0
 static function google_sync_contacts($user)
 {
     $rcmail = rcmail::get_instance();
     $client = google_func::get_client();
     $auth_res = google_func::google_authenticate($client, $user);
     if (!$auth_res['success']) {
         return $auth_res;
     }
     $feed = 'https://www.google.com/m8/feeds/groups/default/full' . '?v=3.0';
     $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed));
     if ($val->getResponseHttpCode() == 401) {
         return array('success' => false, 'message' => "Authentication failed.");
     } else {
         if ($val->getResponseHttpCode() == 403) {
             return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook'));
         } else {
             if ($val->getResponseHttpCode() != 200) {
                 return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook'));
             }
         }
     }
     $xml = xml_utils::xmlstr_to_array($val->getResponseBody());
     $gid = $xml['entry'][0]['id'][0]['@text'];
     $feed = 'https://www.google.com/m8/feeds/contacts/default/full' . '?max-results=9999' . '&v=3.0' . '&group=' . urlencode($gid);
     $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed));
     if ($val->getResponseHttpCode() == 401) {
         return array('success' => false, 'message' => "Authentication failed.");
     } else {
         if ($val->getResponseHttpCode() == 403) {
             return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook'));
         } else {
             if ($val->getResponseHttpCode() != 200) {
                 return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook'));
             }
         }
     }
     $xml = xml_utils::xmlstr_to_array($val->getResponseBody());
     $backend = new google_addressbook_backend($rcmail->get_dbh(), $user->ID);
     $backend->delete_all();
     $num_entries = 0;
     foreach ($xml['entry'] as $entry) {
         //write_log('google_addressbook', 'getting contact: '.$entry['title'][0]['@text']);
         $record = array();
         $name = $entry['gd:name'][0];
         $record['name'] = trim($name['gd:fullName'][0]['@text']);
         $record['firstname'] = trim($name['gd:givenName'][0]['@text']);
         $record['surname'] = trim($name['gd:familyName'][0]['@text']);
         $record['middlename'] = trim($name['gd:additionalName'][0]['@text']);
         $record['prefix'] = $name['gd:namePrefix'][0]['@text'];
         $record['suffix'] = $name['gd:nameSuffix'][0]['@text'];
         if (empty($record['name'])) {
             $record['name'] = $entry['title'][0]['@text'];
         }
         if (empty($record['name']) && empty($record['firstname']) && empty($record['surname']) && empty($record['middlename']) && !array_key_exists('gd:email', $entry)) {
             continue;
         }
         if (array_key_exists('gd:email', $entry)) {
             foreach ($entry['gd:email'] as $email) {
                 list($rel, $type) = explode('#', $email['@attributes']['rel'], 2);
                 $type = empty($type) ? '' : ':' . $type;
                 $record['email' . $type][] = $email['@attributes']['address'];
             }
         }
         if (array_key_exists('gd:phoneNumber', $entry)) {
             foreach ($entry['gd:phoneNumber'] as $phone) {
                 list($rel, $type) = explode('#', $phone['@attributes']['rel'], 2);
                 $type = empty($type) ? '' : ':' . $type;
                 $record['phone' . $type][] = $phone['@text'];
             }
         }
         if (array_key_exists('link', $entry)) {
             foreach ($entry['link'] as $link) {
                 $rel = $link['@attributes']['rel'];
                 $href = $link['@attributes']['href'];
                 if ($rel == 'http://schemas.google.com/contacts/2008/rel#photo') {
                     // etag is only set if image is available
                     if (isset($link['@attributes']['etag'])) {
                         $resp = $client->getAuth()->authenticatedRequest(new Google_Http_Request($href));
                         if ($resp->getResponseHttpCode() == 200) {
                             $record['photo'] = $resp->getResponseBody();
                         }
                     }
                     break;
                 }
             }
         }
         $num_entries++;
         $backend->insert($record, false);
     }
     return array('success' => true, 'message' => $num_entries . $rcmail->gettext('contactsfound', 'google_addressbook'));
 }
 function sync_contacts()
 {
     $rcmail = rcmail::get_instance();
     $_SESSION['google_addressbook_synced'] = true;
     $res = google_func::google_sync_contacts($rcmail->user);
     $rcmail->output->show_message($res['message'], $res['success'] ? 'confirmation' : 'error');
 }