Inicio de sesión en Ubuntu One Oauth desde PHP

8

He buscado en todo Internet tratando de encontrar un ejemplo simple que pueda orientarme en la dirección correcta, pero no tuve suerte, así que aquí vienen mis preguntas:

Quiero iniciar sesión en Ubuntu One y sincronizar (o casi leer) archivos de mi página web, todo hecho con PHP. Las necesidades para llegar a los archivos se describen en esa página: https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/

Puedo completar la primera solicitud con:

$url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%20@%20try1';
$data = curlPetition(array('URL'=>$url,'USERPWD'=>'user:pass'));
$ar = fopen('uOne','w');fwrite($ar,$data['responseBody']);fclose($ar);
$tokenA = json_decode($data['responseBody'],1);

Ok, curlPetition solo hace peticiones básicas de curl. Tenga en cuenta que necesita un usuario válido: pase ubuntu una cuenta. Recibo la respuesta correctamente en json con "consumer_secret", "token", "consumer_key", "name", "token_secret". Incluso la entrada aparece en la lista de las aplicaciones otorgadas por ubuntu.

He instalado la extensión de php OAuth PCL más nueva y está funcionando bien. pero cuando trato de:

    $api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
    $conskey = $tokenA['consumer_key'];
    $conssec = $tokenA['consumer_secret'];
    $token = $tokenA['token'];
    $secret = $tokenA['token_secret'];
    $oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
    $oauth->enableDebug();
    $oauth->enableSSLChecks();
    $oauth->setToken($token,$secret);
    $oauth->fetch($api_url.'~/Ubuntu%20One/');
    print_r($oauth->getLastResponse());

Me trasladan a la página "Transacción de OpenID en progreso" donde pasas cuando haces un inicio de sesión web manual. Definitivamente estoy haciendo algo mal. Traté de obtener el segundo paso de https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ con $ oauth-> fetch, $ oauth-> getAccessToken y $ oauth-> getRequestToken, la misma respuesta en todos con Error 403: S

Estaba tratando de imaginar cómo funciona la carga útil, pero los ejemplos principales están escritos con python, usando "import ubuntuone.couch.auth as auth" que hace que el token sea casi automático.

Me encantaría tener algunas pistas. Gracias

Marcos Fernández Ramos
fuente
1
Intenté todos los ejemplos con PHP, después de obtener los tokens (paso 1), que firmé con el token en sí (paso 2), que están bien, en el paso 3 cuando debería obtener la lista de archivos, el servidor devuelve: Prohibido (403), verificación CSRF ha fallado. Solicitud cancelada. Al buscar en Internet, encontré esto como un informe de error (https://bugs.launchpad.net/ubuntuone-servers/+bug/686697) , pero está marcado como "arreglado", sin embargo para mí todavía no funciona.

Respuestas:

11

Creo que el problema fue que el paso 2 del flujo de trabajo "crear un nuevo token", definido en https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ , estaba fallando con un 503 para usted porque el servicio era abajo en un par de puntos este fin de semana. Tendrá que atrapar esta situación y tratarla (un 503 indica que debe volver a intentar la solicitud más tarde, según HTTP estándar).

He probado el siguiente PHP (cuidado: no soy un hacker de PHP, por lo que podría no ser el código más idiomático) y funciona bien para mí. Pasa por tres pasos:

  1. Cree un nuevo token en Ubuntu SSO (login.ubuntu.com) ( API docs )
  2. Dígale a Ubuntu One sobre ese nuevo token ( documentos de API )
  3. Use ese nuevo token para firmar una solicitud a la API de archivos de Ubuntu One ( API docs )

Verá las partes individuales comentadas a continuación. Recuerde que esto solicita y obtiene un token nuevo; una vez que tenga el token (después del paso 2), guárdelo en algún lugar; no solicite uno nuevo cada vez.

<?php
function curlPetition($arr){
    $curl = curl_init($arr['URL']);
    if($arr['USERPWD']){curl_setopt($curl, CURLOPT_USERPWD, $arr['USERPWD']);}  
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    $out = curl_exec($curl);
    curl_close($curl);
    $data['responseBody'] = $out;
    return $data;
}

/* Define username and password details */
$email_address = '[email protected]';
$password = 'MY PASSWORD';

/* Step 1: Get a new OAuth token from Ubuntu Single-Sign-On */
$url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%20@%20try1';
$data = curlPetition(array('URL'=>$url,'USERPWD'=> $email_address.':'.$password));
$tokenA = json_decode($data['responseBody'],1);

/* Set up that new token for use in OAuth requests */
$conskey = $tokenA['consumer_key'];
$conssec = $tokenA['consumer_secret'];
$token = $tokenA['token'];
$secret = $tokenA['token_secret'];
$oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
$oauth->enableSSLChecks();
$oauth->setToken($token,$secret);

/* Step 2: tell Ubuntu One about the new token (signed with the token itself) */
$tell_u1_about_token_url = 'https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/' . $email_address;
$oauth->fetch($tell_u1_about_token_url);
print_r($oauth->getLastResponse());

/* Step 3: use the token to make a request to the Files API */
$api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
$oauth->fetch($api_url.'~/Ubuntu%20One/');
print_r($oauth->getLastResponse());
?>
sil
fuente
Por cierto, si decides escribir una biblioteca de envoltura PHP para la API de Ubuntu One Files, cuéntamelo y lo vincularé desde la documentación. ¡También me encantaría ver tu sitio web cuando hayas terminado!
sil
Estoy interesado en esto también. Cuando dice "una vez que tenga el token (después del paso 2), guárdelo en algún lugar", ¿el token está relacionado con la aplicación que usa la API o con el usuario? Creo que para el usuario, pero siempre es lo mismo o lo elimina después de cerrar sesión o cuando finaliza la sesión.
Matteo Pagliazzi
El token está más o menos relacionado con ambos. El token es específico del usuario, pero también es un token separado que se ha emitido a su aplicación para su uso con ese usuario. Sigue siendo válido para siempre, pero el usuario puede eliminar ese token (y, por lo tanto, revocar el acceso de su aplicación a Ubuntu One como tal). El token no es para una aplicación, no es una clave API. ¡Su aplicación no debe codificar un token en su fuente!
sil
2

Código de una clase de primer paso para hablar con ubuntuOne

<?php
class ubuntuOne{
    var $curl = array('cookieSrc'=>'cookie.txt','enableCookies'=>false);
    var $auth = array('consumer_key'=>false,'consumer_secret'=>false,'token'=>false,'token_secret'=>false);
    var $oauth = false;
    function ubuntuOne(){

    }
    function u1_getRoot(){
        if($this->oauth === false){return false;}
        $url = 'https://one.ubuntu.com/api/file_storage/v1';
        $this->oauth->fetch($url);
        print_r($this->oauth->getLastResponse());
    }
    function u1_listFolder($path){
        if($this->oauth === false){return false;}
        //FIXME: parse $path
        $url = 'https://one.ubuntu.com/api/file_storage/v1';
        //FIXME: $path debe terminar en '/'
        $url .= str_replace(' ','%20',$path);

        $this->oauth->fetch($url);
        $lr = $this->oauth->getLastResponse();
        if($lr === '{"error": "not found"}'){return false;}
        print_r($this->oauth->getLastResponse());
    }
    function u1_createFolder($name,$path = ''){
        //FIXME: folder exists?
        $url = 'https://one.ubuntu.com/api/file_storage/v1';
        //FIXME: $path debe terminar en '/'
        $url .= str_replace(' ','%20',$path);
        //FIXME: $name no puede contener '/'
        $url .= str_replace(' ','%20',$name);

        $this->oauth->fetch($url,'{"kind":"directory"}',OAUTH_HTTP_METHOD_PUT);
        print_r($this->oauth->getLastResponse());
    }
    function u1_file_exists($path){
        //FIXME: cache?
        $url = 'https://one.ubuntu.com/api/file_storage/v1';
        $url .= str_replace(' ','%20',$path);

        try{$this->oauth->fetch($url);}
        catch(OAuthException $E){if($E->lastResponse === '{"error": "not found"}'){return false;}}
        $i = $this->oauth->getLastResponseInfo();
        if($i['http_code'] === 200){}
        print_r($this->oauth->getLastResponseInfo());
    }
    function requestAuthentification($user,$pass,$name){
        $url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%20@%20'.rawurlencode($name);
        $data = curlPetition(array('URL'=>$url,'USERPWD'=>$user.':'.$pass));
        //FIXME: check the response header -> 200
        $this->auth = json_decode($data['responseBody'],1);
    }
    function registerToken($user){
        $url = 'https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/'.$user;
        $this->oauth->fetch($url);
        $r = $this->oauth->getLastResponse();
        if(substr($r,02) !== 'ok'){
            //FIXME: poner error
        }
        print_r($this->oauth->getLastResponse());
    }
    function saveAuth($fileName){$ar = fopen($fileName,'w');fwrite($ar,json_encode($this->auth));fclose($ar);return true;}
    function loadAuth($fileName){
        if(!file_exists($fileName)){return false;}
        $this->auth = json_decode(file_get_contents($fileName),1);
        if($this->auth === NULL){return false;}
        $this->oauth = new OAuth($this->auth['consumer_key'],$this->auth['consumer_secret'],OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
        $this->oauth->enableDebug();
        $this->oauth->enableSSLChecks();
        $this->oauth->setToken($this->auth['token'],$this->auth['token_secret']);
        return true;
    }
    function curlPetition($arr,$data = array()){
        $curl = curl_init($arr['URL']);
        if(!isset($data['URLTRACK'])){$data['URLTRACK'] = array();}
        $data['URLTRACK'][] = $arr['URL'];

        if(isset($this->curl['userAgent'])){curl_setopt($curl,CURLOPT_USERAGENT,$this->curl['userAgent']);}
        if(count($data['URLTRACK']) > 1){curl_setopt($curl,CURLOPT_REFERER,$data['URLTRACK'][count($data['URLTRACK'])-2]);}
        if(isset($arr['USERPWD'])){curl_setopt($curl,CURLOPT_USERPWD,$arr['USERPWD']);}
        if(isset($arr['userAgent'])){curl_setopt($curl,CURLOPT_USERAGENT,$arr['userAgent']);}
        if(isset($arr['POST'])){curl_setopt($curl,CURLOPT_POST,true);curl_setopt($curl,CURLOPT_POSTFIELDS,$arr['POST']);}
        if(isset($arr['referer'])){curl_setopt($curl,CURLOPT_REFERER,$arr['referer']);}
        if(isset($arr['timeout'])){curl_setopt($curl,CURLOPT_TIMEOUT,$arr['timeout']);}
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl,CURLOPT_HEADER,true);

        if($this->curl['enableCookies'] !== false ){$cookieSrc = $this->curl['cookieSrc'];curl_setopt($curl,CURLOPT_COOKIEFILE,$cookieSrc);curl_setopt($curl,CURLOPT_COOKIEJAR,$cookieSrc);}
        if(isset($arr['header'])){curl_setopt($curl,CURLOPT_HTTPHEADER,$arr['header']);}
        curl_setopt($curl,CURLOPT_TIMEOUT,25);

        $viewcode = curl_exec($curl);
        $curlInfo = curl_getinfo($curl);
        curl_close($curl);
        if(empty($viewcode)){return false;}
        $data['responseHeader'] = substr($viewcode,0,$curlInfo['header_size']);
        $data['responseBody'] = substr($viewcode,$curlInfo['header_size']);
        //$data['viewcode'] = $viewcode;

        if(isset($arr['FOLLOWLOCATION']) && preg_match('/HTTP\/1\.1 30[12]{1}/',$data['responseHeader'])){
            preg_match('/Location: (.*)/',$data['responseHeader'],$p);
            $nurl = trim($p[1]);
            if($nurl[0]=='/'){list($arr['URL'],) = explode('/',str_replace('http://','',$arr['URL']));$nurl = 'http://'.$arr['URL'].$nurl;}
            $arr['URL'] = $nurl;
            unset($arr['POST']);
            return curlPetition($arr,$data);
        }

        return $data;
    }
}
?>

Algunos ejemplos de llamadas (lo siento por el trastorno y el código comentado, tal vez documentación algún día):

echo time()."\n";
$ub = new ubuntuOne;
/* The first time you made the commented calls, then you save the authorization 
 * to a file. Once you have it on a file, you load it every time from there */
//$ub->requestAuthentification('[email protected]','*****','st');
//$ub->registerToken('[email protected]');
//print_r($ub->auth);
//$ub->saveAuth($GLOBALS['userPath'].'db/uOne.protected');
$ub->loadAuth($GLOBALS['userPath'].'db/uOne.protected');
//$ub->registerToken('[email protected]');
$ub->u1_getRoot();
//$ub->u1_file_exists('/~/Ubuntu One/non_exists/');
echo "\n";
$ub->u1_listFolder('/~/Ubuntu One/');
echo "\n";
$ub->u1_createFolder('new folder','/~/Ubuntu One/');

Buena suerte, espero que ayude

Marcos Fernández Ramos
fuente
1

Versión actualizada, algunas características agregadas, algunos errores detectados

    class ubuntuOne{
        var $curl = array('cookieSrc'=>'cookie.txt','enableCookies'=>false);
        var $auth = array('consumer_key'=>false,'consumer_secret'=>false,'token'=>false,'token_secret'=>false);
        var $oneInfo = false;
        var $oauth = false;
        var $E = array('errorCode'=>0,'errorDescription'=>'');
        var $fs = array();
        function ubuntuOne(){
            $this->fs['/'] = $this->helper_nodeSkeleton(array('name'=>'/','kind'=>'directory','resource_path'=>'/'));
        }
        function helper_nodeSkeleton($a = array()){return array_merge(array('name'=>false,'kind'=>false,'when_created'=>false,'generation'=>false,'has_children'=>false,'content_path'=>false,'generation_created'=>false,'parent_path'=>false,'resource_path'=>false,'when_changed'=>false,'key'=>false,'path'=>false,'volume_path'=>false,'size'=>0,'children'=>array()),$a);}
        function helper_storePath($path,$node = false){
            $path = explode('/',$path);
            $curPath = &$this->fs['/'];
            $resPath = '';
            foreach($path as $p){if($p === ''){continue;}$resPath .= '/'.$p;if(!isset($curPath['children'][$p])){$curPath['children'][$p] = $this->helper_nodeSkeleton(array('name'=>$p,'kind'=>'directory','resource_path'=>$resPath));}$curPath = &$curPath['children'][$p];}
            if($node !== false){$curPath = array_merge($curPath,$node);if($curPath['kind'] == 'file'){unset($curPath['children']);}}
        }
        function helper_storeNode($node){
            if(!isset($node['name'])){$r = preg_match('/\/([^\/]+)$/',$node['resource_path'],$name);if($r === 0){$this->E = array('errorCode'=>1,'errorDescription'=>'NAME_NOT_PARSED');return null;}$node['name'] = $name[1];}
            $this->helper_storePath($node['resource_path'],$node);
            $this->E = array('errorCode'=>0,'errorDescription'=>'');
        }
        function u1_getRoot(){
            if($this->oauth === false){return false;}
            $url = 'https://one.ubuntu.com/api/file_storage/v1';
            try{$this->oauth->fetch($url);}
            catch(OAuthException $E){print_r($E);return false;}
            $lr = json_decode($this->oauth->getLastResponse(),1);
            $this->helper_storePath($lr['root_node_path']);
            foreach($lr['user_node_paths'] as $np){$this->helper_storePath($np);}
            $this->oneInfo = $lr;
            return $lr;
        }
        function u1_getVolumeTree(){
            if($this->oneInfo === false){$r = $this->u1_getRoot();if($r === null){return $r;}}
            $base = $this->fs['/']['children']['~']['children'];
            foreach($base as $k=>$node){$this->u1_helper_getVolumeTree($node);}
            return $this->fs;
        }
        function u1_helper_getVolumeTree($node,$i = 0){
            if($node['kind'] == 'file'){return;}
            $r = $this->u1_folder_list($node['resource_path']);
            foreach($r['children'] as $child){$this->u1_helper_getVolumeTree($child,$i);}
        }
        function u1_folder_list($path){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            if(substr($path,-1) != '/'){$path .= '/';}
            $url = 'https://one.ubuntu.com/api/file_storage/v1'.$this->helper_encodeURL($path).'?include_children=true';

            try{$this->oauth->fetch($url);}
            catch(OAuthException $E){echo $path;print_r($E);return null;}
            $lr = $this->oauth->getLastResponse();
            if($lr === '{"error": "not found"}'){return null;}
            $lr = json_decode($lr,1);

            /* Store the base node */
            $node = $lr;unset($node['children']);
            $this->helper_storeNode($node);
            foreach($lr['children'] as $child){$this->helper_storeNode($child);}
            return $lr;
        }
        function u1_folder_create($name,$path = '/~/Ubuntu One/'){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            if(substr($path,-1) != '/'){$path .= '/';}
            $name = preg_replace(array('/[\.]$/','/[\/]*/'),'',$name);

            //FIXME: folder exists?
            $url = 'https://one.ubuntu.com/api/file_storage/v1'.$this->helper_encodeURL($path).$this->helper_encodeURL($name);

            $this->oauth->fetch($url,'{"kind":"directory"}',OAUTH_HTTP_METHOD_PUT);
            $node = json_decode($this->oauth->getLastResponse(),1);
            $this->helper_storeNode($node);
            return $node;
        }
        function u1_file_create($path,$blob){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            //if(substr($path,-1) != '/'){$path .= '/';}
            $url = 'https://files.one.ubuntu.com/content'.$this->helper_encodeURL($path);
            //FIXME: u1_file_exists

            $this->oauth->fetch($url,$blob,OAUTH_HTTP_METHOD_PUT,array('Content-Type'=>'application/json'));
            //$i = $this->oauth->getLastResponseInfo();
            //print_r($i);
            $node = json_decode($this->oauth->getLastResponse(),1);
            $this->helper_storeNode($node);
            return $node;
        }
        function u1_file_exists($path,$nocache = false){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            //FIXME: cache?
            $url = 'https://one.ubuntu.com/api/file_storage/v1'.$this->helper_encodeURL($path);

            try{$this->oauth->fetch($url);}
            catch(OAuthException $E){if($E->lastResponse === '{"error": "not found"}'){return false;}}
            $i = $this->oauth->getLastResponseInfo();
            if($i['http_code'] === 200){}
            //FIXME: respuesta adecuada
            print_r($this->oauth->getLastResponseInfo());
        }
        function u1_file_get($contentPath,$destinyPath = false){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            if(substr($contentPath,0,9) != '/content/'){$this->E = array('errorCode'=>1,'errorDescription'=>'NO_CONTENT_PATH');return null;}
            $url = 'https://files.one.ubuntu.com'.$this->helper_encodeURL($contentPath);

            /* I hope nobody ask me about the following concat, never gonna give you up!! */
            $time = time();
            $data = array('oauth_consumer_key'=>$this->auth['consumer_key'],'oauth_nonce'=>$time*rand(0,200),'oauth_signature_method'=>'HMAC-SHA1','oauth_timestamp'=>$time,'oauth_token'=>$this->auth['token'],'oauth_version'=>'1.0');
            $b = '';foreach($data as $k=>$v){$b .= '&'.$k.'='.$v;}
            $b = 'GET&'.rawurlencode($url).'&'.rawurlencode(substr($b,1));

            $key = $this->auth['consumer_secret'].'&'.$this->auth['token_secret'];
            $signature = $this->helper_oauth_hmacsha1($key,$b);

            $data['oauth_signature'] = $signature;
            $a = $url.'?';foreach($data as $k=>$v){$a .= $k.'='.rawurlencode($v).'&';}

            $h = fopen($a,'r');
            if(!$h){
                //FIXME: poner error
                return null;
            }

            //FIXME: is_writable
            //FIXME: file_exists
            $fileName = basename($contentPath);
            $ar = fopen($destinyPath.$fileName,'w');

            //FIXME: comprobar los primeros bits del buffer para asegurarse de que no está fallando
            $buffer = '';while(!feof($h)){$buffer = fgets($h,8192);fwrite($ar,$buffer);}fclose($h);

            fclose($ar);
            $filehash = sha1_file($destinyPath.$fileName);
            //echo "\n".$filehash."\n";

            return array('fileName'=>$fileName,'filePath'=>$destinyPath,'fileHash'=>$filehash);
        }
        function u1_file_unlink($path){
            if($this->oauth === false){$this->E = array('errorCode'=>99,'errorDescription'=>'NO_OAUTH_DATA');return null;}
            $url = 'https://one.ubuntu.com/api/file_storage/v1'.$this->helper_encodeURL($path);
            //FIXME: u1_file_exists

            try{$this->oauth->fetch($url,$blob,OAUTH_HTTP_METHOD_DELETE,array('Content-Type'=>'application/json'));}
            catch(OAuthException $E){print_r($E);$this->E = array('errorCode'=>1,'errorDescription'=>'FILE_NOT_EXISTS');return null;}
            $i = $this->oauth->getLastResponseInfo();
    //FIXME: eliminar el fichero de la caché
            //print_r($i);
        }
        function requestAuthentification($user,$pass,$name){
            $url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%20@%20'.rawurlencode($name);
            $data = $this->curlPetition(array('URL'=>$url,'USERPWD'=>$user.':'.$pass));
            //FIXME: check the response header -> 200
            $this->auth = json_decode($data['responseBody'],1);
            if($this->auth === NULL){return false;}
            $this->oauth = new OAuth($this->auth['consumer_key'],$this->auth['consumer_secret'],OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
            $this->oauth->enableDebug();
            $this->oauth->enableSSLChecks();
            $this->oauth->setToken($this->auth['token'],$this->auth['token_secret']);
            return true;
        }
        function registerToken($user){
    //FIXME: check $this->oauth == false
            $url = 'https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/'.$user;
            $this->oauth->fetch($url);
            $r = $this->oauth->getLastResponse();
            if(substr($r,02) !== 'ok'){
                //FIXME: poner error
            }
            //print_r($this->oauth->getLastResponse());
        }
        function saveAuth($fileName){$ar = fopen($fileName,'w');fwrite($ar,json_encode($this->auth));fclose($ar);return true;}
        function loadAuth($fileName){
            if(!file_exists($fileName)){return false;}
            $this->auth = json_decode(file_get_contents($fileName),1);
            if($this->auth === NULL){return false;}
            return $this->helper_makeOauth();
        }
        function setAuth($auth){$this->auth = $auth;return $this->helper_makeOauth();}
        function helper_makeOauth(){
            $this->oauth = new OAuth($this->auth['consumer_key'],$this->auth['consumer_secret'],OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
            $this->oauth->enableDebug();
            $this->oauth->enableSSLChecks();
            $this->oauth->setToken($this->auth['token'],$this->auth['token_secret']);
            return true;
        }
        function helper_encodeURL($url){return str_replace('%2F','/',rawurlencode($url));}
        function helper_oauth_hmacsha1($key,$data){
            $blocksize=64;$hashfunc='sha1';
            if(strlen($key)>$blocksize){$key=pack('H*',$hashfunc($key));}
            $key=str_pad($key,$blocksize,chr(0x00));
            $ipad=str_repeat(chr(0x36),$blocksize);
            $opad=str_repeat(chr(0x5c),$blocksize);
            $hmac=pack('H*',$hashfunc(($key^$opad).pack('H*',$hashfunc(($key^$ipad).$data))));
            return base64_encode($hmac);
        }
        function curlPetition($arr,$data = array()){
            //FIXME: data puede ser una propiedad de la clase
            $curl = curl_init($arr['URL']);
            if(!isset($data['URLTRACK'])){$data['URLTRACK'] = array();}
            $data['URLTRACK'][] = $arr['URL'];

            if(isset($this->curl['userAgent'])){curl_setopt($curl,CURLOPT_USERAGENT,$this->curl['userAgent']);}
            if(count($data['URLTRACK']) > 1){curl_setopt($curl,CURLOPT_REFERER,$data['URLTRACK'][count($data['URLTRACK'])-2]);}
            if(isset($arr['USERPWD'])){curl_setopt($curl,CURLOPT_USERPWD,$arr['USERPWD']);}
            if(isset($arr['userAgent'])){curl_setopt($curl,CURLOPT_USERAGENT,$arr['userAgent']);}
            if(isset($arr['POST'])){curl_setopt($curl,CURLOPT_POST,true);curl_setopt($curl,CURLOPT_POSTFIELDS,$arr['POST']);}
            if(isset($arr['referer'])){curl_setopt($curl,CURLOPT_REFERER,$arr['referer']);}
            if(isset($arr['timeout'])){curl_setopt($curl,CURLOPT_TIMEOUT,$arr['timeout']);}
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
            curl_setopt($curl,CURLOPT_HEADER,true);

            if($this->curl['enableCookies'] !== false ){$cookieSrc = $this->curl['cookieSrc'];curl_setopt($curl,CURLOPT_COOKIEFILE,$cookieSrc);curl_setopt($curl,CURLOPT_COOKIEJAR,$cookieSrc);}
            if(isset($arr['header'])){curl_setopt($curl,CURLOPT_HTTPHEADER,$arr['header']);}
            curl_setopt($curl,CURLOPT_TIMEOUT,25);

            $viewcode = curl_exec($curl);
            $curlInfo = curl_getinfo($curl);
            curl_close($curl);
            if(empty($viewcode)){return false;}
            $data['responseHeader'] = substr($viewcode,0,$curlInfo['header_size']);
            $data['responseBody'] = substr($viewcode,$curlInfo['header_size']);
            //$data['viewcode'] = $viewcode;

            if(isset($arr['FOLLOWLOCATION']) && preg_match('/HTTP\/1\.1 30[12]{1}/',$data['responseHeader'])){
                preg_match('/Location: (.*)/',$data['responseHeader'],$p);
                $nurl = trim($p[1]);
                if($nurl[0]=='/'){list($arr['URL'],) = explode('/',str_replace('http://','',$arr['URL']));$nurl = 'http://'.$arr['URL'].$nurl;}
                $arr['URL'] = $nurl;
                unset($arr['POST']);
                return $this->curlPetition($arr,$data);
            }

            return $data;
        }
    }
Marcos Fernández Ramos
fuente
Un ejemplo rápido: $ ub = new ubuntuOne; $ r = $ ub-> requestAuthentification ($ arr ['usuario'], $ arr ['pasar'], $ arr ['nombre']); if ($ r === false) {return json_encode (array ('errorCode' => 2, 'errorDescription' => 'AUTH_ERROR', 'file' => __ FILE __, 'line' => __ LINE__));} $ r = $ ub-> registerToken ($ arr ['usuario']); if ($ r === false) {return json_encode (array ('errorCode' => 3, 'errorDescription' => 'TOKEN_ERROR', 'file' => __ FILE __, 'line' => __ LINE__));} $ files = $ ub-> u1_getVolumeTree (); print_r ($ archivos);
Marcos Fernández Ramos
0

¡Guau, Stuart Langridge, eres como una leyenda para mí!

Creo que mañana encontraré un poco de tiempo libre para hackear tu ejemplo y ver qué obtengo. Mientras tanto, desarrollé algunas funciones basadas en Curl para iniciar sesión y saquear la página HTML de UbuntuOne. Intentaré publicarlo aquí tan pronto como lo estabilice un poco.

Sí, escribiré una API basada en PHP casi completa y te notaré, solo dame un poco de tiempo, estoy un poco sobrecargada ahora: S

Me encantaría mostrarte mi trabajo, tal vez algún día superaré mis miedos y postularé para trabajar en Canonical, es como un sueño para mí. Por el momento, he escrito una pequeña reseña para mostrarle mi proyecto actual, estaré encantado de enviarle una copia si le importa. Quiero lanzarlo como software libre, pero soy de los que necesita crear un proyecto web y asegurarme de que sea seguro antes de lanzarlo.

(esto no es ningún tipo de enlace permanente, lo siento) http://marcos.colorvamp.com/mongo/lain-and-ubuntu-one/

Y si revisas la página base ... hmm como se dice en mi tierra. "En la casa del herrero, hay cuchillos de madera" :-)

Gracias por responder :-)

Marcos Fernández Ramos
fuente
¡Esto se ve muy bien! Me encantaría tener una conversación sobre cómo puede conectarse con Ubuntu One de la manera más eficiente. Entonces puedo decirle cómo hacer lo que quiere sin raspar la pantalla de las páginas HTML, lo que nos gustaría que no hiciera. :)
sil
Me sentiría muy honrado de recibir alguna pista de usted. Mi proyecto tiene algunas necesidades en las que trabajo (interfaz, núcleo, seguridad, aplicaciones js, permisos), por lo que mi progreso a veces es un poco lento, normalmente cuando tengo que tocar algunas áreas. Voy a publicar aquí una clase básica que implementa los primeros pasos de la comunicación ubuntu One, está lejos de estar lista, pero podría señalar a algunas personas en la dirección correcta si tienen alguna duda. Lo actualizaré en el tiempo libre que pueda encontrar y volveré a publicar aquí si está bien.
Marcos Fernández Ramos
De todos modos, cuando termine mi protocolo "Revelar" me gustaría enviarle una copia y recibir sus comentarios si tiene un poco de tiempo libre. Está lleno de "piglits" (casos de prueba, demasiada lectura de mesa-devel :)) para evitar regresiones que sirven como ejemplos. Tal vez el equipo UbuntuOne podría obtener algunas ideas de almacenamiento en caché del código (soy escéptico pero aún así ...). ¡Gracias por tu tiempo!
Marcos Fernández Ramos
Definitivamente envíeme una copia y detalles y así sucesivamente. Estoy en el IRC como "acuario" si quiere ponerse al día para una charla, o podemos Skype o lo que sea :)
sil