]> 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 74b4aaf..013f4b9
@@ -2,7 +2,7 @@
        require_once("bbcode.php");
        require_once("datetime.php");
        require_once("conversation.php");
-       
+       require_once("oauth.php");
        /* 
         * Twitter-Like API
         *  
        /**
         * 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)) ;
@@ -39,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');
                }
                    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'] .'"');
        }
        
        /**************************
         **************************/
        function api_call(&$a){
                GLOBAL $API, $called_api;
+
+               // preset
+               $type="json";
+
                foreach ($API as $p=>$info){
                        if (strpos($a->query_string, $p)===0){
                                $called_api= explode("/",$p);
-                               #unset($_SERVER['PHP_AUTH_USER']);
+                               //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;
                // 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)
                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.
                        $txt = requestdata('htmlstatus');
                        if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
 
-                               $txt = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
-                                       '[youtube]$1[/youtube]', $txt);
-
-                               $txt = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
-                                       '[youtube]$1[/youtube]', $txt);
+                               $txt = html2bb_video($txt);
 
                                $config = HTMLPurifier_Config::createDefault();
                                $config->set('Cache.DefinitionImpl', null);
                                $purifier = new HTMLPurifier($config);
                                $txt = $purifier->purify($txt);
 
-                               $_POST['body'] = html2bbcode($txt);
+                               $_REQUEST['body'] = html2bbcode($txt);
                        }
 
                }
                else
-                       $_POST['body'] = urldecode(requestdata('status'));
+                       $_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
 
                        `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
                        FROM `item`, `contact`
                        WHERE `item`.`uid` = %d
                        AND `item`.`contact-id` = %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
                if (local_user()===false) return false;
                
                $user_info = api_get_user($a);
-               // in friendika starred item are private
+               // in friendica starred item are private
                // return favorites only for self
                logger('api_favorites: self:' . $user_info['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`.`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
        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);
+
+