} else {
$user_id = User::authenticate(trim($user), trim($password));
if ($user_id) {
- $record = dba::selectOne('user', [], ['uid' => $user_id]);
+ $record = dba::selectFirst('user', [], ['uid' => $user_id]);
}
}
*/
function api_unique_id_to_nurl($id)
{
- $r = dba::selectOne('contact', array('nurl'), array('uid' => 0, 'id' => $id));
+ $r = dba::selectFirst('contact', array('nurl'), array('uid' => 0, 'id' => $id));
if (DBM::is_result($r)) {
return $r["nurl"];
// If this is a local user and it uses Frio, we can get its color preferences.
if ($ret['self']) {
- $theme_info = dba::selectOne('user', ['theme'], ['uid' => $ret['uid']]);
+ $theme_info = dba::selectFirst('user', ['theme'], ['uid' => $ret['uid']]);
if ($theme_info['theme'] === 'frio') {
$schema = PConfig::get($ret['uid'], 'frio', 'schema');
if ($schema && ($schema != '---')) {
// traditional DFRN
- $r = dba::selectOne('contact', [], ['uid' => api_user(), 'nurl' => $c_url]);
+ $r = dba::selectFirst('contact', [], ['uid' => api_user(), 'nurl' => $c_url]);
if (!DBM::is_result($r) || ($r['network'] !== NETWORK_DFRN)) {
throw new BadRequestException("Unknown contact");
if (!$cid) {
if (get_my_url()) {
- $r = dba::selectOne('contact', ['id'],
+ $r = dba::selectFirst('contact', ['id'],
['nurl' => normalise_link(get_my_url()), 'uid' => $profile_uid]);
if (DBM::is_result($r)) {
$cid = $r['id'];
} else {
- $r = dba::selectOne('gcontact', ['id'], ['nurl' => normalise_link(get_my_url())]);
+ $r = dba::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(get_my_url())]);
if (DBM::is_result($r)) {
$zcid = $r['id'];
}
$clean_url = normalise_link($item['author-link']);
if (local_user()) {
- $r = dba::selectOne('contact', ['id'],
+ $r = dba::selectFirst('contact', ['id'],
['network' => NETWORK_DFRN, 'uid' => local_user(), 'nurl' => normalise_link($clean_url), 'pending' => false]);
if (DBM::is_result($r)) {
$best_url = 'redir/' . $r['id'];
$cid = 0;
$network = '';
$rel = 0;
- $r = dba::selectOne('contact', array('id', 'network', 'rel'), array('uid' => local_user(), 'nurl' => normalise_link($item['author-link'])));
+ $r = dba::selectFirst('contact', array('id', 'network', 'rel'), array('uid' => local_user(), 'nurl' => normalise_link($item['author-link'])));
if (DBM::is_result($r)) {
$cid = $r['id'];
$network = $r['network'];
if (is_bool($old_fields)) {
$do_insert = $old_fields;
- $old_fields = self::selectOne($table, [], $condition);
+ $old_fields = self::selectFirst($table, [], $condition);
if (is_bool($old_fields)) {
if ($do_insert) {
* @return bool|array
* @see dba::select
*/
- public static function selectOne($table, array $fields = [], array $condition = [], $params = [])
+ public static function selectFirst($table, array $fields = [], array $condition = [], $params = [])
{
$params['limit'] = 1;
$result = self::select($table, $fields, $condition, $params);
}
if ($params['type'] == NOTIFY_COMMENT) {
- $p = dba::selectOne('thread', ['ignored'], ['iid' => $parent_id]);
+ $p = dba::selectFirst('thread', ['ignored'], ['iid' => $parent_id]);
if (DBM::is_result($p) && $p["ignored"]) {
logger("Thread ".$parent_id." will be ignored", LOGGER_DEBUG);
return;
$p = null;
if ($params['otype'] === 'item' && $parent_id) {
- $p = dba::selectOne('item', [], ['id' => $parent_id]);
+ $p = dba::selectFirst('item', [], ['id' => $parent_id]);
}
$item_post_type = item_post_type($p);
$profiles = $notification_data["profiles"];
$fields = ['notify-flags', 'language', 'username', 'email', 'nickname'];
- $user = dba::selectOne('user', $fields, ['uid' => $uid]);
+ $user = dba::selectFirst('user', $fields, ['uid' => $uid]);
if (!DBM::is_result($user)) {
return false;
}
- $owner = dba::selectOne('contact', ['url'], ['self' => true, 'uid' => $uid]);
+ $owner = dba::selectFirst('contact', ['url'], ['self' => true, 'uid' => $uid]);
if (!DBM::is_result($owner)) {
return false;
}
if (remote_user() && count($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $uid) {
- $r = dba::selectOne('contact', ['profile-id'], ['id' => $visitor['cid']]);
+ $r = dba::selectFirst('contact', ['profile-id'], ['id' => $visitor['cid']]);
if (DBM::is_result($r)) {
$profile = $r['profile-id'];
}
// check for create date and expire time
$expire_interval = Config::get('system', 'dbclean-expire-days', 0);
- $user = dba::selectOne('user', ['expire'], ['uid' => $uid]);
+ $user = dba::selectFirst('user', ['expire'], ['uid' => $uid]);
if (DBM::is_result($user) && ($user['expire'] > 0) && (($user['expire'] < $expire_interval) || ($expire_interval == 0))) {
$expire_interval = $user['expire'];
}
*/
function item_set_last_item($arr) {
// Unarchive the author
- $contact = dba::selectOne('contact', [], ['id' => $arr["author-link"]]);
+ $contact = dba::selectFirst('contact', [], ['id' => $arr["author-link"]]);
if ($contact['term-date'] > NULL_DATE) {
Contact::unmarkForArchival($contact);
}
// Unarchive the contact if it is a toplevel posting
if ($arr["parent-uri"] === $arr["uri"]) {
- $contact = dba::selectOne('contact', [], ['id' => $arr["contact-id"]]);
+ $contact = dba::selectFirst('contact', [], ['id' => $arr["contact-id"]]);
if ($contact['term-date'] > NULL_DATE) {
Contact::unmarkForArchival($contact);
}
'subject' => $subject, 'recips' => $handles);
dba::insert('conv', $fields);
- $r = dba::selectOne('conv', ['id'], ['guid' => $conv_guid, 'uid' => local_user()]);
+ $r = dba::selectFirst('conv', ['id'], ['guid' => $conv_guid, 'uid' => local_user()]);
if (DBM::is_result($r)) {
$convid = $r['id'];
}
'subject' => $subject, 'recips' => $handles);
dba::insert('conv', $fields);
- $r = dba::selectOne('conv', ['id'], ['guid' => $conv_guid, 'uid' => $recipient['uid']]);
+ $r = dba::selectFirst('conv', ['id'], ['guid' => $conv_guid, 'uid' => $recipient['uid']]);
if (!DBM::is_result($r)) {
logger('send message: conversation not found.');
return -4;
$nav['usermenu'][] = array('notes/', t('Personal notes'), '', t('Your personal notes'));
// user info
- $r = dba::selectOne('contact', ['micro'], ['uid' => $a->user['uid'], 'self' => true]);
+ $r = dba::selectFirst('contact', ['micro'], ['uid' => $a->user['uid'], 'self' => true]);
$userinfo = array(
'icon' => (DBM::is_result($r) ? $a->remove_baseurl($r['micro']) : 'images/person-48.jpg'),
'name' => $a->user['username'],
return '';
}
- $r = dba::selectOne('session', ['data'], ['sid' => $id]);
+ $r = dba::selectFirst('session', ['data'], ['sid' => $id]);
if (DBM::is_result($r)) {
$session_exists = true;
return $r['data'];
$o = '';
$r = tagadelic($uid, $count, $owner_id, $flags, $type);
if (count($r)) {
- $contact = dba::selectOne('contact', ['url'], ['id' => $uid]);
+ $contact = dba::selectFirst('contact', ['url'], ['id' => $uid]);
$url = System::removedBaseUrl($contact['url']);
foreach ($r as $rr) {
*/
if (x($_SESSION, 'authenticated') && !x($_SESSION, 'language')) {
// we didn't loaded user data yet, but we need user language
- $r = dba::selectOne('user', ['language'], ['uid' => $_SESSION['uid']]);
+ $r = dba::selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]);
$_SESSION['language'] = $lang;
if (DBM::is_result($r)) {
$_SESSION['language'] = $r['language'];
{
if ($a->argc > 2) {
$uid = $a->argv[3];
- $user = dba::selectOne('user', ['username', 'blocked'], ['uid' => $uid]);
+ $user = dba::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
if (DBM::is_result($user)) {
notice('User not found' . EOL);
goaway('admin/users');
if ($a->argc > 1) {
$nick = $a->argv[1];
- $user = dba::selectOne('user', [], ['nickname' => $nick, 'blocked' => false]);
+ $user = dba::selectFirst('user', [], ['nickname' => $nick, 'blocked' => false]);
if (!DBM::is_result($user)) {
return;
}
}
if (!$cid && get_my_url()) {
- $contact = dba::selectOne('contact', ['id'], ['nurl' => normalise_link(get_my_url()), 'uid' => $uid]);
+ $contact = dba::selectFirst('contact', ['id'], ['nurl' => normalise_link(get_my_url()), 'uid' => $uid]);
if (DBM::is_result($contact)) {
$cid = $contact['id'];
} else {
- $gcontact = dba::selectOne('gcontact', ['id'], ['nurl' => normalise_link(get_my_url())]);
+ $gcontact = dba::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(get_my_url())]);
if (DBM::is_result($gcontact)) {
$zcid = $gcontact['id'];
}
$contact = [];
if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && ($a->argv[2] == "posts"))) {
$contact_id = intval($a->argv[1]);
- $contact = dba::selectOne('contact', [], ['id' => $contact_id, 'uid' => local_user()]);
+ $contact = dba::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]);
}
if (DBM::is_result($contact)) {
notice(t('Failed to update contact record.') . EOL);
}
- $contact = dba::selectOne('contact', [], ['id' => $contact_id, 'uid' => local_user()]);
+ $contact = dba::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]);
if (DBM::is_result($contact)) {
$a->data['contact'] = $contact;
}
function _contact_update($contact_id)
{
- $contact = dba::selectOne('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]);
+ $contact = dba::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]);
if (!DBM::is_result($contact)) {
return;
}
function _contact_update_profile($contact_id)
{
- $contact = dba::selectOne('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]);
+ $contact = dba::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]);
if (!DBM::is_result($contact)) {
return;
}
$cmd = $a->argv[2];
- $orig_record = dba::selectOne('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'self' => false]);
+ $orig_record = dba::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'self' => false]);
if (!DBM::is_result($orig_record)) {
notice(t('Could not access contact record.') . EOL);
goaway('contacts');
{
$o = contacts_tab($a, $contact_id, 1);
- $contact = dba::selectOne('contact', ['url'], ['id' => $contact_id]);
+ $contact = dba::selectFirst('contact', ['url'], ['id' => $contact_id]);
if (DBM::is_result($contact)) {
$a->page['aside'] = "";
profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
if ($update) {
$item_id = $_REQUEST['item_id'];
- $item = dba::selectOne('item', ['uid', 'parent'], ['id' => $item_id]);
+ $item = dba::selectFirst('item', ['uid', 'parent'], ['id' => $item_id]);
$a->profile = array('uid' => intval($item['uid']), 'profile_uid' => intval($item['uid']));
$item_parent = $item['parent'];
} else {
$s = dba::inArray($r);
if (local_user() && (local_user() == $a->profile['uid'])) {
- $unseen = dba::selectOne('item', ['id'], ['parent' => $s[0]['parent'], 'unseen' => true]);
+ $unseen = dba::selectFirst('item', ['id'], ['parent' => $s[0]['parent'], 'unseen' => true]);
if (DBM::is_result($unseen)) {
dba::update('item', array('unseen' => false), array('parent' => $s[0]['parent'], 'unseen' => true));
}
$cid = 0;
if (local_user() && strpos($profileurl, 'redir/') === 0) {
$cid = intval(substr($profileurl, 6));
- $r = dba::selectOne('contact', ['nurl'], ['id' => $cid]);
+ $r = dba::selectFirst('contact', ['nurl'], ['id' => $cid]);
$profileurl = defaults($r, 'nurl', '');
}
if ($cid) {
// If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor
$condition = ["`id` = ? AND (`forum` OR `prv`)", $cid];
- $contact = dba::selectOne('contact', ['addr', 'nick'], $condition);
+ $contact = dba::selectFirst('contact', ['addr', 'nick'], $condition);
if (DBM::is_result($contact)) {
if ($contact["addr"] != '') {
$content = "!".$contact["addr"];
$sql_nets = (($nets) ? sprintf(" and $sql_table.`network` = '%s' ", dbesc($nets)) : '');
if ($group) {
- $r = dba::selectOne('group', ['name'], ['id' => $group, 'uid' => $_SESSION['uid']]);
+ $r = dba::selectFirst('group', ['name'], ['id' => $group, 'uid' => $_SESSION['uid']]);
if (!DBM::is_result($r)) {
if ($update)
killme();
$contact_str_self = "";
$contact_str = implode(',',$contacts);
- $self = dba::selectOne('contact', ['id'], ['uid' => $_SESSION['uid'], 'self' => true]);
+ $self = dba::selectFirst('contact', ['id'], ['uid' => $_SESSION['uid'], 'self' => true]);
if (DBM::is_result($self)) {
$contact_str_self = $self["id"];
}
$fields = ['id', 'name', 'network', 'writable', 'nurl',
'forum', 'prv', 'contact-type', 'addr', 'thumb', 'location'];
$condition = ["`id` = ? AND (NOT `blocked` OR `pending`)", $cid];
- $r = dba::selectOne('contact', $fields, $condition);
+ $r = dba::selectFirst('contact', $fields, $condition);
if (DBM::is_result($r)) {
$sql_extra = " AND ".$sql_table.".`contact-id` = ".intval($cid);
// We display the last activity (post or login), reduced to year and week number
$last_active = 0;
$condition = ['uid' => $a->profile['uid'], 'self' => true];
- $contact = dba::selectOne('contact', ['last-item'], $condition);
+ $contact = dba::selectFirst('contact', ['last-item'], $condition);
if (DBM::is_result($contact)) {
$last_active = strtotime($contact['last-item']);
}
$condition = ['uid' => $a->profile['uid']];
- $user = dba::selectOne('user', ['login_date'], $condition);
+ $user = dba::selectFirst('user', ['login_date'], $condition);
if (DBM::is_result($user)) {
if ($last_active < strtotime($user['login_date'])) {
$last_active = strtotime($user['login_date']);
$r = array();
if (!$direct_cache && ($cachefile == '')) {
- $r = dba::selectOne('photo', ['data', 'desc'], ['resource-id' => $urlhash]);
+ $r = dba::selectFirst('photo', ['data', 'desc'], ['resource-id' => $urlhash]);
if (DBM::is_result($r)) {
$img_str = $r['data'];
$mime = $r['desc'];
}
$guid = $a->argv[2];
- $importer = dba::selectOne('user', [], ['guid' => $guid, 'account_expired' => false, 'account_removed' => false]);
+ $importer = dba::selectFirst('user', [], ['guid' => $guid, 'account_expired' => false, 'account_removed' => false]);
if (!DBM::is_result($importer)) {
http_status_exit(500);
}
require_once('include/acl_selectors.php');
- $profile = dba::selectOne('profile', [], ['is-default' => true, 'uid' => local_user()]);
+ $profile = dba::selectFirst('profile', [], ['is-default' => true, 'uid' => local_user()]);
if (!DBM::is_result($profile)) {
notice(t('Unable to find your profile. Please contact your admin.') . EOL);
return;
$condition = ["`uid` = ? AND `rel` = ? AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?",
$uid, CONTACT_IS_FRIEND, normalise_link($url),
normalise_link($url), $url, NETWORK_STATUSNET];
- $contact = dba::selectOne('contact', [], $condition);
+ $contact = dba::selectFirst('contact', [], $condition);
if (!DBM::is_result($contact)) {
notice(t("Contact wasn't found or can't be unfollowed."));
$condition = ["`uid` = ? AND `rel` = ? AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?",
local_user(), CONTACT_IS_FRIEND, normalise_link($url),
normalise_link($url), $url, NETWORK_STATUSNET];
- $contact = dba::selectOne('contact', ['url', 'network', 'addr', 'name'], $condition);
+ $contact = dba::selectFirst('contact', ['url', 'network', 'addr', 'name'], $condition);
if (!DBM::is_result($contact)) {
notice(t("You aren't a friend of this contact.").EOL);
$name = substr($local, 0, strpos($local, '@'));
}
- $r = dba::selectOne('user', [], ['nickname' => $name]);
+ $r = dba::selectFirst('user', [], ['nickname' => $name]);
if (!DBM::is_result($r)) {
killme();
}
-<?php\r
-\r
-/**\r
- * @file src/Content/OEmbed.php\r
- */\r
-\r
-namespace Friendica\Content;\r
-\r
-use Friendica\Core\Cache;\r
-use Friendica\Core\System;\r
-use Friendica\Core\Config;\r
-use Friendica\Database\DBM;\r
-use Friendica\Util\ParseUrl;\r
-use dba;\r
-use DOMDocument;\r
-use DOMXPath;\r
-use DOMNode;\r
-use Exception;\r
-\r
-require_once 'include/dba.php';\r
-require_once 'mod/proxy.php';\r
-\r
-/**\r
- * Handles all OEmbed content fetching and replacement\r
- *\r
- * OEmbed is a standard used to allow an embedded representation of a URL on\r
- * third party sites\r
- *\r
- * @see https://oembed.com\r
- *\r
- * @author Hypolite Petovan <mrpetovan@gmail.com>\r
- */\r
-class OEmbed\r
-{\r
- public static function replaceCallback($matches)\r
- {\r
- $embedurl = $matches[1];\r
- $j = self::fetchURL($embedurl);\r
- $s = self::formatObject($j);\r
-\r
- return $s;\r
- }\r
-\r
- /**\r
- * @brief Get data from an URL to embed its content.\r
- *\r
- * @param string $embedurl The URL from which the data should be fetched.\r
- * @param bool $no_rich_type If set to true rich type content won't be fetched.\r
- *\r
- * @return bool|object Returns object with embed content or false if no embedable\r
- * content exists\r
- */\r
- public static function fetchURL($embedurl, $no_rich_type = false)\r
- {\r
- $embedurl = trim($embedurl, "'");\r
- $embedurl = trim($embedurl, '"');\r
-\r
- $a = get_app();\r
-\r
- $condition = ['url' => normalise_link($embedurl)];\r
- $r = dba::selectOne('oembed', ['content'], $condition);\r
- if (DBM::is_result($r)) {\r
- $txt = $r["content"];\r
- } else {\r
- $txt = Cache::get($a->videowidth . $embedurl);\r
- }\r
- // These media files should now be caught in bbcode.php\r
- // left here as a fallback in case this is called from another source\r
-\r
- $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm");\r
- $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION);\r
-\r
-\r
- if (is_null($txt)) {\r
- $txt = "";\r
-\r
- if (!in_array($ext, $noexts)) {\r
- // try oembed autodiscovery\r
- $redirects = 0;\r
- $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*");\r
- if ($html_text) {\r
- $dom = @DOMDocument::loadHTML($html_text);\r
- if ($dom) {\r
- $xpath = new DOMXPath($dom);\r
- $entries = $xpath->query("//link[@type='application/json+oembed']");\r
- foreach ($entries as $e) {\r
- $href = $e->getAttributeNode("href")->nodeValue;\r
- $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);\r
- break;\r
- }\r
- $entries = $xpath->query("//link[@type='text/json+oembed']");\r
- foreach ($entries as $e) {\r
- $href = $e->getAttributeNode("href")->nodeValue;\r
- $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- $txt = trim($txt);\r
-\r
- if (!$txt || $txt[0] != "{") {\r
- $txt = '{"type":"error"}';\r
- } else { //save in cache\r
- $j = json_decode($txt);\r
- if ($j->type != "error") {\r
- dba::insert('oembed', array('url' => normalise_link($embedurl),\r
- 'content' => $txt, 'created' => datetime_convert()), true);\r
- }\r
-\r
- Cache::set($a->videowidth . $embedurl, $txt, CACHE_DAY);\r
- }\r
- }\r
-\r
- $j = json_decode($txt);\r
-\r
- if (!is_object($j)) {\r
- return false;\r
- }\r
-\r
- // Always embed the SSL version\r
- if (isset($j->html)) {\r
- $j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html);\r
- }\r
-\r
- $j->embedurl = $embedurl;\r
-\r
- // If fetching information doesn't work, then improve via internal functions\r
- if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) {\r
- $data = ParseUrl::getSiteinfoCached($embedurl, true, false);\r
- $j->type = $data["type"];\r
-\r
- if ($j->type == "photo") {\r
- $j->url = $data["url"];\r
- //$j->width = $data["images"][0]["width"];\r
- //$j->height = $data["images"][0]["height"];\r
- }\r
-\r
- if (isset($data["title"])) {\r
- $j->title = $data["title"];\r
- }\r
-\r
- if (isset($data["text"])) {\r
- $j->description = $data["text"];\r
- }\r
-\r
- if (is_array($data["images"])) {\r
- $j->thumbnail_url = $data["images"][0]["src"];\r
- $j->thumbnail_width = $data["images"][0]["width"];\r
- $j->thumbnail_height = $data["images"][0]["height"];\r
- }\r
- }\r
-\r
- call_hooks('oembed_fetch_url', $embedurl, $j);\r
-\r
- return $j;\r
- }\r
-\r
- public static function formatObject($j)\r
- {\r
- $embedurl = $j->embedurl;\r
- $jhtml = $j->html;\r
- $ret = '<div class="oembed ' . $j->type . '">';\r
- switch ($j->type) {\r
- case "video":\r
- if (isset($j->thumbnail_url)) {\r
- $tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width : 200;\r
- $th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height : 180;\r
- // make sure we don't attempt divide by zero, fallback is a 1:1 ratio\r
- $tr = (($th) ? $tw / $th : 1);\r
-\r
- $th = 120;\r
- $tw = $th * $tr;\r
- $tpl = get_markup_template('oembed_video.tpl');\r
- $ret .= replace_macros($tpl, array(\r
- '$baseurl' => System::baseUrl(),\r
- '$embedurl' => $embedurl,\r
- '$escapedhtml' => base64_encode($jhtml),\r
- '$tw' => $tw,\r
- '$th' => $th,\r
- '$turl' => $j->thumbnail_url,\r
- ));\r
- } else {\r
- $ret = $jhtml;\r
- }\r
- break;\r
- case "photo":\r
- $ret .= '<img width="' . $j->width . '" src="' . proxy_url($j->url) . '">';\r
- break;\r
- case "link":\r
- break;\r
- case "rich":\r
- if (self::isAllowedURL($embedurl)) {\r
- $ret .= proxy_parse_html($jhtml);\r
- }\r
- break;\r
- }\r
-\r
- $ret .= '</div>';\r
- // add link to source if not present in "rich" type\r
- if ($j->type != 'rich' || !strpos($j->html, $embedurl)) {\r
- $ret .= '<h4>';\r
- if (isset($j->title)) {\r
- if (isset($j->provider_name)) {\r
- $ret .= $j->provider_name . ": ";\r
- }\r
-\r
- $embedlink = (isset($j->title)) ? $j->title : $embedurl;\r
- $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $embedlink . '</a>';\r
- if (isset($j->author_name)) {\r
- $ret .= ' (' . $j->author_name . ')';\r
- }\r
- } elseif (isset($j->provider_name) || isset($j->author_name)) {\r
- $embedlink = "";\r
- if (isset($j->provider_name)) {\r
- $embedlink .= $j->provider_name;\r
- }\r
-\r
- if (isset($j->author_name)) {\r
- if ($embedlink != "") {\r
- $embedlink .= ": ";\r
- }\r
-\r
- $embedlink .= $j->author_name;\r
- }\r
- if (trim($embedlink) == "") {\r
- $embedlink = $embedurl;\r
- }\r
-\r
- $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $embedlink . '</a>';\r
- }\r
- $ret .= "</h4>";\r
- } elseif (!strpos($j->html, $embedurl)) {\r
- // add <a> for html2bbcode conversion\r
- $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $j->title . '</a>';\r
- }\r
-\r
- $ret = str_replace("\n", "", $ret);\r
- return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret));\r
- }\r
-\r
- public static function BBCode2HTML($text)\r
- {\r
- $stopoembed = Config::get("system", "no_oembed");\r
- if ($stopoembed == true) {\r
- return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "<!-- oembed $1 --><i>" . t('Embedding disabled') . " : $1</i><!-- /oembed $1 -->", $text);\r
- }\r
- return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text);\r
- }\r
-\r
- /**\r
- * Find <span class='oembed'>..<a href='url' rel='oembed'>..</a></span>\r
- * and replace it with [embed]url[/embed]\r
- */\r
- public static function HTML2BBCode($text)\r
- {\r
- // start parser only if 'oembed' is in text\r
- if (strpos($text, "oembed")) {\r
-\r
- // convert non ascii chars to html entities\r
- $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text));\r
-\r
- // If it doesn't parse at all, just return the text.\r
- $dom = @DOMDocument::loadHTML($html_text);\r
- if (!$dom) {\r
- return $text;\r
- }\r
- $xpath = new DOMXPath($dom);\r
-\r
- $xattr = self::buildXPath("class", "oembed");\r
- $entries = $xpath->query("//div[$xattr]");\r
-\r
- $xattr = "@rel='oembed'"; //oe_build_xpath("rel","oembed");\r
- foreach ($entries as $e) {\r
- $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue;\r
- if (!is_null($href)) {\r
- $e->parentNode->replaceChild(new DOMText("[embed]" . $href . "[/embed]"), $e);\r
- }\r
- }\r
- return self::getInnerHTML($dom->getElementsByTagName("body")->item(0));\r
- } else {\r
- return $text;\r
- }\r
- }\r
-\r
- /**\r
- * Determines if rich content OEmbed is allowed for the provided URL\r
- *\r
- * @brief Determines if rich content OEmbed is allowed for the provided URL\r
- * @param string $url\r
- * @return boolean\r
- */\r
- public static function isAllowedURL($url)\r
- {\r
- if (!Config::get('system', 'no_oembed_rich_content')) {\r
- return true;\r
- }\r
-\r
- $domain = parse_url($url, PHP_URL_HOST);\r
- if (!x($domain)) {\r
- return false;\r
- }\r
-\r
- $str_allowed = Config::get('system', 'allowed_oembed', '');\r
- if (!x($str_allowed)) {\r
- return false;\r
- }\r
- \r
- $allowed = explode(',', $str_allowed);\r
-\r
- return allowed_domain($domain, $allowed);\r
- }\r
-\r
- public static function getHTML($url, $title = null)\r
- {\r
- // Always embed the SSL version\r
- $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"),\r
- array("https://www.youtube.com/", "https://player.vimeo.com/"), $url);\r
-\r
- $o = OEmbed::fetchURL($url);\r
-\r
- if (!is_object($o) || $o->type == 'error') {\r
- throw new Exception('OEmbed failed for URL: ' . $url);\r
- }\r
-\r
- if (x($title)) {\r
- $o->title = $title;\r
- }\r
-\r
- $html = OEmbed::formatObject($o);\r
-\r
- return $html;\r
- }\r
-\r
- /**\r
- * @brief Generates the iframe HTML for an oembed attachment.\r
- *\r
- * Width and height are given by the remote, and are regularly too small for\r
- * the generated iframe.\r
- *\r
- * The width is entirely discarded for the actual width of the post, while fixed\r
- * height is used as a starting point before the inevitable resizing.\r
- *\r
- * Since the iframe is automatically resized on load, there are no need for ugly\r
- * and impractical scrollbars.\r
- *\r
- * @todo This function is currently unused until someoneâ„¢ adds support for a separate OEmbed domain\r
- *\r
- * @param string $src Original remote URL to embed\r
- * @param string $width\r
- * @param string $height\r
- * @return string formatted HTML\r
- *\r
- * @see oembed_format_object()\r
- */\r
- private static function iframe($src, $width, $height)\r
- {\r
- $a = get_app();\r
-\r
- if (!$height || strstr($height, '%')) {\r
- $height = '200';\r
- }\r
- $width = '100%';\r
-\r
- $src = System::baseUrl() . '/oembed/' . base64url_encode($src);\r
- return '<iframe onload="resizeIframe(this);" class="embed_rich" height="' . $height . '" width="' . $width . '" src="' . $src . '" allowfullscreen scrolling="no" frameborder="no">' . t('Embedded content') . '</iframe>';\r
- }\r
-\r
- /**\r
- * Generates an XPath query to select elements whose provided attribute contains\r
- * the provided value in a space-separated list.\r
- *\r
- * @brief Generates attribute search XPath string\r
- *\r
- * @param string $attr Name of the attribute to seach\r
- * @param string $value Value to search in a space-separated list\r
- * @return string\r
- */\r
- private static function buildXPath($attr, $value)\r
- {\r
- // https://www.westhoffswelt.de/blog/2009/6/9/select-html-elements-with-more-than-one-css-class-using-xpath\r
- return "contains(normalize-space(@$attr), ' $value ') or substring(normalize-space(@$attr), 1, string-length('$value') + 1) = '$value ' or substring(normalize-space(@$attr), string-length(@$attr) - string-length('$value')) = ' $value' or @$attr = '$value'";\r
- }\r
-\r
- /**\r
- * Returns the inner XML string of a provided DOMNode\r
- *\r
- * @brief Returns the inner XML string of a provided DOMNode\r
- *\r
- * @param DOMNode $node\r
- * @return string\r
- */\r
- private static function getInnerHTML(DOMNode $node)\r
- {\r
- $innerHTML = '';\r
- $children = $node->childNodes;\r
- foreach ($children as $child) {\r
- $innerHTML .= $child->ownerDocument->saveXML($child);\r
- }\r
- return $innerHTML;\r
- }\r
-\r
-}\r
+<?php
+
+/**
+ * @file src/Content/OEmbed.php
+ */
+
+namespace Friendica\Content;
+
+use Friendica\Core\Cache;
+use Friendica\Core\System;
+use Friendica\Core\Config;
+use Friendica\Database\DBM;
+use Friendica\Util\ParseUrl;
+use dba;
+use DOMDocument;
+use DOMXPath;
+use DOMNode;
+use Exception;
+
+require_once 'include/dba.php';
+require_once 'mod/proxy.php';
+
+/**
+ * Handles all OEmbed content fetching and replacement
+ *
+ * OEmbed is a standard used to allow an embedded representation of a URL on
+ * third party sites
+ *
+ * @see https://oembed.com
+ *
+ * @author Hypolite Petovan <mrpetovan@gmail.com>
+ */
+class OEmbed
+{
+ public static function replaceCallback($matches)
+ {
+ $embedurl = $matches[1];
+ $j = self::fetchURL($embedurl);
+ $s = self::formatObject($j);
+
+ return $s;
+ }
+
+ /**
+ * @brief Get data from an URL to embed its content.
+ *
+ * @param string $embedurl The URL from which the data should be fetched.
+ * @param bool $no_rich_type If set to true rich type content won't be fetched.
+ *
+ * @return bool|object Returns object with embed content or false if no embedable
+ * content exists
+ */
+ public static function fetchURL($embedurl, $no_rich_type = false)
+ {
+ $embedurl = trim($embedurl, "'");
+ $embedurl = trim($embedurl, '"');
+
+ $a = get_app();
+
+ $condition = ['url' => normalise_link($embedurl)];
+ $r = dba::selectFirst('oembed', ['content'], $condition);
+ if (DBM::is_result($r)) {
+ $txt = $r["content"];
+ } else {
+ $txt = Cache::get($a->videowidth . $embedurl);
+ }
+ // These media files should now be caught in bbcode.php
+ // left here as a fallback in case this is called from another source
+
+ $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm");
+ $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION);
+
+
+ if (is_null($txt)) {
+ $txt = "";
+
+ if (!in_array($ext, $noexts)) {
+ // try oembed autodiscovery
+ $redirects = 0;
+ $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*");
+ if ($html_text) {
+ $dom = @DOMDocument::loadHTML($html_text);
+ if ($dom) {
+ $xpath = new DOMXPath($dom);
+ $entries = $xpath->query("//link[@type='application/json+oembed']");
+ foreach ($entries as $e) {
+ $href = $e->getAttributeNode("href")->nodeValue;
+ $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
+ break;
+ }
+ $entries = $xpath->query("//link[@type='text/json+oembed']");
+ foreach ($entries as $e) {
+ $href = $e->getAttributeNode("href")->nodeValue;
+ $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
+ break;
+ }
+ }
+ }
+ }
+
+ $txt = trim($txt);
+
+ if (!$txt || $txt[0] != "{") {
+ $txt = '{"type":"error"}';
+ } else { //save in cache
+ $j = json_decode($txt);
+ if ($j->type != "error") {
+ dba::insert('oembed', array('url' => normalise_link($embedurl),
+ 'content' => $txt, 'created' => datetime_convert()), true);
+ }
+
+ Cache::set($a->videowidth . $embedurl, $txt, CACHE_DAY);
+ }
+ }
+
+ $j = json_decode($txt);
+
+ if (!is_object($j)) {
+ return false;
+ }
+
+ // Always embed the SSL version
+ if (isset($j->html)) {
+ $j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html);
+ }
+
+ $j->embedurl = $embedurl;
+
+ // If fetching information doesn't work, then improve via internal functions
+ if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) {
+ $data = ParseUrl::getSiteinfoCached($embedurl, true, false);
+ $j->type = $data["type"];
+
+ if ($j->type == "photo") {
+ $j->url = $data["url"];
+ //$j->width = $data["images"][0]["width"];
+ //$j->height = $data["images"][0]["height"];
+ }
+
+ if (isset($data["title"])) {
+ $j->title = $data["title"];
+ }
+
+ if (isset($data["text"])) {
+ $j->description = $data["text"];
+ }
+
+ if (is_array($data["images"])) {
+ $j->thumbnail_url = $data["images"][0]["src"];
+ $j->thumbnail_width = $data["images"][0]["width"];
+ $j->thumbnail_height = $data["images"][0]["height"];
+ }
+ }
+
+ call_hooks('oembed_fetch_url', $embedurl, $j);
+
+ return $j;
+ }
+
+ public static function formatObject($j)
+ {
+ $embedurl = $j->embedurl;
+ $jhtml = $j->html;
+ $ret = '<div class="oembed ' . $j->type . '">';
+ switch ($j->type) {
+ case "video":
+ if (isset($j->thumbnail_url)) {
+ $tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width : 200;
+ $th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height : 180;
+ // make sure we don't attempt divide by zero, fallback is a 1:1 ratio
+ $tr = (($th) ? $tw / $th : 1);
+
+ $th = 120;
+ $tw = $th * $tr;
+ $tpl = get_markup_template('oembed_video.tpl');
+ $ret .= replace_macros($tpl, array(
+ '$baseurl' => System::baseUrl(),
+ '$embedurl' => $embedurl,
+ '$escapedhtml' => base64_encode($jhtml),
+ '$tw' => $tw,
+ '$th' => $th,
+ '$turl' => $j->thumbnail_url,
+ ));
+ } else {
+ $ret = $jhtml;
+ }
+ break;
+ case "photo":
+ $ret .= '<img width="' . $j->width . '" src="' . proxy_url($j->url) . '">';
+ break;
+ case "link":
+ break;
+ case "rich":
+ if (self::isAllowedURL($embedurl)) {
+ $ret .= proxy_parse_html($jhtml);
+ }
+ break;
+ }
+
+ $ret .= '</div>';
+ // add link to source if not present in "rich" type
+ if ($j->type != 'rich' || !strpos($j->html, $embedurl)) {
+ $ret .= '<h4>';
+ if (isset($j->title)) {
+ if (isset($j->provider_name)) {
+ $ret .= $j->provider_name . ": ";
+ }
+
+ $embedlink = (isset($j->title)) ? $j->title : $embedurl;
+ $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $embedlink . '</a>';
+ if (isset($j->author_name)) {
+ $ret .= ' (' . $j->author_name . ')';
+ }
+ } elseif (isset($j->provider_name) || isset($j->author_name)) {
+ $embedlink = "";
+ if (isset($j->provider_name)) {
+ $embedlink .= $j->provider_name;
+ }
+
+ if (isset($j->author_name)) {
+ if ($embedlink != "") {
+ $embedlink .= ": ";
+ }
+
+ $embedlink .= $j->author_name;
+ }
+ if (trim($embedlink) == "") {
+ $embedlink = $embedurl;
+ }
+
+ $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $embedlink . '</a>';
+ }
+ $ret .= "</h4>";
+ } elseif (!strpos($j->html, $embedurl)) {
+ // add <a> for html2bbcode conversion
+ $ret .= '<a href="' . $embedurl . '" rel="oembed">' . $j->title . '</a>';
+ }
+
+ $ret = str_replace("\n", "", $ret);
+ return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret));
+ }
+
+ public static function BBCode2HTML($text)
+ {
+ $stopoembed = Config::get("system", "no_oembed");
+ if ($stopoembed == true) {
+ return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "<!-- oembed $1 --><i>" . t('Embedding disabled') . " : $1</i><!-- /oembed $1 -->", $text);
+ }
+ return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text);
+ }
+
+ /**
+ * Find <span class='oembed'>..<a href='url' rel='oembed'>..</a></span>
+ * and replace it with [embed]url[/embed]
+ */
+ public static function HTML2BBCode($text)
+ {
+ // start parser only if 'oembed' is in text
+ if (strpos($text, "oembed")) {
+
+ // convert non ascii chars to html entities
+ $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text));
+
+ // If it doesn't parse at all, just return the text.
+ $dom = @DOMDocument::loadHTML($html_text);
+ if (!$dom) {
+ return $text;
+ }
+ $xpath = new DOMXPath($dom);
+
+ $xattr = self::buildXPath("class", "oembed");
+ $entries = $xpath->query("//div[$xattr]");
+
+ $xattr = "@rel='oembed'"; //oe_build_xpath("rel","oembed");
+ foreach ($entries as $e) {
+ $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue;
+ if (!is_null($href)) {
+ $e->parentNode->replaceChild(new DOMText("[embed]" . $href . "[/embed]"), $e);
+ }
+ }
+ return self::getInnerHTML($dom->getElementsByTagName("body")->item(0));
+ } else {
+ return $text;
+ }
+ }
+
+ /**
+ * Determines if rich content OEmbed is allowed for the provided URL
+ *
+ * @brief Determines if rich content OEmbed is allowed for the provided URL
+ * @param string $url
+ * @return boolean
+ */
+ public static function isAllowedURL($url)
+ {
+ if (!Config::get('system', 'no_oembed_rich_content')) {
+ return true;
+ }
+
+ $domain = parse_url($url, PHP_URL_HOST);
+ if (!x($domain)) {
+ return false;
+ }
+
+ $str_allowed = Config::get('system', 'allowed_oembed', '');
+ if (!x($str_allowed)) {
+ return false;
+ }
+
+ $allowed = explode(',', $str_allowed);
+
+ return allowed_domain($domain, $allowed);
+ }
+
+ public static function getHTML($url, $title = null)
+ {
+ // Always embed the SSL version
+ $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"),
+ array("https://www.youtube.com/", "https://player.vimeo.com/"), $url);
+
+ $o = OEmbed::fetchURL($url);
+
+ if (!is_object($o) || $o->type == 'error') {
+ throw new Exception('OEmbed failed for URL: ' . $url);
+ }
+
+ if (x($title)) {
+ $o->title = $title;
+ }
+
+ $html = OEmbed::formatObject($o);
+
+ return $html;
+ }
+
+ /**
+ * @brief Generates the iframe HTML for an oembed attachment.
+ *
+ * Width and height are given by the remote, and are regularly too small for
+ * the generated iframe.
+ *
+ * The width is entirely discarded for the actual width of the post, while fixed
+ * height is used as a starting point before the inevitable resizing.
+ *
+ * Since the iframe is automatically resized on load, there are no need for ugly
+ * and impractical scrollbars.
+ *
+ * @todo This function is currently unused until someoneâ„¢ adds support for a separate OEmbed domain
+ *
+ * @param string $src Original remote URL to embed
+ * @param string $width
+ * @param string $height
+ * @return string formatted HTML
+ *
+ * @see oembed_format_object()
+ */
+ private static function iframe($src, $width, $height)
+ {
+ $a = get_app();
+
+ if (!$height || strstr($height, '%')) {
+ $height = '200';
+ }
+ $width = '100%';
+
+ $src = System::baseUrl() . '/oembed/' . base64url_encode($src);
+ return '<iframe onload="resizeIframe(this);" class="embed_rich" height="' . $height . '" width="' . $width . '" src="' . $src . '" allowfullscreen scrolling="no" frameborder="no">' . t('Embedded content') . '</iframe>';
+ }
+
+ /**
+ * Generates an XPath query to select elements whose provided attribute contains
+ * the provided value in a space-separated list.
+ *
+ * @brief Generates attribute search XPath string
+ *
+ * @param string $attr Name of the attribute to seach
+ * @param string $value Value to search in a space-separated list
+ * @return string
+ */
+ private static function buildXPath($attr, $value)
+ {
+ // https://www.westhoffswelt.de/blog/2009/6/9/select-html-elements-with-more-than-one-css-class-using-xpath
+ return "contains(normalize-space(@$attr), ' $value ') or substring(normalize-space(@$attr), 1, string-length('$value') + 1) = '$value ' or substring(normalize-space(@$attr), string-length(@$attr) - string-length('$value')) = ' $value' or @$attr = '$value'";
+ }
+
+ /**
+ * Returns the inner XML string of a provided DOMNode
+ *
+ * @brief Returns the inner XML string of a provided DOMNode
+ *
+ * @param DOMNode $node
+ * @return string
+ */
+ private static function getInnerHTML(DOMNode $node)
+ {
+ $innerHTML = '';
+ $children = $node->childNodes;
+ foreach ($children as $child) {
+ $innerHTML .= $child->ownerDocument->saveXML($child);
+ }
+ return $innerHTML;
+ }
+
+}
// Frequently clear cache
self::clear();
- $r = dba::selectOne('cache', ['v'], ['k' => $key]);
+ $r = dba::selectFirst('cache', ['v'], ['k' => $key]);
if (DBM::is_result($r)) {
$cached = $r['v'];
}
}
- $ret = dba::selectOne('config', ['v'], ['cat' => $family, 'k' => $key]);
+ $ret = dba::selectFirst('config', ['v'], ['cat' => $family, 'k' => $key]);
if (DBM::is_result($ret)) {
// manage array value
$val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret['v']) ? unserialize($ret['v']) : $ret['v']);
}
}
- $ret = dba::selectOne('pconfig', ['v'], ['uid' => $uid, 'cat' => $family, 'k' => $key]);
+ $ret = dba::selectFirst('pconfig', ['v'], ['uid' => $uid, 'cat' => $family, 'k' => $key]);
if (DBM::is_result($ret)) {
$val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret['v']) ? unserialize($ret['v']) : $ret['v']);
$a->config[$uid][$family][$key] = $val;
private static function highestPriority()
{
$condition = array("`executed` <= ? AND NOT `done`", NULL_DATE);
- $s = dba::selectOne('workerqueue', ['priority'], $condition, ['order' => ['priority']]);
+ $s = dba::selectFirst('workerqueue', ['priority'], $condition, ['order' => ['priority']]);
if (DBM::is_result($s)) {
return $s["priority"];
} else {
return true;
}
- $user = dba::selectOne('user', ['uid', 'username', 'nickname'], ['uid' => $uid]);
+ $user = dba::selectFirst('user', ['uid', 'username', 'nickname'], ['uid' => $uid]);
if (!DBM::is_result($user)) {
return false;
}
public static function remove($id)
{
// We want just to make sure that we don't delete our "self" contact
- $r = dba::selectOne('contact', ['uid'], ['id' => $id, 'self' => false]);
+ $r = dba::selectFirst('contact', ['uid'], ['id' => $id, 'self' => false]);
if (!DBM::is_result($r) || !intval($r['uid'])) {
return;
return $menu;
}
- $r = dba::selectOne('contact', [], ['nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid]);
+ $r = dba::selectFirst('contact', [], ['nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid]);
if ($r) {
return self::photoMenu($r, $uid);
} else {
/// @todo Verify if we can't use Contact::getDetailsByUrl instead of the following
// We first try the nurl (http://server.tld/nick), most common case
- $contact = dba::selectOne('contact', ['id', 'avatar-date'], ['nurl' => normalise_link($url), 'uid' => $uid]);
+ $contact = dba::selectFirst('contact', ['id', 'avatar-date'], ['nurl' => normalise_link($url), 'uid' => $uid]);
// Then the addr (nick@server.tld)
if (!DBM::is_result($contact)) {
- $contact = dba::selectOne('contact', ['id', 'avatar-date'], ['addr' => $url, 'uid' => $uid]);
+ $contact = dba::selectFirst('contact', ['id', 'avatar-date'], ['addr' => $url, 'uid' => $uid]);
}
// Then the alias (which could be anything)
if (!DBM::is_result($contact)) {
// The link could be provided as http although we stored it as https
$ssl_url = str_replace('http://', 'https://', $url);
- $r = dba::selectOne('contact', ['id', 'avatar', 'avatar-date'], ['`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid]);
+ $r = dba::selectFirst('contact', ['id', 'avatar', 'avatar-date'], ['`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid]);
$contact = dba::fetch($r);
dba::close($r);
}
}
// Get data from the gcontact table
- $gcontacts = dba::selectOne('gcontact', ['name', 'nick', 'url', 'photo', 'addr', 'alias', 'network'], ['nurl' => normalise_link($url)]);
+ $gcontacts = dba::selectFirst('gcontact', ['name', 'nick', 'url', 'photo', 'addr', 'alias', 'network'], ['nurl' => normalise_link($url)]);
if (!DBM::is_result($gcontacts)) {
return 0;
}
$contact_id = $contacts[0]["id"];
// Update the newly created contact from data in the gcontact table
- $gcontact = dba::selectOne('gcontact', ['location', 'about', 'keywords', 'gender'], ['nurl' => normalise_link($data["url"])]);
+ $gcontact = dba::selectFirst('gcontact', ['location', 'about', 'keywords', 'gender'], ['nurl' => normalise_link($data["url"])]);
if (DBM::is_result($gcontact)) {
// Only use the information when the probing hadn't fetched these values
if ($data['keywords'] != '') {
self::updateAvatar($data["photo"], $uid, $contact_id);
$fields = ['url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date', 'pubkey'];
- $contact = dba::selectOne('contact', $fields, ['id' => $contact_id]);
+ $contact = dba::selectFirst('contact', $fields, ['id' => $contact_id]);
// This condition should always be true
if (!DBM::is_result($contact)) {
return false;
}
- $blocked = dba::selectOne('contact', ['blocked'], ['id' => $cid]);
+ $blocked = dba::selectFirst('contact', ['blocked'], ['id' => $cid]);
if (!DBM::is_result($blocked)) {
return false;
}
return false;
}
- $hidden = dba::selectOne('contact', ['hidden'], ['id' => $cid]);
+ $hidden = dba::selectFirst('contact', ['hidden'], ['id' => $cid]);
if (!DBM::is_result($hidden)) {
return false;
}
public static function updateAvatar($avatar, $uid, $cid, $force = false)
{
// Limit = 1 returns the row so no need for dba:inArray()
- $r = dba::selectOne('contact', ['avatar', 'photo', 'thumb', 'micro', 'nurl'], ['id' => $cid]);
+ $r = dba::selectFirst('contact', ['avatar', 'photo', 'thumb', 'micro', 'nurl'], ['id' => $cid]);
if (!DBM::is_result($r)) {
return false;
} else {
// Update the public contact (contact id = 0)
if ($uid != 0) {
- $pcontact = dba::selectOne('contact', ['id'], ['nurl' => $r[0]['nurl']]);
+ $pcontact = dba::selectFirst('contact', ['id'], ['nurl' => $r[0]['nurl']]);
if (DBM::is_result($pcontact)) {
self::updateAvatar($avatar, 0, $pcontact['id'], $force);
}
This will reliably kill your communication with Friendica contacts.
*/
- $r = dba::selectOne('contact', ['url', 'nurl', 'addr', 'alias', 'batch', 'notify', 'poll', 'poco', 'network'], ['id' => $id]);
+ $r = dba::selectFirst('contact', ['url', 'nurl', 'addr', 'alias', 'batch', 'notify', 'poll', 'poco', 'network'], ['id' => $id]);
if (!DBM::is_result($r)) {
return false;
}
);
}
- $r = dba::selectOne('contact', ['url' => $ret['url'], 'network' => $ret['network'], 'uid' => $uid]);
+ $r = dba::selectFirst('contact', ['url' => $ret['url'], 'network' => $ret['network'], 'uid' => $uid]);
if (!DBM::is_result($r)) {
$result['message'] .= t('Unable to retrieve contact information.') . EOL;
'network', 'bd', 'gender',
'keywords', 'alias', 'contact-type',
'url', 'location', 'about');
- $old_contact = dba::selectOne('contact', $fields, ['id' => $r[0]["id"]]);
+ $old_contact = dba::selectFirst('contact', $fields, ['id' => $r[0]["id"]]);
// Update it with the current values
$fields = array('name' => $contact['name'], 'nick' => $contact['nick'],
// all the old members are gone, but the group remains so we don't break any security
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group members.
- $group = dba::selectOne('group', ['deleted'], ['id' => $gid]);
+ $group = dba::selectFirst('group', ['deleted'], ['id' => $gid]);
if (DBM::is_result($group) && $group['deleted']) {
dba::update('group', ['deleted' => 0], ['gid' => $gid]);
notice(t('A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
return false;
}
- $group = dba::selectOne('group', ['id'], ['uid' => $uid, 'name' => $name]);
+ $group = dba::selectFirst('group', ['id'], ['uid' => $uid, 'name' => $name]);
if (DBM::is_result($group)) {
return $group['id'];
}
return false;
}
- $group = dba::selectOne('group', ['uid'], ['gid' => $gid]);
+ $group = dba::selectFirst('group', ['uid'], ['gid' => $gid]);
if (!DBM::is_result($group)) {
return false;
}
// remove group from default posting lists
- $user = dba::selectOne('user', ['def_gid', 'allow_gid', 'deny_gid'], ['uid' => $group['uid']]);
+ $user = dba::selectFirst('user', ['def_gid', 'allow_gid', 'deny_gid'], ['uid' => $group['uid']]);
if (DBM::is_result($user)) {
$change = false;
*/
public static function store(Image $Image, $uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '', $desc = '')
{
- $r = dba::selectOne('photo', ['guid'], ["`resource-id` = ? AND `guid` != ?", $rid, '']);
+ $r = dba::selectFirst('photo', ['guid'], ["`resource-id` = ? AND `guid` != ?", $rid, '']);
if (DBM::is_result($r)) {
$guid = $r['guid'];
} else {
$guid = get_guid();
}
- $x = dba::selectOne('photo', ['id'], ['resource-id' => $rid, 'uid' => $uid, 'contact-id' => $cid, 'scale' => $scale]);
+ $x = dba::selectFirst('photo', ['id'], ['resource-id' => $rid, 'uid' => $uid, 'contact-id' => $cid, 'scale' => $scale]);
$fields = array(
'uid' => $uid,
*/
public static function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false)
{
- $r = dba::selectOne(
+ $r = dba::selectFirst(
'photo', ['resource-id'], ['uid' => $uid, 'contact-id' => $cid, 'scale' => 4, 'album' => 'Contact Photos']
);
return $default_group;
}
- $user = dba::selectOne('user', ['def_gid'], ['uid' => $uid]);
+ $user = dba::selectFirst('user', ['def_gid'], ['uid' => $uid]);
if (DBM::is_result($user)) {
$default_group = $user["def_gid"];
if (is_object($user_info)) {
$user = (array) $user_info;
} elseif (is_int($user_info)) {
- $user = dba::selectOne('user', ['uid', 'password'],
+ $user = dba::selectFirst('user', ['uid', 'password'],
[
'uid' => $user_info,
'blocked' => 0,
if ($insert_result) {
$uid = dba::lastInsertId();
- $user = dba::selectOne('user', [], ['uid' => $uid]);
+ $user = dba::selectFirst('user', [], ['uid' => $uid]);
} else {
throw new Exception(t('An error occurred during registration. Please try again.'));
}
logger('Removing user: ' . $uid);
- $user = dba::selectOne('user', [], ['uid' => $uid]);
+ $user = dba::selectFirst('user', [], ['uid' => $uid]);
call_hooks('remove_user', $user);
-<?php\r
-\r
-namespace Friendica\Module;\r
-\r
-use Friendica\BaseModule;\r
-use Friendica\Core\Config;\r
-use Friendica\Database\DBM;\r
-use Friendica\Model\User;\r
-use dba;\r
-\r
-require_once 'boot.php';\r
-require_once 'include/datetime.php';\r
-require_once 'include/pgettext.php';\r
-require_once 'include/security.php';\r
-require_once 'include/text.php';\r
-\r
-/**\r
- * Login module\r
- *\r
- * @author Hypolite Petovan mrpetovan@gmail.com\r
- */\r
-class Login extends BaseModule\r
-{\r
- public static function content()\r
- {\r
- $a = self::getApp();\r
-\r
- if (x($_SESSION, 'theme')) {\r
- unset($_SESSION['theme']);\r
- }\r
-\r
- if (x($_SESSION, 'mobile-theme')) {\r
- unset($_SESSION['mobile-theme']);\r
- }\r
-\r
- if (local_user()) {\r
- goaway(self::getApp()->get_baseurl());\r
- }\r
-\r
- return self::form(self::getApp()->get_baseurl(), $a->config['register_policy'] != REGISTER_CLOSED);\r
- }\r
-\r
- public static function post()\r
- {\r
- session_unset();\r
- // OpenId Login\r
- if (\r
- !x($_POST, 'password')\r
- && (\r
- x($_POST, 'openid_url')\r
- || x($_POST, 'username')\r
- )\r
- ) {\r
- $noid = Config::get('system', 'no_openid');\r
-\r
- $openid_url = trim($_POST['openid_url'] ? : $_POST['username']);\r
-\r
- // if it's an email address or doesn't resolve to a URL, fail.\r
- if ($noid || strpos($openid_url, '@') || !validate_url($openid_url)) {\r
- notice(t('Login failed.') . EOL);\r
- goaway(self::getApp()->get_baseurl());\r
- // NOTREACHED\r
- }\r
-\r
- // Otherwise it's probably an openid.\r
- try {\r
- require_once 'library/openid.php';\r
- $openid = new LightOpenID;\r
- $openid->identity = $openid_url;\r
- $_SESSION['openid'] = $openid_url;\r
- $_SESSION['remember'] = $_POST['remember'];\r
- $openid->returnUrl = self::getApp()->get_baseurl(true) . '/openid';\r
- goaway($openid->authUrl());\r
- } catch (Exception $e) {\r
- notice(t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '<br /><br >' . t('The error message was:') . ' ' . $e->getMessage());\r
- }\r
- // NOTREACHED\r
- }\r
-\r
- if (x($_POST, 'auth-params') && $_POST['auth-params'] === 'login') {\r
- $record = null;\r
-\r
- $addon_auth = array(\r
- 'username' => trim($_POST['username']),\r
- 'password' => trim($_POST['password']),\r
- 'authenticated' => 0,\r
- 'user_record' => null\r
- );\r
-\r
- /*\r
- * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record\r
- * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained\r
- * and later plugins should not interfere with an earlier one that succeeded.\r
- */\r
- call_hooks('authenticate', $addon_auth);\r
-\r
- if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {\r
- $record = $addon_auth['user_record'];\r
- } else {\r
- $user_id = User::authenticate(trim($_POST['username']), trim($_POST['password']));\r
- if ($user_id) {\r
- $record = dba::selectOne('user', [], ['uid' => $user_id]);\r
- }\r
- }\r
-\r
- if (!$record || !count($record)) {\r
- logger('authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR']);\r
- notice(t('Login failed.') . EOL);\r
- goaway(self::getApp()->get_baseurl());\r
- }\r
-\r
- if (!$_POST['remember']) {\r
- new_cookie(0); // 0 means delete on browser exit\r
- }\r
-\r
- // if we haven't failed up this point, log them in.\r
- $_SESSION['remember'] = $_POST['remember'];\r
- $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');\r
- authenticate_success($record, true, true);\r
-\r
- if (x($_SESSION, 'return_url')) {\r
- $return_url = $_SESSION['return_url'];\r
- unset($_SESSION['return_url']);\r
- } else {\r
- $return_url = '';\r
- }\r
-\r
- goaway($return_url);\r
- }\r
- }\r
-\r
- /**\r
- * @brief Tries to auth the user from the cookie or session\r
- *\r
- * @todo Should be moved to Friendica\Core\Session when it's created\r
- */\r
- public static function sessionAuth()\r
- {\r
- // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie.\r
- if (isset($_COOKIE["Friendica"])) {\r
- $data = json_decode($_COOKIE["Friendica"]);\r
- if (isset($data->uid)) {\r
-\r
- $user = dba::selectOne('user', [],\r
- [\r
- 'uid' => $data->uid,\r
- 'blocked' => false,\r
- 'account_expired' => false,\r
- 'account_removed' => false,\r
- 'verified' => true,\r
- ]\r
- );\r
- if (DBM::is_result($user)) {\r
- if ($data->hash != cookie_hash($user)) {\r
- logger("Hash for user " . $data->uid . " doesn't fit.");\r
- nuke_session();\r
- goaway(self::getApp()->get_baseurl());\r
- }\r
-\r
- // Renew the cookie\r
- // Expires after 7 days by default,\r
- // can be set via system.auth_cookie_lifetime\r
- $authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7);\r
- new_cookie($authcookiedays * 24 * 60 * 60, $user);\r
-\r
- // Do the authentification if not done by now\r
- if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) {\r
- authenticate_success($user);\r
-\r
- if (Config::get('system', 'paranoia')) {\r
- $_SESSION['addr'] = $data->ip;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (isset($_SESSION) && x($_SESSION, 'authenticated')) {\r
- if (x($_SESSION, 'visitor_id') && !x($_SESSION, 'uid')) {\r
- $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",\r
- intval($_SESSION['visitor_id'])\r
- );\r
- if (DBM::is_result($r)) {\r
- $a->contact = $r[0];\r
- }\r
- }\r
-\r
- if (x($_SESSION, 'uid')) {\r
- // already logged in user returning\r
- $check = Config::get('system', 'paranoia');\r
- // extra paranoia - if the IP changed, log them out\r
- if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {\r
- logger('Session address changed. Paranoid setting in effect, blocking session. ' .\r
- $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);\r
- nuke_session();\r
- goaway(self::getApp()->get_baseurl());\r
- }\r
-\r
- $user = dba::selectOne('user', [],\r
- [\r
- 'uid' => $_SESSION['uid'],\r
- 'blocked' => false,\r
- 'account_expired' => false,\r
- 'account_removed' => false,\r
- 'verified' => true,\r
- ]\r
- );\r
- if (!DBM::is_result($user)) {\r
- nuke_session();\r
- goaway(self::getApp()->get_baseurl());\r
- }\r
-\r
- // Make sure to refresh the last login time for the user if the user\r
- // stays logged in for a long time, e.g. with "Remember Me"\r
- $login_refresh = false;\r
- if (!x($_SESSION['last_login_date'])) {\r
- $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');\r
- }\r
- if (strcmp(datetime_convert('UTC', 'UTC', 'now - 12 hours'), $_SESSION['last_login_date']) > 0) {\r
- $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');\r
- $login_refresh = true;\r
- }\r
- authenticate_success($user, false, false, $login_refresh);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * @brief Wrapper for adding a login box.\r
- *\r
- * @param string $return_url The url relative to the base the user should be sent\r
- * back to after login completes\r
- * @param bool $register If $register == true provide a registration link.\r
- * This will most always depend on the value of $a->config['register_policy'].\r
- * @param array $hiddens optional\r
- *\r
- * @return string Returns the complete html for inserting into the page\r
- *\r
- * @hooks 'login_hook' string $o\r
- */\r
- public static function form($return_url = null, $register = false, $hiddens = [])\r
- {\r
- $a = self::getApp();\r
- $o = '';\r
- $reg = false;\r
- if ($register) {\r
- $reg = array(\r
- 'title' => t('Create a New Account'),\r
- 'desc' => t('Register')\r
- );\r
- }\r
-\r
- $noid = Config::get('system', 'no_openid');\r
-\r
- if (is_null($return_url)) {\r
- $return_url = $a->query_string;\r
- }\r
-\r
- if (local_user()) {\r
- $tpl = get_markup_template('logout.tpl');\r
- } else {\r
- $a->page['htmlhead'] .= replace_macros(\r
- get_markup_template('login_head.tpl'),\r
- [\r
- '$baseurl' => $a->get_baseurl(true)\r
- ]\r
- );\r
-\r
- $tpl = get_markup_template('login.tpl');\r
- $_SESSION['return_url'] = $return_url;\r
- }\r
-\r
- $o .= replace_macros(\r
- $tpl,\r
- [\r
- '$dest_url' => self::getApp()->get_baseurl(true) . '/login',\r
- '$logout' => t('Logout'),\r
- '$login' => t('Login'),\r
-\r
- '$lname' => array('username', t('Nickname or Email: ') , '', ''),\r
- '$lpassword' => array('password', t('Password: '), '', ''),\r
- '$lremember' => array('remember', t('Remember me'), 0, ''),\r
-\r
- '$openid' => !$noid,\r
- '$lopenid' => array('openid_url', t('Or login using OpenID: '),'',''),\r
-\r
- '$hiddens' => $hiddens,\r
-\r
- '$register' => $reg,\r
-\r
- '$lostpass' => t('Forgot your password?'),\r
- '$lostlink' => t('Password Reset'),\r
-\r
- '$tostitle' => t('Website Terms of Service'),\r
- '$toslink' => t('terms of service'),\r
-\r
- '$privacytitle' => t('Website Privacy Policy'),\r
- '$privacylink' => t('privacy policy'),\r
- ]\r
- );\r
-\r
- call_hooks('login_hook', $o);\r
-\r
- return $o;\r
- }\r
-}\r
+<?php
+
+namespace Friendica\Module;
+
+use Friendica\BaseModule;
+use Friendica\Core\Config;
+use Friendica\Database\DBM;
+use Friendica\Model\User;
+use dba;
+
+require_once 'boot.php';
+require_once 'include/datetime.php';
+require_once 'include/pgettext.php';
+require_once 'include/security.php';
+require_once 'include/text.php';
+
+/**
+ * Login module
+ *
+ * @author Hypolite Petovan mrpetovan@gmail.com
+ */
+class Login extends BaseModule
+{
+ public static function content()
+ {
+ $a = self::getApp();
+
+ if (x($_SESSION, 'theme')) {
+ unset($_SESSION['theme']);
+ }
+
+ if (x($_SESSION, 'mobile-theme')) {
+ unset($_SESSION['mobile-theme']);
+ }
+
+ if (local_user()) {
+ goaway(self::getApp()->get_baseurl());
+ }
+
+ return self::form(self::getApp()->get_baseurl(), $a->config['register_policy'] != REGISTER_CLOSED);
+ }
+
+ public static function post()
+ {
+ session_unset();
+ // OpenId Login
+ if (
+ !x($_POST, 'password')
+ && (
+ x($_POST, 'openid_url')
+ || x($_POST, 'username')
+ )
+ ) {
+ $noid = Config::get('system', 'no_openid');
+
+ $openid_url = trim($_POST['openid_url'] ? : $_POST['username']);
+
+ // if it's an email address or doesn't resolve to a URL, fail.
+ if ($noid || strpos($openid_url, '@') || !validate_url($openid_url)) {
+ notice(t('Login failed.') . EOL);
+ goaway(self::getApp()->get_baseurl());
+ // NOTREACHED
+ }
+
+ // Otherwise it's probably an openid.
+ try {
+ require_once 'library/openid.php';
+ $openid = new LightOpenID;
+ $openid->identity = $openid_url;
+ $_SESSION['openid'] = $openid_url;
+ $_SESSION['remember'] = $_POST['remember'];
+ $openid->returnUrl = self::getApp()->get_baseurl(true) . '/openid';
+ goaway($openid->authUrl());
+ } catch (Exception $e) {
+ notice(t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '<br /><br >' . t('The error message was:') . ' ' . $e->getMessage());
+ }
+ // NOTREACHED
+ }
+
+ if (x($_POST, 'auth-params') && $_POST['auth-params'] === 'login') {
+ $record = null;
+
+ $addon_auth = array(
+ 'username' => trim($_POST['username']),
+ 'password' => trim($_POST['password']),
+ 'authenticated' => 0,
+ 'user_record' => null
+ );
+
+ /*
+ * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record
+ * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained
+ * and later plugins should not interfere with an earlier one that succeeded.
+ */
+ call_hooks('authenticate', $addon_auth);
+
+ if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {
+ $record = $addon_auth['user_record'];
+ } else {
+ $user_id = User::authenticate(trim($_POST['username']), trim($_POST['password']));
+ if ($user_id) {
+ $record = dba::selectFirst('user', [], ['uid' => $user_id]);
+ }
+ }
+
+ if (!$record || !count($record)) {
+ logger('authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR']);
+ notice(t('Login failed.') . EOL);
+ goaway(self::getApp()->get_baseurl());
+ }
+
+ if (!$_POST['remember']) {
+ new_cookie(0); // 0 means delete on browser exit
+ }
+
+ // if we haven't failed up this point, log them in.
+ $_SESSION['remember'] = $_POST['remember'];
+ $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');
+ authenticate_success($record, true, true);
+
+ if (x($_SESSION, 'return_url')) {
+ $return_url = $_SESSION['return_url'];
+ unset($_SESSION['return_url']);
+ } else {
+ $return_url = '';
+ }
+
+ goaway($return_url);
+ }
+ }
+
+ /**
+ * @brief Tries to auth the user from the cookie or session
+ *
+ * @todo Should be moved to Friendica\Core\Session when it's created
+ */
+ public static function sessionAuth()
+ {
+ // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie.
+ if (isset($_COOKIE["Friendica"])) {
+ $data = json_decode($_COOKIE["Friendica"]);
+ if (isset($data->uid)) {
+
+ $user = dba::selectFirst('user', [],
+ [
+ 'uid' => $data->uid,
+ 'blocked' => false,
+ 'account_expired' => false,
+ 'account_removed' => false,
+ 'verified' => true,
+ ]
+ );
+ if (DBM::is_result($user)) {
+ if ($data->hash != cookie_hash($user)) {
+ logger("Hash for user " . $data->uid . " doesn't fit.");
+ nuke_session();
+ goaway(self::getApp()->get_baseurl());
+ }
+
+ // Renew the cookie
+ // Expires after 7 days by default,
+ // can be set via system.auth_cookie_lifetime
+ $authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7);
+ new_cookie($authcookiedays * 24 * 60 * 60, $user);
+
+ // Do the authentification if not done by now
+ if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) {
+ authenticate_success($user);
+
+ if (Config::get('system', 'paranoia')) {
+ $_SESSION['addr'] = $data->ip;
+ }
+ }
+ }
+ }
+ }
+
+ if (isset($_SESSION) && x($_SESSION, 'authenticated')) {
+ if (x($_SESSION, 'visitor_id') && !x($_SESSION, 'uid')) {
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
+ intval($_SESSION['visitor_id'])
+ );
+ if (DBM::is_result($r)) {
+ $a->contact = $r[0];
+ }
+ }
+
+ if (x($_SESSION, 'uid')) {
+ // already logged in user returning
+ $check = Config::get('system', 'paranoia');
+ // extra paranoia - if the IP changed, log them out
+ if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {
+ logger('Session address changed. Paranoid setting in effect, blocking session. ' .
+ $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
+ nuke_session();
+ goaway(self::getApp()->get_baseurl());
+ }
+
+ $user = dba::selectFirst('user', [],
+ [
+ 'uid' => $_SESSION['uid'],
+ 'blocked' => false,
+ 'account_expired' => false,
+ 'account_removed' => false,
+ 'verified' => true,
+ ]
+ );
+ if (!DBM::is_result($user)) {
+ nuke_session();
+ goaway(self::getApp()->get_baseurl());
+ }
+
+ // Make sure to refresh the last login time for the user if the user
+ // stays logged in for a long time, e.g. with "Remember Me"
+ $login_refresh = false;
+ if (!x($_SESSION['last_login_date'])) {
+ $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');
+ }
+ if (strcmp(datetime_convert('UTC', 'UTC', 'now - 12 hours'), $_SESSION['last_login_date']) > 0) {
+ $_SESSION['last_login_date'] = datetime_convert('UTC', 'UTC');
+ $login_refresh = true;
+ }
+ authenticate_success($user, false, false, $login_refresh);
+ }
+ }
+ }
+
+ /**
+ * @brief Wrapper for adding a login box.
+ *
+ * @param string $return_url The url relative to the base the user should be sent
+ * back to after login completes
+ * @param bool $register If $register == true provide a registration link.
+ * This will most always depend on the value of $a->config['register_policy'].
+ * @param array $hiddens optional
+ *
+ * @return string Returns the complete html for inserting into the page
+ *
+ * @hooks 'login_hook' string $o
+ */
+ public static function form($return_url = null, $register = false, $hiddens = [])
+ {
+ $a = self::getApp();
+ $o = '';
+ $reg = false;
+ if ($register) {
+ $reg = array(
+ 'title' => t('Create a New Account'),
+ 'desc' => t('Register')
+ );
+ }
+
+ $noid = Config::get('system', 'no_openid');
+
+ if (is_null($return_url)) {
+ $return_url = $a->query_string;
+ }
+
+ if (local_user()) {
+ $tpl = get_markup_template('logout.tpl');
+ } else {
+ $a->page['htmlhead'] .= replace_macros(
+ get_markup_template('login_head.tpl'),
+ [
+ '$baseurl' => $a->get_baseurl(true)
+ ]
+ );
+
+ $tpl = get_markup_template('login.tpl');
+ $_SESSION['return_url'] = $return_url;
+ }
+
+ $o .= replace_macros(
+ $tpl,
+ [
+ '$dest_url' => self::getApp()->get_baseurl(true) . '/login',
+ '$logout' => t('Logout'),
+ '$login' => t('Login'),
+
+ '$lname' => array('username', t('Nickname or Email: ') , '', ''),
+ '$lpassword' => array('password', t('Password: '), '', ''),
+ '$lremember' => array('remember', t('Remember me'), 0, ''),
+
+ '$openid' => !$noid,
+ '$lopenid' => array('openid_url', t('Or login using OpenID: '),'',''),
+
+ '$hiddens' => $hiddens,
+
+ '$register' => $reg,
+
+ '$lostpass' => t('Forgot your password?'),
+ '$lostlink' => t('Password Reset'),
+
+ '$tostitle' => t('Website Terms of Service'),
+ '$toslink' => t('terms of service'),
+
+ '$privacytitle' => t('Website Privacy Policy'),
+ '$privacylink' => t('privacy policy'),
+ ]
+ );
+
+ call_hooks('login_hook', $o);
+
+ return $o;
+ }
+}
{
logger("FKOAuth1::loginUser $uid");
$a = get_app();
- $record = dba::selectOne('user', [], ['uid' => $uid, 'blocked' => 0, 'account_expired' => 0, 'account_removed' => 0, 'verified' => 1]);
+ $record = dba::selectFirst('user', [], ['uid' => $uid, 'blocked' => 0, 'account_expired' => 0, 'account_removed' => 0, 'verified' => 1]);
if (!DBM::is_result($record)) {
logger('FKOAuth1::loginUser failure: ' . print_r($_SERVER, true), LOGGER_DEBUG);
$a->timezone = $a->user['timezone'];
}
- $r = dba::selectOne('contact', [], ['uid' => $_SESSION['uid'], 'self' => 1]);
+ $r = dba::selectFirst('contact', [], ['uid' => $_SESSION['uid'], 'self' => 1]);
if (DBM::is_result($r)) {
$a->contact = $r;
*/
public function lookup_nonce($consumer, $token, $nonce, $timestamp)
{
- $r = dba::selectOne('tokens', ['id', 'secret'], ['client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp]);
+ $r = dba::selectFirst('tokens', ['id', 'secret'], ['client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp]);
if (DBM::is_result($r)) {
return new \OAuthToken($r['id'], $r['secret']);
$condition = array('nurl' => normalise_link($data["url"]));
- $old_fields = dba::selectOne('gcontact', $fieldnames, $condition);
+ $old_fields = dba::selectFirst('gcontact', $fieldnames, $condition);
dba::update('gcontact', $fields, $condition, $old_fields);
$condition = array('nurl' => normalise_link($data["url"]), 'self' => false, 'uid' => 0);
- $old_fields = dba::selectOne('contact', $fieldnames, $condition);
+ $old_fields = dba::selectFirst('contact', $fieldnames, $condition);
dba::update('contact', $fields, $condition, $old_fields);
}
'classundo' => $item['starred'] ? "" : "hidden",
'starred' => t('starred'),
);
- $r = dba::selectOne('thread', ['ignored'], ['uid' => $item['uid'], 'iid' => $item['id']]);
+ $r = dba::selectFirst('thread', ['ignored'], ['uid' => $item['uid'], 'iid' => $item['id']]);
if (DBM::is_result($r)) {
$ignore = array(
'do' => t("ignore thread"),
// like on comments have the comment as parent. So we need to fetch the toplevel parent
if ($parent_item["id"] != $parent_item["parent"]) {
- $toplevel = dba::selectOne('item', ['origin'], ['id' => $parent_item["parent"]]);
+ $toplevel = dba::selectFirst('item', ['origin'], ['id' => $parent_item["parent"]]);
$origin = $toplevel["origin"];
} else {
$origin = $parent_item["origin"];
$arr["last-child"] = 1;
- $user = dba::selectOne('user', ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'], ['uid' => $importer["uid"]]);
+ $user = dba::selectFirst('user', ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'], ['uid' => $importer["uid"]]);
$arr["allow_cid"] = $user["allow_cid"];
$arr["allow_gid"] = $user["allow_gid"];
while ($item = dba::fetch($r)) {
// Fetch the parent item
- $parent = dba::selectOne('item', ['author-link', 'origin'], ['id' => $item["parent"]]);
+ $parent = dba::selectFirst('item', ['author-link', 'origin'], ['id' => $item["parent"]]);
// Only delete it if the parent author really fits
if (!link_compare($parent["author-link"], $contact["url"]) && !link_compare($item["author-link"], $contact["url"])) {
// If the item belongs to a user, we take this user id.
if ($item['uid'] == 0) {
$condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false];
- $first_user = dba::selectOne('user', ['uid'], $condition);
+ $first_user = dba::selectFirst('user', ['uid'], $condition);
$owner = User::getOwnerDataById($first_user['uid']);
} else {
$owner = User::getOwnerDataById($item['uid']);
if (!$simulate) {
$condition = ["`uid` = ? AND `uri` = ? AND `network` IN (?, ?)",
$importer["uid"], $item["uri"], NETWORK_FEED, NETWORK_DFRN];
- $previous = dba::selectOne('item', ['id'], $condition);
+ $previous = dba::selectFirst('item', ['id'], $condition);
if (DBM::is_result($previous)) {
logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$previous["id"], LOGGER_DEBUG);
continue;
if ($aliaslink != '') {
$condition = ["`uid` = ? AND `alias` = ? AND `network` != ?",
$importer["uid"], $aliaslink, NETWORK_STATUSNET];
- $r = dba::selectOne('contact', [], $condition);
+ $r = dba::selectFirst('contact', [], $condition);
if (DBM::is_result($r)) {
$found = true;
$condition = ["`uid` = ? AND `nurl` IN (?, ?) AND `network` != ?", $importer["uid"],
normalise_link($author["author-link"]), normalise_link($aliaslink), NETWORK_STATUSNET];
- $r = dba::selectOne('contact', [], $condition);
+ $r = dba::selectFirst('contact', [], $condition);
if (DBM::is_result($r)) {
$found = true;
if (!$found && ($addr != "")) {
$condition = ["`uid` = ? AND `addr` = ? AND `network` != ?",
$importer["uid"], $addr, NETWORK_STATUSNET];
- $r = dba::selectOne('contact', [], $condition);
+ $r = dba::selectFirst('contact', [], $condition);
if (DBM::is_result($r)) {
$found = true;
if ($cid) {
$fields = ['url', 'nurl', 'name', 'nick', 'alias', 'about', 'location'];
- $old_contact = dba::selectOne('contact', $fields, ['id' => $cid]);
+ $old_contact = dba::selectFirst('contact', $fields, ['id' => $cid]);
// Update it with the current values
$fields = array('url' => $author["author-link"], 'name' => $contact["name"],
private static function deleteNotice($item)
{
$condition = ['uid' => $item['uid'], 'author-link' => $item['author-link'], 'uri' => $item['uri']];
- $deleted = dba::selectOne('item', ['id', 'parent-uri'], $condition);
+ $deleted = dba::selectFirst('item', ['id', 'parent-uri'], $condition);
if (!DBM::is_result($deleted)) {
logger('Item from '.$item['author-link'].' with uri '.$item['uri'].' for user '.$item['uid']." wasn't found. We don't delete it. ");
return;
private static function fetchRelated($related, $related_uri, $importer)
{
$condition = ['`item-uri` = ? AND `protocol` IN (?, ?)', $related_uri, PROTOCOL_DFRN, PROTOCOL_OSTATUS_SALMON];
- $conversation = dba::selectOne('conversation', ['source', 'protocol'], $condition);
+ $conversation = dba::selectFirst('conversation', ['source', 'protocol'], $condition);
if (DBM::is_result($conversation)) {
$stored = true;
$xml = $conversation['source'];
// Finally we take the data that we fetched from "ostatus:conversation"
if ($xml == '') {
$condition = ['item-uri' => $related_uri, 'protocol' => PROTOCOL_SPLITTED_CONV];
- $conversation = dba::selectOne('conversation', ['source'], $condition);
+ $conversation = dba::selectFirst('conversation', ['source'], $condition);
if (DBM::is_result($conversation)) {
$stored = true;
logger('Got cached XML from conversation for URI '.$related_uri, LOGGER_DEBUG);
if ($cid) {
if (!$url || !$uid) {
- $r = dba::selectOne('contact', ['poco', 'uid'], ['id' => $cid]);
+ $r = dba::selectFirst('contact', ['poco', 'uid'], ['id' => $cid]);
if (DBM::is_result($r)) {
$url = $r['poco'];
$uid = $r['uid'];
return false;
}
- $servers = dba::selectOne('gserver', [], ['nurl' => normalise_link($server_url)]);
+ $servers = dba::selectFirst('gserver', [], ['nurl' => normalise_link($server_url)]);
if (DBM::is_result($servers)) {
if ($servers["created"] <= NULL_DATE) {
$fields = ['created' => datetime_convert()];
if ($a->get_hostname() == $aCommand[2]) {
$this->writeLog(LOG_INFO, 'internal auth for ' . $sUser . '@' . $aCommand[2]);
- $aUser = dba::selectOne('user', ['uid', 'password'], ['nickname' => $sUser]);
+ $aUser = dba::selectFirst('user', ['uid', 'password'], ['nickname' => $sUser]);
if (DBM::is_result($aUser)) {
$uid = $aUser['uid'];
$success = User::authenticate($aUser, $aCommand[3]);
do {
dba::lock('locks');
- $lock = dba::selectOne('locks', ['locked', 'pid'], ['name' => $fn_name]);
+ $lock = dba::selectFirst('locks', ['locked', 'pid'], ['name' => $fn_name]);
if (DBM::is_result($lock)) {
if ($lock['locked']) {
}
return;
} elseif (intval($param) > 0) {
- $user = dba::selectOne('user', ['uid', 'username', 'expire'], ['uid' => $param]);
+ $user = dba::selectFirst('user', ['uid', 'username', 'expire'], ['uid' => $param]);
if (DBM::is_result($user)) {
logger('Expire items for user '.$user['uid'].' ('.$user['username'].') - interval: '.$user['expire'], LOGGER_DEBUG);
item_expire($user['uid'], $user['expire']);
$fields = ['forum', 'prv'];
$condition = ['id' => $target_item['contact-id']];
- $contact = dba::selectOne('contact', $fields, $condition);
+ $contact = dba::selectFirst('contact', $fields, $condition);
if (!DBM::is_result($contact)) {
// Should never happen
return false;
$d = datetime_convert();
- $contact = dba::selectOne('contact', [], ['id' => $contact_id]);
+ $contact = dba::selectFirst('contact', [], ['id' => $contact_id]);
if (!DBM::is_result($contact)) {
logger('Contact not found or cannot be used.');
return;
logger("Mail: Enabled", LOGGER_DEBUG);
$mbox = null;
- $user = dba::selectOne('user', ['prvkey'], ['uid' => $importer_uid]);
+ $user = dba::selectFirst('user', ['prvkey'], ['uid' => $importer_uid]);
$condition = ["`server` != '' AND `uid` = ?", $importer_uid];
- $mailconf = dba::selectOne('mailacct', [], $condition);
+ $mailconf = dba::selectFirst('mailacct', [], $condition);
if (DBM::is_result($user) && DBM::is_result($mailconf)) {
$mailbox = Email::constructMailboxName($mailconf);
$password = '';
// Have we seen it before?
$fields = ['deleted', 'id'];
$condition = ['uid' => $importer_uid, 'uri' => $datarray['uri']];
- $r = dba::selectOne('item', $fields, $condition);
+ $r = dba::selectFirst('item', $fields, $condition);
if (DBM::is_result($r)) {
logger("Mail: Seen before ".$msg_uid." for ".$mailconf['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],LOGGER_DEBUG);
$q_item = $r[0];
- $contact = dba::selectOne('contact', [], ['id' => $q_item['cid']]);
+ $contact = dba::selectFirst('contact', [], ['id' => $q_item['cid']]);
if (!DBM::is_result($contact)) {
remove_queue_item($q_item['id']);
return;
}
}
- $user = dba::selectOne('user', [], ['uid' => $contact['uid']]);
+ $user = dba::selectFirst('user', [], ['uid' => $contact['uid']]);
if (!DBM::is_result($user)) {
remove_queue_item($q_item['id']);
return;
exit(1);
}
$nurl = normalise_link($net['url']);
-$r = dba::selectOne("contact", ["id"], ["nurl" => $nurl, "uid" => 0]);
+$r = dba::selectFirst("contact", ["id"], ["nurl" => $nurl, "uid" => 0]);
if (DBM::is_result($r)) {
dba::update("contact", array("hidden" => true), array("id" => $r["id"]));
echo "NOTICE: The account should be silenced from the global community page\r\n";