]> git.mxchange.org Git - friendica.git/blobdiff - include/api.php
Merge pull request #8492 from MrPetovan/task/8400-frio-jot-compose-link
[friendica.git] / include / api.php
index c9402d46d018ed5221ad5490bddade5626005476..8291d189269bdbfe26056df68c4a53632fe0e9b3 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
  * Friendica implementation of statusnet/twitter API
  *
  * @file include/api.php
@@ -8,7 +25,6 @@
 
 use Friendica\App;
 use Friendica\Content\ContactSelector;
-use Friendica\Content\Feature;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
 use Friendica\Core\Hook;
@@ -25,7 +41,6 @@ use Friendica\Model\Item;
 use Friendica\Model\Mail;
 use Friendica\Model\Notify;
 use Friendica\Model\Photo;
-use Friendica\Model\Profile;
 use Friendica\Model\User;
 use Friendica\Model\UserItem;
 use Friendica\Network\FKOAuth1;
@@ -171,23 +186,6 @@ function api_register_func($path, $func, $auth = false, $method = API_METHOD_ANY
  */
 function api_login(App $a)
 {
-       $oauth1 = new FKOAuth1();
-       // login with oauth
-       try {
-               $request = OAuthRequest::from_request();
-               list($consumer, $token) = $oauth1->verify_request($request);
-               if (!is_null($token)) {
-                       $oauth1->loginUser($token->uid);
-                       Session::set('allow_api', true);
-                       return;
-               }
-               echo __FILE__.__LINE__.__FUNCTION__ . "<pre>";
-               var_dump($consumer, $token);
-               die();
-       } catch (Exception $e) {
-               Logger::warning(API_LOG_PREFIX . 'error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
-       }
-
        // workaround for HTTP-auth in CGI mode
        if (!empty($_SERVER['REDIRECT_REMOTE_USER'])) {
                $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6));
@@ -199,6 +197,24 @@ function api_login(App $a)
        }
 
        if (empty($_SERVER['PHP_AUTH_USER'])) {
+               // Try OAuth when no user is provided
+               $oauth1 = new FKOAuth1();
+               // login with oauth
+               try {
+                       $request = OAuthRequest::from_request();
+                       list($consumer, $token) = $oauth1->verify_request($request);
+                       if (!is_null($token)) {
+                               $oauth1->loginUser($token->uid);
+                               Session::set('allow_api', true);
+                               return;
+                       }
+                       echo __FILE__.__LINE__.__FUNCTION__ . "<pre>";
+                       var_dump($consumer, $token);
+                       die();
+               } catch (Exception $e) {
+                       Logger::warning(API_LOG_PREFIX . 'OAuth error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
+               }
+
                Logger::debug(API_LOG_PREFIX . 'failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
                header('WWW-Authenticate: Basic realm="Friendica"');
                throw new UnauthorizedException("This API requires login");
@@ -768,7 +784,7 @@ function api_item_get_user(App $a, $item)
 
        $author_user = $status_user;
 
-       $status_user["protected"] = $item['private'] ?? 0;
+       $status_user["protected"] = isset($item['private']) && ($item['private'] == Item::PRIVATE);
 
        if (($item['thr-parent'] ?? '') == ($item['uri'] ?? '')) {
                $owner_user = api_get_user($a, $item['owner-id'] ?? null);
@@ -1327,7 +1343,7 @@ function api_get_last_status($ownerId, $uid)
                'author-id'=> $ownerId,
                'uid'      => $uid,
                'gravity'  => [GRAVITY_PARENT, GRAVITY_COMMENT],
-               'private'  => false
+               'private'  => [Item::PUBLIC, Item::UNLISTED]
        ];
 
        $item = api_get_item($condition);
@@ -1717,8 +1733,8 @@ function api_statuses_public_timeline($type)
        $start = max(0, ($page - 1) * $count);
 
        if ($exclude_replies && !$conversation_id) {
-               $condition = ["`gravity` IN (?, ?) AND `iid` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND NOT `author`.`hidden`",
-                       GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
+               $condition = ["`gravity` IN (?, ?) AND `iid` > ? AND `private` = ? AND `wall` AND NOT `author`.`hidden`",
+                       GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, Item::PUBLIC];
 
                if ($max_id > 0) {
                        $condition[0] .= " AND `thread`.`iid` <= ?";
@@ -1730,8 +1746,8 @@ function api_statuses_public_timeline($type)
 
                $r = Item::inArray($statuses);
        } else {
-               $condition = ["`gravity` IN (?, ?) AND `id` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND `item`.`origin` AND NOT `author`.`hidden`",
-                       GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
+               $condition = ["`gravity` IN (?, ?) AND `id` > ? AND `private` = ? AND `wall` AND `item`.`origin` AND NOT `author`.`hidden`",
+                       GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, Item::PUBLIC];
 
                if ($max_id > 0) {
                        $condition[0] .= " AND `item`.`id` <= ?";
@@ -1796,8 +1812,8 @@ function api_statuses_networkpublic_timeline($type)
 
        $start = max(0, ($page - 1) * $count);
 
-       $condition = ["`uid` = 0 AND `gravity` IN (?, ?) AND `thread`.`iid` > ? AND NOT `private`",
-               GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
+       $condition = ["`uid` = 0 AND `gravity` IN (?, ?) AND `thread`.`iid` > ? AND `private` = ?",
+               GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, Item::PUBLIC];
 
        if ($max_id > 0) {
                $condition[0] .= " AND `thread`.`iid` <= ?";
@@ -2025,7 +2041,7 @@ function api_statuses_repeat($type)
        Logger::log('API: api_statuses_repeat: '.$id);
 
        $fields = ['body', 'title', 'attach', 'tag', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink'];
-       $item = Item::selectFirst($fields, ['id' => $id, 'private' => false]);
+       $item = Item::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]);
 
        if (DBA::isResult($item) && $item['body'] != "") {
                if (strpos($item['body'], "[/share]") !== false) {
@@ -2906,60 +2922,6 @@ function api_format_items_activities($item, $type = "json")
        return $activities;
 }
 
-
-/**
- * return data from profiles
- *
- * @param array $profile_row array containing data from db table 'profile'
- * @return array
- * @throws InternalServerErrorException
- */
-function api_format_items_profiles($profile_row)
-{
-       $profile = [
-               'profile_id'       => $profile_row['id'],
-               'profile_name'     => $profile_row['profile-name'],
-               'is_default'       => $profile_row['is-default'] ? true : false,
-               'hide_friends'     => $profile_row['hide-friends'] ? true : false,
-               'profile_photo'    => $profile_row['photo'],
-               'profile_thumb'    => $profile_row['thumb'],
-               'publish'          => $profile_row['publish'] ? true : false,
-               'net_publish'      => $profile_row['net-publish'] ? true : false,
-               'description'      => $profile_row['pdesc'],
-               'date_of_birth'    => $profile_row['dob'],
-               'address'          => $profile_row['address'],
-               'city'             => $profile_row['locality'],
-               'region'           => $profile_row['region'],
-               'postal_code'      => $profile_row['postal-code'],
-               'country'          => $profile_row['country-name'],
-               'hometown'         => $profile_row['hometown'],
-               'gender'           => $profile_row['gender'],
-               'marital'          => $profile_row['marital'],
-               'marital_with'     => $profile_row['with'],
-               'marital_since'    => $profile_row['howlong'],
-               'sexual'           => $profile_row['sexual'],
-               'politic'          => $profile_row['politic'],
-               'religion'         => $profile_row['religion'],
-               'public_keywords'  => $profile_row['pub_keywords'],
-               'private_keywords' => $profile_row['prv_keywords'],
-               'likes'            => BBCode::convert(api_clean_plain_items($profile_row['likes'])    , false, 2),
-               'dislikes'         => BBCode::convert(api_clean_plain_items($profile_row['dislikes']) , false, 2),
-               'about'            => BBCode::convert(api_clean_plain_items($profile_row['about'])    , false, 2),
-               'music'            => BBCode::convert(api_clean_plain_items($profile_row['music'])    , false, 2),
-               'book'             => BBCode::convert(api_clean_plain_items($profile_row['book'])     , false, 2),
-               'tv'               => BBCode::convert(api_clean_plain_items($profile_row['tv'])       , false, 2),
-               'film'             => BBCode::convert(api_clean_plain_items($profile_row['film'])     , false, 2),
-               'interest'         => BBCode::convert(api_clean_plain_items($profile_row['interest']) , false, 2),
-               'romance'          => BBCode::convert(api_clean_plain_items($profile_row['romance'])  , false, 2),
-               'work'             => BBCode::convert(api_clean_plain_items($profile_row['work'])     , false, 2),
-               'education'        => BBCode::convert(api_clean_plain_items($profile_row['education']), false, 2),
-               'social_networks'  => BBCode::convert(api_clean_plain_items($profile_row['contact'])  , false, 2),
-               'homepage'         => $profile_row['homepage'],
-               'users'            => null
-       ];
-       return $profile;
-}
-
 /**
  * format items to be returned by api
  *
@@ -3044,7 +3006,7 @@ function api_format_item($item, $type = "json", $status_user = null, $author_use
                'user' =>  $status_user,
                'friendica_author' => $author_user,
                'friendica_owner' => $owner_user,
-               'friendica_private' => $item['private'] == 1,
+               'friendica_private' => $item['private'] == Item::PRIVATE,
                //'entities' => NULL,
                'statusnet_html' => $converted["html"],
                'statusnet_conversation_id' => $item['parent'],
@@ -4772,13 +4734,8 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
                }
        }
 
-       if ($filetype == "") {
-               $filetype = Images::guessType($filename);
-       }
-       $imagedata = @getimagesize($src);
-       if ($imagedata) {
-               $filetype = $imagedata['mime'];
-       }
+       $filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
+
        Logger::log(
                "File upload src: " . $src . " - filename: " . $filename .
                " - size: " . $filesize . " - type: " . $filetype,
@@ -5862,7 +5819,7 @@ function api_friendica_activity($type)
 
        $id = $_REQUEST['id'] ?? 0;
 
-       $res = Item::performLike($id, $verb);
+       $res = Item::performActivity($id, $verb);
 
        if ($res) {
                if ($type == "xml") {
@@ -5957,10 +5914,10 @@ function api_friendica_notification_seen($type)
        $id = (!empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0);
 
        try {
-               $notify = DI::notify()->getByID($id);
+               $notify = DI::notify()->getByID($id, api_user());
                DI::notify()->setSeen(true, $notify);
 
-               if ($notify->otype === Notify::OTYPE_ITEM) {
+               if ($notify->otype === Notify\ObjectType::ITEM) {
                        $item = Item::selectFirstForUser(api_user(), [], ['id' => $notify->iid, 'uid' => api_user()]);
                        if (DBA::isResult($item)) {
                                // we found the item, return it to the user
@@ -6104,78 +6061,6 @@ function api_friendica_direct_messages_search($type, $box = "")
 /// @TODO move to top of file or somewhere better
 api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true);
 
-/**
- * return data of all the profiles a user has to the client
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string|array
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws ImagickException
- * @throws InternalServerErrorException
- * @throws UnauthorizedException
- */
-function api_friendica_profile_show($type)
-{
-       $a = DI::app();
-
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-
-       // input params
-       $profile_id = $_REQUEST['profile_id'] ?? 0;
-
-       // retrieve general information about profiles for user
-       $multi_profiles = Feature::isEnabled(api_user(), 'multi_profiles');
-       $directory = DI::config()->get('system', 'directory');
-
-       // get data of the specified profile id or all profiles of the user if not specified
-       if ($profile_id != 0) {
-               $r = Profile::getById(api_user(), $profile_id);
-               // error message if specified gid is not in database
-               if (!DBA::isResult($r)) {
-                       throw new BadRequestException("profile_id not available");
-               }
-       } else {
-               $r = Profile::getListByUser(api_user());
-       }
-       // loop through all returned profiles and retrieve data and users
-       $k = 0;
-       $profiles = [];
-       if (DBA::isResult($r)) {
-               foreach ($r as $rr) {
-                       $profile = api_format_items_profiles($rr);
-
-                       // select all users from contact table, loop and prepare standard return for user data
-                       $users = [];
-                       $nurls = Contact::selectToArray(['id', 'nurl'], ['uid' => api_user(), 'profile-id' => $rr['id']]);
-                       foreach ($nurls as $nurl) {
-                               $user = api_get_user($a, $nurl['nurl']);
-                               ($type == "xml") ? $users[$k++ . ":user"] = $user : $users[] = $user;
-                       }
-                       $profile['users'] = $users;
-
-                       // add prepared profile data to array for final return
-                       if ($type == "xml") {
-                               $profiles[$k++ . ":profile"] = $profile;
-                       } else {
-                               $profiles[] = $profile;
-                       }
-               }
-       }
-
-       // return settings, authenticated user and profiles data
-       $self = DBA::selectFirst('contact', ['nurl'], ['uid' => api_user(), 'self' => true]);
-
-       $result = ['multi_profiles' => $multi_profiles ? true : false,
-                                       'global_dir' => $directory,
-                                       'friendica_owner' => api_get_user($a, $self['nurl']),
-                                       'profiles' => $profiles];
-       return api_format_data("friendica_profiles", $type, ['$result' => $result]);
-}
-api_register_func('api/friendica/profile/show', 'api_friendica_profile_show', true, API_METHOD_GET);
-
 /**
  * Returns a list of saved searches.
  *