Move user to OU in Google Apps with PHP

Omdat het nog niet mogelijk is om met Zend_Gdata gebruikers in Organisation Units te plaatsen heb ik zelf snel een script geschreven. Snel, dus het script is niet schitterend, maar het doet wel zijn ding. Omdat anderen het ook kunnen gebruiken deel ik het met de wereld.

<?php
/**
 * Move a user to an Organisation Unit.
 * @author Koen De Vreeze
 * Tested on 2011-08-07 on Debian 5 with php 5.3.6
 * Google environment: Google Apps for Education.
 */
// Initialize
error_reporting(E_ALL);
ini_set("display_errors""1");
ini_set("max_execution_time""0");
ini_set("max_input_time""0");
set_time_limit(0);
date_default_timezone_set('Europe/Brussels');

// Config

$domain 'domain.tld';
$domainadmin 'userwithpriveleges';
$domainadminpwd 'secret';

// end Config
GoogleApps::$domain $domain;
GoogleApps::retrieveAuthToken("$domainadmin@$domain"$domainadminpwd);
GoogleApps::retrieveCustomerId();

// do your magic
echo GoogleApps::moveUsersToOrganizationUnit('username@domain.tld''myOU');

class 
GoogleApps
{
    private static 
$last_error '';
    public static 
$authToken;
    public static 
$customerId;
    public static 
$domain;
    
/**
     * Get authToken for user.
     * This should be a domain admin.
     */
    
static function retrieveAuthToken($email$passwd)
    {
        
$email urlencode($email);
        
$passwd urlencode($passwd);
        
$post_data "Email=$email&Passwd=$passwd&accountType=HOSTED&service=apps";

        
// create curl resource 
        
$ch curl_init(); 

        
// set url 
        
curl_setopt($chCURLOPT_URL"https://www.google.com/accounts/ClientLogin"); 
        
curl_setopt($chCURLOPT_PORT443);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_POSTFIELDS$post_data);
        
curl_setopt($chCURLINFO_CONTENT_LENGTH_UPLOADstrlen($post_data));
        
curl_setopt($chCURLINFO_CONTENT_TYPE"application/x-www-form-urlencoded");
        
//return the transfer as a string 
        
curl_setopt($chCURLOPT_RETURNTRANSFER1); 

        
$token curl_exec($ch); 

        
// close curl resource to free up system resources 
        
curl_close($ch);
        
        
// Extract authToken
        
$pattern '/Auth=(.*)/';
        
preg_match($pattern$token$matches);
        
$auth substr($matches[0], 5);
        
self::$authToken $auth;
        return 
$auth;
    } 
// end retrieveAuthToken()
    
    
static function retrieveCustomerId()
    {
        
$response self::send('GET''/a/feeds/customer/2.0/customerId');
        
$body '';
        if ((
$pos strpos($response"<")) !== false) { 
            
$body substr($response$pos); 
        }
        
$responseXML = new SimpleXMLElement($body);
        
        
$customerIdXML $responseXML->xpath('//apps:property[@name="customerId"]/@value');
        
        
//echo $customerIdXML[0]->value;
        
self::$customerId $customerIdXML[0]->value;
    }
    
/**
     * Send a Message to the Google mail servers.
     */
    
static function send($method$uri$httpbody='')
    {
        
$authToken self::$authToken;
        
        
$fp fsockopen("ssl://apps-apis.google.com"443$errno$errstr30);
        
        if (!
$fp) {
            echo 
"$errstr ($errno)\n";
        } else {
            
//$out = $method . " /a/feeds/orgunit/2.0/" . User::$domain . "/{$msg->user->name}/mail\r\n";
            
$out $method ' ' $uri " HTTP/1.1\r\n";
            
$out .= "Host: apps-apis.google.com\r\n";
            
$out .= 'Content-Type: application/atom+xml'."\r\n";
            
$out .= "Authorization: GoogleLogin auth=$authToken\r\n";
            
$out .= "Content-length: " strlen($httpbody) . "\r\n";
            
$out .= "Connection: Close\r\n\r\n";
            
$out .= $httpbody;

            
fwrite($fp$out);
            
            
$response '';
            while (!
feof($fp)) {
                
$response .= fgets($fp128);
            }
                
            
fclose($fp);
            return 
$response;
        }
    } 
// end send()
    /**
     *
     * @param $users liz@example.com, namrata@example.com, jake@example.com
     * @param $newOU new
     * @param $parentOU first/second
     */
    
static function moveUsersToOrganizationUnit($users$newOU$parentOU='')
    {
        
$url 'https://apps-apis.google.com/a/feeds/orgunit/2.0/' self::$customerId '/' . ($parentOU == '' '' $parentOU '/') . $newOU;
        
$body "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>\r\n";
        
$body .= '    <apps:property name="name" value="' $newOU '" />' "\r\n";
        
$body .= '    <apps:property name="description" value="" />' "\r\n";
        
$body .= '    <apps:property name="parentOrgUnitPath" value="' . ($parentOU == '' '/' $parentOU) . '" />' "\r\n";
        
$body .= '    <apps:property name="blockInheritance" value="false" />' "\r\n";
        
$body .= '    <apps:property name="usersToMove" value="' $users '" />' "\r\n";
        
$body .= '</atom:entry>' "\r\n";
        
        return 
self::send('PUT'$url $body);
    }
    
}

Gepost: 2011-08-07 21u14


Gelijkaardige posts


Reacties

Er werd nog niet gereageerd.

Plaats een reactie

*Velden verplicht in te vullen.
E-mail wordt niet gepubliceerd.
Uw reactie wordt pas zichtbaar als deze goedgekeurd wordt door de eigenaar van deze blog.
Wanneer u een reactie plaatst, wordt er een cookie opgeslagen.