উবুন্টু ওয়ান ওউথ পিএইচপি থেকে লগইন করুন


8

আমি একটি সাধারণ উদাহরণ খুঁজে পাওয়ার চেষ্টা করে পুরো ইন্টারনেট অনুসন্ধান করেছি যা আমাকে সঠিক দিকে নির্দেশ করতে পারে, তবে ভাগ্য নেই, তাই এখানে আমার প্রশ্নগুলি এসেছে:

আমি উবুন্টু ওয়ানতে লগইন করতে চাই এবং আমার ওয়েব পৃষ্ঠা থেকে ফাইলগুলি সিঙ্ক করতে (বা প্রায় পড়ুন), সমস্তই পিএইচপি দিয়ে শেষ। ফাইলগুলিতে পৌঁছানোর প্রয়োজনীয়তাগুলি সমস্তই সেই পৃষ্ঠাতে বর্ণিত: https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/

আমি এর সাথে প্রথম অনুরোধটি সম্পূর্ণ করতে সক্ষম:

$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);

ঠিক আছে, কার্লপিটেশন কেবলমাত্র বেসিক কার্ল পিটিশন করে। মনে রাখবেন যে আপনার একটি বৈধ ব্যবহারকারী প্রয়োজন: উবুন্টু একটি অ্যাকাউন্ট পাস করুন। আমি "কনজিউমার_সেক্রেট", "টোকেন", "গ্রাহক_কি", "নাম", "টোকেন_সেক্রেট" সহ জসনে সঠিকভাবে প্রতিক্রিয়া পেয়েছি। এমনকি এন্ট্রি উবুন্টু এর অনুমোদিত অ্যাপ্লিকেশনগুলিতে তালিকাভুক্ত হয়।

আমি সর্বাধিক নতুন OAuth PCL পিএইচপি এক্সটেনশান ইনস্টল করেছি এবং এটির কাজ ভাল। তবে যখন আমি চেষ্টা করি:

    $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());

আমি ম্যানুয়াল ওয়েব লগইন করার সময় আপনি যেখানে পাস করেন সেখানে "ওপেনআইডি লেনদেনের অগ্রগতি" পৃষ্ঠাতে চলে এসেছি। আমি অবশ্যই কিছু ভুল করছি। আমি দ্বিতীয় পদক্ষেপটি https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ এর সাথে $ oauth-> আনয়ন, $ oauth-> getAccessToken এবং $ oauth-> getRequestToken এর সাথে একই প্রতিক্রিয়াটি পাওয়ার চেষ্টা করেছি 403 ত্রুটি: এস

আমি বোঝার চেষ্টা করছিলাম যে পেডলোড কীভাবে কাজ করে তবে প্রধান উদাহরণগুলি পাইথন দিয়ে রাইট করা হয়, "টেক্সট স্টাফগুলি প্রায় স্বয়ংক্রিয়ভাবে তৈরি করে" "ইম্পোর্ট ubuntuone.couch.auth" হিসাবে "ব্যবহার করে।

আমি কিছু ইঙ্গিত পেতে ভাল লাগবে। ধন্যবাদ


1
আমি পিএইচপি দিয়ে সমস্ত উদাহরণ চেষ্টা করছিলাম, টোকেন (স্টেপ 1) পাওয়ার পরে, টোকেনের সাথে স্বাক্ষরিত হওয়ার চেয়ে নিজেই (স্টেপ 2), যা ঠিক আছে, স্টিপ 3 এ যখন আমার ফাইল তালিকা পাওয়া উচিত, সার্ভার ফিরে আসে: নিষিদ্ধ (403), সিএসআরএফ যাচাইকরণ ব্যর্থ হয়েছে. অনুরোধ বাতিল ইন্টারনেটে অনুসন্ধান করে, আমি এটি একটি বাগ রিপোর্ট (https://bugs.launchpad.net/ubuntuone-servers/+bug/686697) হিসাবে পেয়েছি , তবে এটি "স্থির" হিসাবে চিহ্নিত হয়েছে, তবে আমার জন্য এটি এখনও কাজ করে না।

উত্তর:


11

আমি বিশ্বাস করি যে https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ এ সংজ্ঞায়িত "একটি নতুন টোকেন তৈরি করুন" ওয়ার্কফ্লো এর সেই পদক্ষেপ 2, আপনার জন্য 503 এ ব্যর্থ হয়েছিল কারণ পরিষেবা ছিল এই সপ্তাহান্তে পয়েন্ট একটি দম্পতি নিচে। আপনার এই পরিস্থিতিটি আটকাতে হবে এবং এটি মোকাবেলা করতে হবে (একটি 503 ইঙ্গিত দেয় যে আপনি স্ট্যান্ডার্ড এইচটিটিপি অনুসারে পরে অনুরোধটি আবার চেষ্টা করবেন)।

আমি নীচের পিএইচপি পরীক্ষা করেছি (সাবধান: আমি পিএইচপি হ্যাকার নই, সুতরাং এটি সর্বাধিক আইডেম্যাটিক কোড নাও হতে পারে) এবং এটি আমার পক্ষে ভাল কাজ করে। এটি তিনটি পদক্ষেপের মধ্য দিয়ে যায়:

  1. উবুন্টু এসএসওতে একটি নতুন টোকেন তৈরি করুন (login.ubuntu.com) ( এপিআই ডক্স )
  2. উবুন্টু ওয়ানকে সেই নতুন টোকেন ( এপিআই ডক্স ) সম্পর্কে বলুন
  3. উবুন্টু ওয়ান ফাইলস এপিআই ( এপিআই ডক্স ) এর অনুরোধে সাইন করতে সেই নতুন টোকেনটি ব্যবহার করুন

আপনি নীচে মন্তব্য পৃথক অংশ দেখতে পাবেন। মনে রাখবেন যে এটি অনুরোধ করে এবং একটি নতুন টোকেন পায়; আপনার কাছে একবার টোকেন থাকলে (দ্বিতীয় ধাপের পরে) এটি অন্য কোথাও সংরক্ষণ করুন; প্রতিবার একটি নতুন অনুরোধ করবেন না।

<?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 = 'stuart.langridge@canonical.com';
$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

2

উবুন্টুওনের সাথে কথা বলার জন্য প্রথম-পদক্ষেপের কোড

<?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;
    }
}
?>

কিছু উদাহরণ কল করে (ব্যাধি এবং মন্তব্য কোডের জন্য শ্র্রী, সম্ভবত একদিন ডকুমেন্টেশন):

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('sombra2eternity@gmail.com','*****','st');
//$ub->registerToken('sombra2eternity@gmail.com');
//print_r($ub->auth);
//$ub->saveAuth($GLOBALS['userPath'].'db/uOne.protected');
$ub->loadAuth($GLOBALS['userPath'].'db/uOne.protected');
//$ub->registerToken('sombra2eternity@gmail.com');
$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/');

শুভকামনা, আমি আশা করি এটি সাহায্য করবে


1

আপডেট হওয়া সংস্করণ, কিছু বৈশিষ্ট্য যুক্ত হয়েছে, কিছু বাগ ধরা পড়েছে

    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;
        }
    }

দ্রুত উদাহরণ: $ ub = new ubuntuOne; $ r = $ ub-> অনুরোধ প্রমাণীকরণ ($ আরআর ['ব্যবহারকারী'], $ আরার ['পাস'], $ আরআর ['নাম']); যদি ($ r === মিথ্যা) {json_encode (অ্যারে ('ত্রুটি কোড)' => 2, 'ত্রুটি-বিবরণ' => 'AUTH_ERROR', 'ফাইল' => __ ফাইল __, 'লাইন' => __ লাইন__));} $ r = b ub-> নিবন্ধন টোকেন ($ আরআর ['ব্যবহারকারী']); যদি ($ r === মিথ্যা) j json_encode (অ্যারে ('ত্রুটি কোড)' => 3, 'ত্রুটি-বিবরণ' => 'টোকেন_আরআর', 'ফাইল' => __ ফাইল __, 'লাইন' => __ লাইন__));} $ ফাইলগুলি = b ub-> u1_getVolumeTree (); print_r ($ ফাইল);
মার্কোস ফার্নান্দেজ রামোস

0

বাহ, স্টুয়ার্ট ল্যাংরিজ, তুমি আমার কাছে কিংবদন্তীর মতো !!

আমি মনে করি আগামীকাল আমি আপনার উদাহরণটি হ্যাক করতে এবং আমি কী পাব তা দেখার জন্য কিছুটা ফাঁকা সময় পাব। ইতোমধ্যে আমি উবুন্টুও এইচটিএমএল পৃষ্ঠা লগইন করতে এবং লুট করতে কিছু কার্ল ভিত্তিক ফাংশন নিয়ে কাজ করেছি। আমি কিছুটা স্থির করার সাথে সাথে এটি এখানে পোস্ট করার চেষ্টা করব।

হ্যাঁ, আমি প্রায় সম্পূর্ণ পিএইচপি ভিত্তিক এপিআই লিখব এবং আপনাকে খেয়াল করব, কিছুটা সময় গিম্মে, আমি এখনই ওভারলোডের ধরণ: এস

আমি আপনাকে আমার কাজটি দেখাতে পছন্দ করব, সম্ভবত একদিন আমি আমার ভয়কে কাটিয়ে উঠতে এবং ক্যানোনিকালে কাজ করার জন্য আবেদন করব, এটি আমার কাছে স্বপ্নের মতো। আমার বর্তমান প্রকল্পটি আপনাকে দেখানোর জন্য আমি একটি ক্ষুদ্র পর্যালোচনা লিখেছি এই মুহুর্তের জন্য, আপনি যদি যত্ন নেন তবে আমি আপনাকে একটি অনুলিপি প্রেরণে খুশি হব। আমি এটিকে ফ্রি সফটওয়্যার হিসাবে প্রকাশ করতে চাই তবে আমি তাদের মধ্যে একজন যাদের একটি ওয়েব প্রকল্প বাঙ্কার করা উচিত এবং নিশ্চিত হওয়া উচিত যে এটি প্রকাশের আগে এটি নিরাপদ।

(এটি কোনও ধরণের পারমা-লিঙ্ক নয়, দুঃখিত) http://marcos.colorvamp.com/mongo/lain-and-ubuntu-one/

এবং যদি আপনি বেস পৃষ্ঠাটি পরীক্ষা করেন ... হুম এটি আমার জমিতে যেমন বলেছে। "কামারের বাড়িতে কাঠের ছুরি রয়েছে" :-)

উত্তর দেওয়ার জন্য ধন্যবাদ :-)


এই স্টাফটি খুব দুর্দান্ত দেখাচ্ছে! আপনি কীভাবে উবুন্টু ওয়ানকে সবচেয়ে দক্ষতার সাথে বেঁধে রাখতে পারেন সে সম্পর্কে চ্যাট করতে পেরে আমি আনন্দিত। তারপরে আমি আপনাকে HTML পৃষ্ঠাগুলি স্ক্র্যাপ না করে কী করতে চান সে সম্পর্কে আপনাকে বলতে পারি, যা আমরা আপনাকে না করতে চাই। :)
Sil

আপনার কাছ থেকে কোনও ইঙ্গিত পেয়ে আমি খুব সম্মানিত বোধ করব। আমার প্রকল্পের কিছু প্রয়োজন রয়েছে যা আমি (ইন্টারফেস, কোর, সুরক্ষা, জেএস অ্যাপ্লিকেশন, অনুমতি) নিয়ে কাজ করি যাতে আমার অগ্রগতি মাঝে মাঝে কিছুটা ধীর হয়, সাধারণত যখন আমাকে কিছু অঞ্চল স্পর্শ করতে হয় তখন। আমি এখানে একটি বেসিক ক্লাসটি পোস্ট করছি যা উবুন্টু ওয়ান যোগাযোগের খুব প্রথম ধাপ প্রয়োগ করে, প্রস্তুত থেকে দূরে, তবে কিছু লোকের যদি তাদের সন্দেহ থাকে তবে সঠিক দিক নির্দেশ করতে পারে। আমি খুঁজে পাওয়া ফ্রি সময়ে এটি আপডেট করব এবং ঠিক আছে যদি এখানে ফিরে পোস্ট করবো।
মার্কোস ফার্নান্দেজ রামোস

যাইহোক, আমি যখন আমার "প্রকাশ" প্রোটোকলটি শেষ করি তখন আমি আপনাকে একটি অনুলিপি প্রেরণ করতে চাই এবং আপনার কিছুটা ফ্রি সময় থাকলে আপনার প্রতিক্রিয়া জানাতে চাই। উদাহরণস্বরূপ এমন প্রতিক্রিয়া এড়াতে এটির "পিগলিটস" (পরীক্ষার কেসগুলি, খুব বেশি মেসা-ডেভেল রিডিং :)) পূর্ণ। হতে পারে উবুন্টুওন দলটি কোডটি থেকে কিছু ক্যাচিং ধারণা পেতে পারে (আমি সন্দেহবাদী তবে এখনও ...)। আপনার সময় জন্য ধন্যবাদ!
মার্কোস ফার্নান্দেজ রামোস

অবশ্যই আমাকে একটি অনুলিপি এবং বিশদ পাঠান। আপনি যদি চ্যাট করতে চান তবে আমি "অ্যাকোয়ারিয়াস" হিসাবে বরইতে আছি, অথবা আমরা স্কাইপ বা যা কিছু করতে পারি :)
সিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.