X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=include%2Fapi.php;h=a9e0edc80836f00d0fcbf4ed762ea6f794996ce2;hb=9a22b4818e0a406c89ff1cc84be4232c8a979f78;hp=1cfada7f64f89c271c1942f0293ff6e570c13a76;hpb=1f23d691f377cc8c3c2ea444b785d28016f3515b;p=friendica.git diff --git a/include/api.php b/include/api.php index 1cfada7f64..a9e0edc808 100644 --- a/include/api.php +++ b/include/api.php @@ -7,6 +7,9 @@ require_once("include/conversation.php"); require_once("include/oauth.php"); require_once("include/html2plain.php"); + require_once("mod/share.php"); + require_once("include/Photo.php"); + /* * Twitter-Like API * @@ -99,6 +102,9 @@ $password = $_SERVER['PHP_AUTH_PW']; $encrypted = hash('whirlpool',trim($password)); + // allow "user@server" login (but ignore 'server' part) + $at=strstr($user, "@", true); + if ( $at ) $user=$at; /** * next code from mod/auth.php. needs better solution @@ -106,7 +112,7 @@ $record = null; $addon_auth = array( - 'username' => trim($user), + 'username' => trim($user), 'password' => trim($password), 'authenticated' => 0, 'user_record' => null @@ -733,8 +739,7 @@ $_REQUEST['body'] = html2bbcode($txt); } - } - else + } else $_REQUEST['body'] = requestdata('status'); $_REQUEST['title'] = requestdata('title'); @@ -811,13 +816,26 @@ } $_REQUEST['type'] = 'wall'; - if(x($_FILES,'media')) { - // upload the image if we have one - $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo - require_once('mod/wall_upload.php'); - $media = wall_upload_post($a); - if(strlen($media)>0) - $_REQUEST['body'] .= "\n\n".$media; + } + + if(x($_FILES,'media')) { + // upload the image if we have one + $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo + require_once('mod/wall_upload.php'); + $media = wall_upload_post($a); + if(strlen($media)>0) + $_REQUEST['body'] .= "\n\n".$media; + } + + // To-Do: Multiple IDs + if (requestdata('media_ids')) { + $r = q("SELECT `resource-id`, `scale`, `nickname`, `type` FROM `photo` INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = %d) AND `scale` > 0 AND `photo`.`uid` = %d ORDER BY `photo`.`width` DESC LIMIT 1", + intval(requestdata('media_ids')), api_user()); + if ($r) { + $phototypes = Photo::supportedTypes(); + $ext = $phototypes[$r[0]['type']]; + $_REQUEST['body'] .= "\n\n".'[url='.$a->get_baseurl().'/photos/'.$r[0]['nickname'].'/image/'.$r[0]['resource-id'].']'; + $_REQUEST['body'] .= '[img]'.$a->get_baseurl()."/photo/".$r[0]['resource-id']."-".$r[0]['scale'].".".$ext."[/img][/url]"; } } @@ -840,6 +858,41 @@ api_register_func('api/statuses/update_with_media','api_statuses_update', true); + function api_media_upload(&$a, $type) { + if (api_user()===false) { + logger('no user'); + return false; + } + + $user_info = api_get_user($a); + + if(!x($_FILES,'media')) { + // Output error + return false; + } + + require_once('mod/wall_upload.php'); + $media = wall_upload_post($a, false); + if(!$media) { + // Output error + return false; + } + + $returndata = array(); + $returndata["media_id"] = $media["id"]; + $returndata["media_id_string"] = (string)$media["id"]; + $returndata["size"] = $media["size"]; + $returndata["image"] = array("w" => $media["width"], + "h" => $media["height"], + "image_type" => $media["type"]); + + logger("Media uploaded: ".print_r($returndata, true), LOGGER_DEBUG); + + return array("media" => $returndata); + } + + api_register_func('api/media/upload','api_media_upload', true); + function api_status_show(&$a, $type){ $user_info = api_get_user($a); @@ -848,7 +901,7 @@ // get last public wall message $lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author` FROM `item`, `item` as `i` - WHERE `item`.`contact-id` = %d + WHERE `item`.`contact-id` = %d AND `item`.`uid` = %d AND ((`item`.`author-link` IN ('%s', '%s')) OR (`item`.`owner-link` IN ('%s', '%s'))) AND `i`.`id` = `item`.`parent` AND `item`.`type`!='activity' @@ -856,6 +909,7 @@ ORDER BY `item`.`created` DESC LIMIT 1", intval($user_info['cid']), + intval(api_user()), dbesc($user_info['url']), dbesc(normalise_link($user_info['url'])), dbesc($user_info['url']), @@ -1108,7 +1162,7 @@ if ($conversation_id > 0) $sql_extra .= ' AND `item`.`parent` = '.intval($conversation_id); - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, + $r = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, `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` @@ -1128,15 +1182,15 @@ $ret = api_format_items($r,$user_info); - // We aren't going to try to figure out at the item, group, and page - // level which items you've seen and which you haven't. If you're looking - // at the network timeline just mark everything seen. + // Set all posts from the query above to seen + $idarray = array(); + foreach ($r AS $item) + $idarray[] = intval($item["id"]); - $r = q("UPDATE `item` SET `unseen` = 0 - WHERE `unseen` = 1 AND `uid` = %d", - //intval($user_info['uid']) - intval(api_user()) - ); + $idlist = implode(",", $idarray); + + if ($idlist != "") + $r = q("UPDATE `item` SET `unseen` = 0 WHERE `unseen` AND `id` IN (%s)", $idlist); $data = array('$statuses' => $ret); @@ -1315,6 +1369,10 @@ logger('API: api_conversation_show: '.$id); + $r = q("SELECT `parent` FROM `item` WHERE `id` = %d", intval($id)); + if ($r) + $id = $r[0]["parent"]; + $sql_extra = ''; if ($max_id > 0) @@ -1389,10 +1447,8 @@ $pos = strpos($r[0]['body'], "[share"); $post = substr($r[0]['body'], $pos); } else { - $post = "[share author='".str_replace("'", "'", $r[0]['author-name']). - "' profile='".$r[0]['author-link']. - "' avatar='".$r[0]['author-avatar']. - "' link='".$r[0]['plink']."']"; + $post = share_header($r[0]['author-name'], $r[0]['author-link'], $r[0]['author-avatar'], $r[0]['guid'], $r[0]['created'], $r[0]['plink']); + $post .= $r[0]['body']; $post .= "[/share]"; } @@ -1643,7 +1699,8 @@ $user_info = api_get_user($a); - $ret = api_format_items($item,$user_info)[0]; + $rets = api_format_items($item,$user_info); + $ret = $rets[0]; $data = array('$status' => $ret); switch($type){ @@ -1875,8 +1932,6 @@ if (!$ret) return false; - require_once("include/Photo.php"); - $attachments = array(); foreach ($images[1] AS $image) { @@ -2002,7 +2057,6 @@ $start = iconv_strpos($text, $url, $offset, "UTF-8"); if (!($start === false)) { - require_once("include/Photo.php"); $image = get_photo_info($url); if ($image) { // If image cache is activated, then use the following sizes: @@ -2067,7 +2121,7 @@ $ret = Array(); foreach($r as $item) { - api_share_as_retweet($a, api_user(), $item); + api_share_as_retweet($item); localize_item($item); $status_user = api_item_get_user($a,$item); @@ -2619,7 +2673,71 @@ -function api_share_as_retweet($a, $uid, &$item) { + /** + * similar as /mod/redir.php + * redirect to 'url' after dfrn auth + * + * why this when there is mod/redir.php already? + * This use api_user() and api_login() + * + * params + * c_url: url of remote contact to auth to + * url: string, url to redirect after auth + */ + function api_friendica_remoteauth(&$a) { + $url = ((x($_GET,'url')) ? $_GET['url'] : ''); + $c_url = ((x($_GET,'c_url')) ? $_GET['c_url'] : ''); + + if ($url === '' || $c_url === '') + die((api_error($a, 'json', "Wrong parameters"))); + + $c_url = normalise_link($c_url); + + // traditional DFRN + + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `nurl` = '%s' LIMIT 1", + dbesc($c_url), + intval(api_user()) + ); + + if ((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN)) + die((api_error($a, 'json', "Unknown contact"))); + + $cid = $r[0]['id']; + + $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']); + + if($r[0]['duplex'] && $r[0]['issued-id']) { + $orig_id = $r[0]['issued-id']; + $dfrn_id = '1:' . $orig_id; + } + if($r[0]['duplex'] && $r[0]['dfrn-id']) { + $orig_id = $r[0]['dfrn-id']; + $dfrn_id = '0:' . $orig_id; + } + + $sec = random_string(); + + q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`) + VALUES( %d, %s, '%s', '%s', %d )", + intval(api_user()), + intval($cid), + dbesc($dfrn_id), + dbesc($sec), + intval(time() + 45) + ); + + logger($r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); + $dest = (($url) ? '&destination_url=' . $url : ''); + goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id + . '&dfrn_version=' . DFRN_PROTOCOL_VERSION + . '&type=profile&sec=' . $sec . $dest . $quiet ); + } + api_register_func('api/friendica/remoteauth', 'api_friendica_remoteauth', true); + + + +function api_share_as_retweet(&$item) { $body = trim($item["body"]); // Skip if it isn't a pure repeated messages @@ -2663,6 +2781,15 @@ function api_share_as_retweet($a, $uid, &$item) { if ($matches[1] != "") $avatar = $matches[1]; + $link = ""; + preg_match("/link='(.*?)'/ism", $attributes, $matches); + if ($matches[1] != "") + $link = $matches[1]; + + preg_match('/link="(.*?)"/ism', $attributes, $matches); + if ($matches[1] != "") + $link = $matches[1]; + $shared_body = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$2",$body); if (($shared_body == "") OR ($profile == "") OR ($author == "") OR ($avatar == "")) @@ -2672,6 +2799,7 @@ function api_share_as_retweet($a, $uid, &$item) { $item["author-name"] = $author; $item["author-link"] = $profile; $item["author-avatar"] = $avatar; + $item["plink"] = $link; return(true); @@ -2827,6 +2955,7 @@ function api_best_nickname(&$contacts) { $contacts = array($contacts[0]); } + /* Not implemented by now: statuses/retweets_of_me