use Friendica\Model\Photo;
use Friendica\Model\User;
use Friendica\Model\UserItem;
+use Friendica\Model\Verb;
use Friendica\Network\FKOAuth1;
use Friendica\Network\HTTPException;
use Friendica\Network\HTTPException\BadRequestException;
*/
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));
}
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");
$author_user = $status_user;
- $status_user["protected"] = $item['private'] == Item::PRIVATE;
+ $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);
/**
* @param string $type Return format (atom, rss, xml, json)
* @param int $item_id
- * @return string
+ * @return array|string
* @throws Exception
*/
function api_status_show($type, $item_id)
$params = ['order' => ['id' => true], 'limit' => [$start, $count]];
if (preg_match('/^#(\w+)$/', $searchTerm, $matches) === 1 && isset($matches[1])) {
$searchTerm = $matches[1];
- $condition = ["`oid` > ?
- AND (`uid` = 0 OR (`uid` = ? AND NOT `global`))
- AND `otype` = ? AND `type` = ? AND `term` = ?",
- $since_id, local_user(), TERM_OBJ_POST, TERM_HASHTAG, $searchTerm];
- if ($max_id > 0) {
- $condition[0] .= ' AND `oid` <= ?';
- $condition[] = $max_id;
- }
- $terms = DBA::select('term', ['oid'], $condition, []);
- $itemIds = [];
- while ($term = DBA::fetch($terms)) {
- $itemIds[] = $term['oid'];
+ $condition = ["`iid` > ? AND `name` = ? AND (NOT `private` OR (`private` AND `uid` = ?))", $since_id, $searchTerm, local_user()];
+ $tags = DBA::select('tag-search-view', ['uri-id'], $condition);
+ $uriids = [];
+ while ($tag = DBA::fetch($tags)) {
+ $uriids[] = $tag['uri-id'];
}
- DBA::close($terms);
+ DBA::close($tags);
- if (empty($itemIds)) {
+ if (empty($uriids)) {
return api_format_data('statuses', $type, $data);
}
- $preCondition = ['`id` IN (' . implode(', ', $itemIds) . ')'];
+ $condition = ['uri-id' => $uriids];
if ($exclude_replies) {
- $preCondition[] = '`id` = `parent`';
+ $condition['gravity'] = GRAVITY_PARENT;
}
- $condition = [implode(' AND ', $preCondition)];
+ $params['group_by'] = ['uri-id'];
} else {
$condition = ["`id` > ?
- " . ($exclude_replies ? " AND `id` = `parent` " : ' ') . "
+ " . ($exclude_replies ? " AND `gravity` = " . GRAVITY_PARENT : ' ') . "
AND (`uid` = 0 OR (`uid` = ? AND NOT `global`))
AND `body` LIKE CONCAT('%',?,'%')",
$since_id, api_user(), $_REQUEST['q']];
$condition[] = $max_id;
}
if ($exclude_replies) {
- $condition[0] .= ' AND `item`.`parent` = `item`.`id`';
+ $condition[0] .= ' AND `item`.`gravity` = ?';
+ $condition[] = GRAVITY_PARENT;
}
if ($conversation_id > 0) {
$condition[0] .= " AND `item`.`parent` = ?";
Logger::log('API: api_statuses_repeat: '.$id);
- $fields = ['body', 'title', 'attach', 'tag', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink'];
+ $fields = ['uri-id', 'body', 'title', 'attach', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink'];
$item = Item::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]);
if (DBA::isResult($item) && $item['body'] != "") {
$post .= "[/share]";
}
$_REQUEST['body'] = $post;
- $_REQUEST['tag'] = $item['tag'];
$_REQUEST['attach'] = $item['attach'];
$_REQUEST['profile_uid'] = api_user();
$_REQUEST['api_source'] = true;
}
$item_id = item_post($a);
+
+ /// @todo Copy tags from the original post to the new one
} else {
throw new ForbiddenException();
}
}
if ($exclude_replies) {
- $condition[0] .= ' AND `item`.`parent` = `item`.`id`';
+ $condition[0] .= ' AND `item`.`gravity` = ?';
+ $condition[] = GRAVITY_PARENT;
}
if ($conversation_id > 0) {
if ($_GET['getText'] == 'html') {
$ret['text'] = BBCode::convert($item['body'], false);
} elseif ($_GET['getText'] == 'plain') {
- $ret['text'] = trim(HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, 2, true), 0));
+ $ret['text'] = trim(HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, BBCode::API, true), 0));
}
} else {
- $ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, 2, true), 0);
+ $ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, BBCode::API, true), 0);
}
if (!empty($_GET['getUserObjects']) && $_GET['getUserObjects'] == 'false') {
unset($ret['sender']);
$attachments = api_get_attachments($body);
// Workaround for ostatus messages where the title is identically to the body
- $html = BBCode::convert(api_clean_plain_items($body), false, 2, true);
+ $html = BBCode::convert(api_clean_plain_items($body), false, BBCode::API, true);
$statusbody = trim(HTML::toPlaintext($html, 0));
// handle data: images
$retweeted_item = [];
$quoted_item = [];
- if ($item["id"] == $item["parent"]) {
+ if ($item['gravity'] == GRAVITY_PARENT) {
$body = $item['body'];
$retweeted_item = api_share_as_retweet($item);
if ($body != $item['body']) {
$condition[] = $max_id;
}
if ($exclude_replies > 0) {
- $condition[0] .= ' AND `item`.`parent` = `item`.`id`';
+ $condition[0] .= ' AND `item`.`gravity` = ?';
+ $condition[] = GRAVITY_PARENT;
}
if ($conversation_id > 0) {
$condition[0] .= " AND `item`.`parent` = ?";
}
}
- 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,
}
$fields = ['author-id', 'author-name', 'author-link', 'author-avatar'];
- $activity = Item::activityToIndex(Activity::ANNOUNCE);
- $condition = ['parent-uri' => $item['uri'], 'gravity' => GRAVITY_ACTIVITY, 'uid' => [0, $item['uid']], 'activity' => $activity];
+ $condition = ['parent-uri' => $item['uri'], 'gravity' => GRAVITY_ACTIVITY, 'uid' => [0, $item['uid']], 'vid' => Verb::getID(Activity::ANNOUNCE)];
$announce = Item::selectFirstForUser($item['uid'], $fields, $condition, ['order' => ['received' => true]]);
if (!DBA::isResult($announce)) {
return [];
$in_reply_to['user_id_str'] = null;
$in_reply_to['screen_name'] = null;
- if (($item['thr-parent'] != $item['uri']) && (intval($item['parent']) != intval($item['id']))) {
+ if (($item['thr-parent'] != $item['uri']) && ($item['gravity'] != GRAVITY_PARENT)) {
$parent = Item::selectFirst(['id'], ['uid' => $item['uid'], 'uri' => $item['thr-parent']]);
if (DBA::isResult($parent)) {
$in_reply_to['status_id'] = intval($parent['id']);
$id = $_REQUEST['id'] ?? 0;
- $res = Item::performLike($id, $verb);
+ $res = Item::performActivity($id, $verb);
if ($res) {
if ($type == "xml") {