]> git.mxchange.org Git - friendica.git/blobdiff - include/api.php
From Tobias H - catch some irregularities caused by cut/paste code
[friendica.git] / include / api.php
old mode 100644 (file)
new mode 100755 (executable)
index aa42313..013f4b9
@@ -1,14 +1,15 @@
 <?php
        require_once("bbcode.php");
        require_once("datetime.php");
-       
+       require_once("conversation.php");
+       require_once("oauth.php");
        /* 
         * Twitter-Like API
         *  
         */
 
        $API = Array();
-        
+       $called_api = Null; 
 
        function api_date($str){
                //Wed May 23 06:01:13 +0000 2007
        /**
         * Simple HTTP Login
         */
+
        function api_login(&$a){
+               // login with oauth
+               try{
+                       $oauth = new FKOAuth1();
+                       list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request());
+                       if (!is_null($token)){
+                               $oauth->loginUser($token->uid);
+                               call_hooks('logged_in', $a->user);
+                               return;
+                       }
+                       echo __file__.__line__.__function__."<pre>"; var_dump($consumer, $token); die();
+               }catch(Exception $e){
+                       logger(__file__.__line__.__function__."\n".$e);
+                       //die(__file__.__line__.__function__."<pre>".$e); die();
+               }
+
+               
+               
                // workaround for HTTP-auth in CGI mode
                if(x($_SERVER,'REDIRECT_REMOTE_USER')) {
                        $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;
@@ -38,7 +57,7 @@
 
                if (!isset($_SERVER['PHP_AUTH_USER'])) {
                   logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
-                   header('WWW-Authenticate: Basic realm="Friendika"');
+                   header('WWW-Authenticate: Basic realm="Friendica"');
                    header('HTTP/1.0 401 Unauthorized');
                    die('This api requires login');
                }
@@ -54,7 +73,7 @@
                // process normal login request
 
                $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) 
-                       AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+                       AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
                        dbesc(trim($user)),
                        dbesc(trim($user)),
                        dbesc($encrypted)
                    header('HTTP/1.0 401 Unauthorized');
                    die('This api requires login');
                }
-               $_SESSION['uid'] = $record['uid'];
-               $_SESSION['theme'] = $record['theme'];
-               $_SESSION['authenticated'] = 1;
-               $_SESSION['page_flags'] = $record['page-flags'];
-               $_SESSION['my_url'] = $a->get_baseurl() . '/profile/' . $record['nickname'];
-               $_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
-
-               //notice( t("Welcome back ") . $record['username'] . EOL);
-               $a->user = $record;
-
-               if(strlen($a->user['timezone'])) {
-                       date_default_timezone_set($a->user['timezone']);
-                       $a->timezone = $a->user['timezone'];
-               }
 
-               $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
-                       intval($_SESSION['uid']));
-               if(count($r)) {
-                       $a->contact = $r[0];
-                       $a->cid = $r[0]['id'];
-                       $_SESSION['cid'] = $a->cid;
-               }
-               q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
-                       dbesc(datetime_convert()),
-                       intval($_SESSION['uid'])
-               );
+               require_once('include/security.php');
+               authenticate_success($record);
 
                call_hooks('logged_in', $a->user);
 
-               header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] .'"');
        }
        
        /**************************
         *  MAIN API ENTRY POINT  *
         **************************/
        function api_call(&$a){
-               GLOBAL $API;
+               GLOBAL $API, $called_api;
+
+               // preset
+               $type="json";
+
                foreach ($API as $p=>$info){
                        if (strpos($a->query_string, $p)===0){
-                               #unset($_SERVER['PHP_AUTH_USER']);
+                               $called_api= explode("/",$p);
+                               //unset($_SERVER['PHP_AUTH_USER']);
                                if ($info['auth']===true && local_user()===false) {
                                                api_login($a);
                                }
 
                                load_contact_links(local_user());
 
-                               logger('API call for ' . $a->user['username'] . ': ' . $a->query_string);               
+                               logger('API call for ' . $a->user['username'] . ': ' . $a->query_string);
                                logger('API parameters: ' . print_r($_REQUEST,true));
-                               $type="json";           
+                               $type="json";
                                if (strpos($a->query_string, ".xml")>0) $type="xml";
                                if (strpos($a->query_string, ".json")>0) $type="json";
                                if (strpos($a->query_string, ".rss")>0) $type="rss";
-                               if (strpos($a->query_string, ".atom")>0) $type="atom";                          
-                               
+                               if (strpos($a->query_string, ".atom")>0) $type="atom";
+
                                $r = call_user_func($info['func'], $a, $type);
                                if ($r===false) return;
 
                                                header ("Content-Type: text/xml");
                                                return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
                                                break;
-                                       case "json": 
-                                               header ("Content-Type: application/json");  
+                                       case "json":
+                                               //header ("Content-Type: application/json");
                                                foreach($r as $rr)
                                                    return json_encode($rr);
                                                break;
                                                header ("Content-Type: application/atom+xml");
                                                return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
                                                break;
-                                               
+
                                }
                                //echo "<pre>"; var_dump($r); die();
                        }
                }
+               logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
                $r = '<status><error>not implemented</error></status>';
                switch($type){
                        case "xml":
                                header ("Content-Type: text/xml");
                                return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
                                break;
-                       case "json": 
-                               header ("Content-Type: application/json");  
+                       case "json":
+                               header ("Content-Type: application/json");
                            return json_encode(array('error' => 'not implemented'));
                                break;
                        case "rss":
                                header ("Content-Type: application/atom+xml");
                                return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
                                break;
-                               
                }
        }
 
                        'updated' => api_date(null),
                        'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
                        'language' => $user_info['language'],
-                       'logo'  => $a->get_baseurl()."/images/friendika-32.png",
+                       'logo'  => $a->get_baseurl()."/images/friendica-32.png",
                );
                
                return $arr;
         * Returns user info array.
         */
        function api_get_user(&$a, $contact_id = Null){
+               global $called_api;
                $user = null;
                $extra_query = "";
 
                if(is_null($user) && x($_GET, 'screen_name')) {
                        $user = dbesc($_GET['screen_name']);    
                        $extra_query = "AND `contact`.`nick` = '%s' ";
+                       if (local_user()!==false)  $extra_query .= "AND `contact`.`uid`=".intval(local_user());
+                       
                }
                
-               if (is_null($user) && $a->argc > 3){
-                       list($user, $null) = explode(".",$a->argv[3]);
+               if (is_null($user) && $a->argc > (count($called_api)-1)){
+                       $argid = count($called_api);
+                       list($user, $null) = explode(".",$a->argv[$argid]);
                        if(is_numeric($user)){
                                $user = intval($user);
                                $extra_query = "AND `contact`.`id` = %d ";
                        } else {
                                $user = dbesc($user);
                                $extra_query = "AND `contact`.`nick` = '%s' ";
+                               if (local_user()!==false)  $extra_query .= "AND `contact`.`uid`=".intval(local_user());
                        }
                }
                
                // count friends
                $r = q("SELECT COUNT(`id`) as `count` FROM `contact`
                                WHERE  `uid` = %d AND `rel` IN ( %d, %d )
-                               AND `self`=0 AND `blocked`=0", 
+                               AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0", 
                                intval($uinfo[0]['uid']),
                                intval(CONTACT_IS_SHARING),
                                intval(CONTACT_IS_FRIEND)
 
                $r = q("SELECT COUNT(`id`) as `count` FROM `contact`
                                WHERE  `uid` = %d AND `rel` IN ( %d, %d )
-                               AND `self`=0 AND `blocked`=0", 
+                               AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0", 
                                intval($uinfo[0]['uid']),
                                intval(CONTACT_IS_FOLLOWER),
                                intval(CONTACT_IS_FRIEND)
                }
 
                $ret = Array(
+                       'self' => intval($uinfo[0]['self']),
                        'uid' => intval($uinfo[0]['uid']),
                        'id' => intval($uinfo[0]['cid']),
                        'name' => $uinfo[0]['name'],
                        'followers_count' => intval($countfollowers),
                        'favourites_count' => intval($starred),
                        'contributors_enabled' => false,
-                       'follow_request_sent' => false,
+                       'follow_request_sent' => true,
                        'profile_background_color' => 'cfe8f6',
                        'profile_text_color' => '000000',
                        'profile_link_color' => 'FF8500',
                return $ret; 
        }
 
-       /**
-        * apply xmlify() to all values of array $val, recursively
-        */
-       function api_xmlify($val){
-               if (is_bool($val)) return $val?"true":"false";
-               if (is_array($val)) return array_map('api_xmlify', $val);
-               return xmlify((string) $val);
-       }
 
        /**
         *  load api $templatename for $type and replace $data array
                        case "atom":
                        case "rss":
                        case "xml":
-                               $data = api_xmlify($data);
+                               $data = array_xmlify($data);
                                $tpl = get_markup_template("api_".$templatename."_".$type.".tpl");
                                $ret = replace_macros($tpl, $data);
                                break;
                }
                return null;
        }
-       // TODO - media uploads
+
+/*Waitman Gobble Mod*/
+        function api_statuses_mediap(&$a, $type) {
+                if (local_user()===false) {
+                        logger('api_statuses_update: no user');
+                        return false;
+                }
+                $user_info = api_get_user($a);
+
+                $_REQUEST['type'] = 'wall';
+                $_REQUEST['profile_uid'] = local_user();
+                $_REQUEST['api_source'] = true;
+                $txt = urldecode(requestdata('status'));
+
+                require_once('library/HTMLPurifier.auto.php');
+                require_once('include/html2bbcode.php');
+
+                if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
+                       $txt = html2bb_video($txt);
+                       $config = HTMLPurifier_Config::createDefault();
+                        $config->set('Cache.DefinitionImpl', null);
+                       $purifier = new HTMLPurifier($config);
+                        $txt = $purifier->purify($txt);
+               }
+               $txt = html2bbcode($txt);
+               
+                $a->argv[1]=$user_info['screen_name']; //should be set to username?
+               
+               $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo
+                require_once('mod/wall_upload.php');
+               $bebop = wall_upload_post($a);
+                
+               //now that we have the img url in bbcode we can add it to the status and insert the wall item.
+                $_REQUEST['body']=$txt."\n\n".$bebop;
+                require_once('mod/item.php');
+                item_post($a);
+
+                // this should output the last post (the one we just posted).
+                return api_status_show($a,$type);
+        }
+        api_register_func('api/statuses/mediap','api_statuses_mediap', true);
+/*Waitman Gobble Mod*/
+
+
        function api_statuses_update(&$a, $type) {
-               if (local_user()===false) return false;
+               if (local_user()===false) {
+                       logger('api_statuses_update: no user');
+                       return false;
+               }
                $user_info = api_get_user($a);
 
                // convert $_POST array items to the form we use for web posts.
 
                // logger('api_post: ' . print_r($_POST,true));
 
-               $_POST['body'] = urldecode(requestdata('status'));
+               if(requestdata('htmlstatus')) {
+                       require_once('library/HTMLPurifier.auto.php');
+                       require_once('include/html2bbcode.php');
+
+                       $txt = requestdata('htmlstatus');
+                       if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
+
+                               $txt = html2bb_video($txt);
+
+                               $config = HTMLPurifier_Config::createDefault();
+                               $config->set('Cache.DefinitionImpl', null);
+
+
+                               $purifier = new HTMLPurifier($config);
+                               $txt = $purifier->purify($txt);
+
+                               $_REQUEST['body'] = html2bbcode($txt);
+                       }
+
+               }
+               else
+                       $_REQUEST['body'] = urldecode(requestdata('status'));
 
                $parent = requestdata('in_reply_to_status_id');
                if(ctype_digit($parent))
-                       $_POST['parent'] = $parent;
+                       $_REQUEST['parent'] = $parent;
                else
-                       $_POST['parent_uri'] = $parent;
+                       $_REQUEST['parent_uri'] = $parent;
 
                if(requestdata('lat') && requestdata('long'))
-                       $_POST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
-               $_POST['profile_uid'] = local_user();
+                       $_REQUEST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
+               $_REQUEST['profile_uid'] = local_user();
                if(requestdata('parent'))
-                       $_POST['type'] = 'net-comment';
+                       $_REQUEST['type'] = 'net-comment';
                else
-                       $_POST['type'] = 'wall';
+                       $_REQUEST['type'] = 'wall';
 
                // set this so that the item_post() function is quiet and doesn't redirect or emit json
 
-               $_POST['api_source'] = true;
+               $_REQUEST['api_source'] = true;
 
                // call out normal post function
 
                $user_info = api_get_user($a);
                // get last newtork messages
 
+
                // params
                $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
                $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
                        `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
                        FROM `item`, `contact`
                        WHERE `item`.`uid` = %d
-                       AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+                       AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
                        AND `contact`.`id` = `item`.`contact-id`
                        AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
                        $sql_extra
                $user_info = api_get_user($a);
                // get last newtork messages
 
+
+               logger("api_statuses_user_timeline: local_user: ". local_user() .
+                          "\nuser_info: ".print_r($user_info, true) .
+                          "\n_REQUEST:  ".print_r($_REQUEST, true),
+                          LOGGER_DEBUG);
+
                // params
                $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
                $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
                
                $start = $page*$count;
 
+               if ($user_info['self']==1) $sql_extra = "AND `item`.`wall` = 1 ";
 
                $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
                        `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
                        `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
                        FROM `item`, `contact`
                        WHERE `item`.`uid` = %d
-                       AND `item`.`visible` = 1 AND `item`.`deleted` = 0
-                       AND `item`.`wall` = 1
+                       AND `item`.`contact-id` = %d
+                       AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
                        AND `contact`.`id` = `item`.`contact-id`
                        AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
                        $sql_extra
                        AND `item`.`id`>%d
                        ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
-                       intval($user_info['uid']),
+                       intval(local_user()),
+                       intval($user_info['id']),
                        intval($since_id),
                        intval($start), intval($count)
                );
                if (local_user()===false) return false;
                
                $user_info = api_get_user($a);
-               // get last newtork messages
+               // in friendica starred item are private
+               // return favorites only for self
+               logger('api_favorites: self:' . $user_info['self']);
                
-               // params
-               $count = (x($_GET,'count')?$_GET['count']:20);
-               $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
-               if ($page<0) $page=0;
-               
-               $start = $page*$count;
-
-               $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
-                       `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
-                       `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
-                       `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
-                       FROM `item`, `contact`
-                       WHERE `item`.`uid` = %d
-                       AND `item`.`visible` = 1 AND `item`.`deleted` = 0
-                       AND `item`.`starred` = 1
-                       AND `contact`.`id` = `item`.`contact-id`
-                       AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
-                       $sql_extra
-                       ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
-                       intval($user_info['uid']),
-                       intval($start), intval($count)
-               );
-
-               $ret = api_format_items($r,$user_info);
+               if ($user_info['self']==0) {
+                       $ret = array();
+               } else {
+                       
+                       
+                       // params
+                       $count = (x($_GET,'count')?$_GET['count']:20);
+                       $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
+                       if ($page<0) $page=0;
+                       
+                       $start = $page*$count;
+
+                       $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
+                               `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+                               `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+                               `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+                               FROM `item`, `contact`
+                               WHERE `item`.`uid` = %d
+                               AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
+                               AND `item`.`starred` = 1
+                               AND `contact`.`id` = `item`.`contact-id`
+                               AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+                               $sql_extra
+                               ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+                               intval($user_info['uid']),
+                               intval($start), intval($count)
+                       );
 
+                       $ret = api_format_items($r,$user_info);
+               
+               }
                
                $data = array('$statuses' => $ret);
                switch($type){
                $ret = Array();
 
                foreach($r as $item) {
+                       localize_item($item);
                        $status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item));
                        $status = array(
                                'created_at'=> api_date($item['created']),
                if (local_user()===false) return false;
                $user_info = api_get_user($a);
                
+               
+               // friends and followers only for self
+               if ($user_info['self']==0){
+                       return false;
+               }
+               
                if (x($_GET,'cursor') && $_GET['cursor']=='undefined'){
                        /* this is to stop Hotot to load friends multiple times
                        *  I'm not sure if I'm missing return something or
                        *  is a bug in hotot. Workaround, meantime
                        */
                        
-                       $ret=Array();
-                       $data = array('$users' => $ret);
-                       return  api_apply_template("friends", $type, $data);
+                       /*$ret=Array();
+                       return array('$users' => $ret);*/
+                       return false;
                }
                
                if($qtype == 'friends')
                }
 
                
-               $data = array('$users' => $ret);
-               return  api_apply_template("friends", $type, $data);
+               return array('$users' => $ret);
 
        }
        function api_statuses_friends(&$a, $type){
-               return api_statuses_f($a,$type,"friends");
+               $data =  api_statuses_f($a,$type,"friends");
+               if ($data===false) return false;
+               return  api_apply_template("friends", $type, $data);
        }
        function api_statuses_followers(&$a, $type){
-               return api_statuses_f($a,$type,"followers");
+               $data = api_statuses_f($a,$type,"followers");
+               if ($data===false) return false;
+               return  api_apply_template("friends", $type, $data);
        }
        api_register_func('api/statuses/friends','api_statuses_friends',true);
        api_register_func('api/statuses/followers','api_statuses_followers',true);
        function api_statusnet_config(&$a,$type) {
                $name = $a->config['sitename'];
                $server = $a->get_hostname();
-               $logo = $a->get_baseurl() . '/images/friendika-64.png';
+               $logo = $a->get_baseurl() . '/images/friendica-64.png';
                $email = $a->config['admin_email'];
                $closed = (($a->config['register_policy'] == REGISTER_CLOSED) ? 'true' : 'false');
                $private = (($a->config['system']['block_public']) ? 'true' : 'false');
        }
        api_register_func('api/direct_messages/sent','api_direct_messages_sentbox',true);
        api_register_func('api/direct_messages','api_direct_messages_inbox',true);
+
+
+
+       function api_oauth_request_token(&$a, $type){
+               try{
+                       $oauth = new FKOAuth1();
+                       $r = $oauth->fetch_request_token(OAuthRequest::from_request());
+               }catch(Exception $e){
+                       echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
+               }
+               echo $r;
+               killme();       
+       }
+       function api_oauth_access_token(&$a, $type){
+               try{
+                       $oauth = new FKOAuth1();
+                       $r = $oauth->fetch_access_token(OAuthRequest::from_request());
+               }catch(Exception $e){
+                       echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
+               }
+               echo $r;
+               killme();                       
+       }
+
+       api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
+       api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
+
+