diff --git a/include/api.php b/include/api.php index 16d18a37ca..36e38a86e1 100644 --- a/include/api.php +++ b/include/api.php @@ -222,7 +222,7 @@ function api_login(App $a) } 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]); } } @@ -473,7 +473,7 @@ function api_rss_extra(App $a, $arr, $user_info) */ 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"]; @@ -792,7 +792,7 @@ function api_get_user(App $a, $contact_id = null) // 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 != '---')) { @@ -4870,7 +4870,7 @@ function api_friendica_remoteauth() // 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"); diff --git a/include/contact_widgets.php b/include/contact_widgets.php index 4f84ce1039..cc25c88ed5 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -224,12 +224,12 @@ function common_friends_visitor_widget($profile_uid) 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']; } diff --git a/include/conversation.php b/include/conversation.php index 746a8a8913..228e90598b 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -968,7 +968,7 @@ function best_link_url($item, &$sparkle, $url = '') { $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']; @@ -1019,7 +1019,7 @@ function item_photo_menu($item) { $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']; diff --git a/include/dba.php b/include/dba.php index 2b8d3d7fc7..293bfdc002 100644 --- a/include/dba.php +++ b/include/dba.php @@ -1047,7 +1047,7 @@ class dba { 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) { @@ -1095,7 +1095,7 @@ class dba { * @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); diff --git a/include/enotify.php b/include/enotify.php index 70f1c3131c..e128ae9bed 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -106,7 +106,7 @@ function notification($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; @@ -131,7 +131,7 @@ function notification($params) $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); @@ -672,12 +672,12 @@ function check_item_notification($itemid, $uid, $defaulttype = "") { $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; } diff --git a/include/identity.php b/include/identity.php index 91080b90c7..0c62245942 100644 --- a/include/identity.php +++ b/include/identity.php @@ -162,7 +162,7 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) 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']; } diff --git a/include/items.php b/include/items.php index 6bc3e20518..f1ce70d46b 100644 --- a/include/items.php +++ b/include/items.php @@ -562,7 +562,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f // 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']; } @@ -1149,14 +1149,14 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f */ 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); } diff --git a/include/message.php b/include/message.php index ef798a39e7..189de2aef9 100644 --- a/include/message.php +++ b/include/message.php @@ -69,7 +69,7 @@ function send_message($recipient = 0, $body = '', $subject = '', $replyto = '') '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']; } @@ -188,7 +188,7 @@ function send_wallmessage($recipient = '', $body = '', $subject = '', $replyto = '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; diff --git a/include/nav.php b/include/nav.php index 8f2f5dd70b..ac76dd5aaa 100644 --- a/include/nav.php +++ b/include/nav.php @@ -94,7 +94,7 @@ function nav_info(App $a) $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'], diff --git a/include/session.php b/include/session.php index ba9ef46b26..cf51518f20 100644 --- a/include/session.php +++ b/include/session.php @@ -33,7 +33,7 @@ function ref_session_read($id) 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']; diff --git a/include/tags.php b/include/tags.php index 96e8192be7..02091f169d 100644 --- a/include/tags.php +++ b/include/tags.php @@ -226,7 +226,7 @@ function wtagblock($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HA $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) { diff --git a/index.php b/index.php index 7f286f9a14..f966279940 100644 --- a/index.php +++ b/index.php @@ -108,7 +108,7 @@ if (!$a->is_backend()) { */ 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']; diff --git a/mod/admin.php b/mod/admin.php index 0146b954f7..e7463a3609 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1551,7 +1551,7 @@ function admin_page_users(App $a) { 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'); diff --git a/mod/cal.php b/mod/cal.php index cc1708352e..51a66613ee 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -32,7 +32,7 @@ function cal_init(App $a) 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; } diff --git a/mod/common.php b/mod/common.php index 9521b61af6..11bddf6b53 100644 --- a/mod/common.php +++ b/mod/common.php @@ -63,11 +63,11 @@ function common_content(App $a) } 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']; } diff --git a/mod/contacts.php b/mod/contacts.php index ab4641a99b..90c4af7d1b 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -33,7 +33,7 @@ function contacts_init(App $a) $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)) { @@ -222,7 +222,7 @@ function contacts_post(App $a) 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; } @@ -233,7 +233,7 @@ function contacts_post(App $a) 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; } @@ -254,7 +254,7 @@ function _contact_update($contact_id) 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; } @@ -389,7 +389,7 @@ function contacts_content(App $a) $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'); @@ -904,7 +904,7 @@ function contact_posts($a, $contact_id) { $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"])); diff --git a/mod/display.php b/mod/display.php index 8739af084c..25dd9b3afa 100644 --- a/mod/display.php +++ b/mod/display.php @@ -202,7 +202,7 @@ function display_content(App $a, $update = false, $update_uid = 0) { 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 { @@ -345,7 +345,7 @@ function display_content(App $a, $update = false, $update_uid = 0) { $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)); } diff --git a/mod/hovercard.php b/mod/hovercard.php index d6164ffb64..a9cd95f587 100644 --- a/mod/hovercard.php +++ b/mod/hovercard.php @@ -44,7 +44,7 @@ function hovercard_content() $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', ''); } diff --git a/mod/network.php b/mod/network.php index 80ae9c539a..84dc9255e2 100644 --- a/mod/network.php +++ b/mod/network.php @@ -581,7 +581,7 @@ function networkThreadedView(App $a, $update = 0) { 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"]; @@ -632,7 +632,7 @@ function networkThreadedView(App $a, $update = 0) { $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(); @@ -647,7 +647,7 @@ function networkThreadedView(App $a, $update = 0) { $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"]; } @@ -668,7 +668,7 @@ function networkThreadedView(App $a, $update = 0) { $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); diff --git a/mod/noscrape.php b/mod/noscrape.php index 88ac52920e..fb5dea872b 100644 --- a/mod/noscrape.php +++ b/mod/noscrape.php @@ -68,13 +68,13 @@ function noscrape_init(App $a) { // 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']); diff --git a/mod/proxy.php b/mod/proxy.php index 792d0ffbca..80a84a165f 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -148,7 +148,7 @@ function proxy_init(App $a) { $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']; diff --git a/mod/receive.php b/mod/receive.php index 01ba3be753..0c7a7e0953 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -32,7 +32,7 @@ function receive_post(App $a) } $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); } diff --git a/mod/settings.php b/mod/settings.php index 6138463593..8fd890804f 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -997,7 +997,7 @@ function settings_content(App $a) 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; diff --git a/mod/unfollow.php b/mod/unfollow.php index 51439a9d0e..a68c4de90e 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -26,7 +26,7 @@ function unfollow_post(App $a) { $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.")); @@ -65,7 +65,7 @@ function unfollow_content(App $a) { $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); diff --git a/mod/xrd.php b/mod/xrd.php index 871f24481d..af1167581f 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -36,7 +36,7 @@ function xrd_init(App $a) $name = substr($local, 0, strpos($local, '@')); } - $r = dba::selectOne('user', [], ['nickname' => $name]); + $r = dba::selectFirst('user', [], ['nickname' => $name]); if (!DBM::is_result($r)) { killme(); } diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php index 814fd68b6f..5a3f07b536 100644 --- a/src/Content/OEmbed.php +++ b/src/Content/OEmbed.php @@ -1,404 +1,404 @@ - - */ -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::selectOne('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 = '
'; - 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 .= ''; - break; - case "link": - break; - case "rich": - if (self::isAllowedURL($embedurl)) { - $ret .= proxy_parse_html($jhtml); - } - break; - } - - $ret .= '
'; - // add link to source if not present in "rich" type - if ($j->type != 'rich' || !strpos($j->html, $embedurl)) { - $ret .= '

'; - if (isset($j->title)) { - if (isset($j->provider_name)) { - $ret .= $j->provider_name . ": "; - } - - $embedlink = (isset($j->title)) ? $j->title : $embedurl; - $ret .= '' . $embedlink . ''; - 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 .= '' . $embedlink . ''; - } - $ret .= "

"; - } elseif (!strpos($j->html, $embedurl)) { - // add for html2bbcode conversion - $ret .= '' . $j->title . ''; - } - - $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", "" . t('Embedding disabled') . " : $1", $text); - } - return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text); - } - - /** - * Find .... - * 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 ''; - } - - /** - * 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; - } - -} + + */ +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 = '
'; + 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 .= ''; + break; + case "link": + break; + case "rich": + if (self::isAllowedURL($embedurl)) { + $ret .= proxy_parse_html($jhtml); + } + break; + } + + $ret .= '
'; + // add link to source if not present in "rich" type + if ($j->type != 'rich' || !strpos($j->html, $embedurl)) { + $ret .= '

'; + if (isset($j->title)) { + if (isset($j->provider_name)) { + $ret .= $j->provider_name . ": "; + } + + $embedlink = (isset($j->title)) ? $j->title : $embedurl; + $ret .= '' . $embedlink . ''; + 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 .= '' . $embedlink . ''; + } + $ret .= "

"; + } elseif (!strpos($j->html, $embedurl)) { + // add for html2bbcode conversion + $ret .= '' . $j->title . ''; + } + + $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", "" . t('Embedding disabled') . " : $1", $text); + } + return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text); + } + + /** + * Find .... + * 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 ''; + } + + /** + * 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; + } + +} diff --git a/src/Core/Cache.php b/src/Core/Cache.php index c65f416d79..dfb6591b9d 100644 --- a/src/Core/Cache.php +++ b/src/Core/Cache.php @@ -109,7 +109,7 @@ class Cache // 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']; diff --git a/src/Core/Config.php b/src/Core/Config.php index 459433852e..3b08dee6b6 100644 --- a/src/Core/Config.php +++ b/src/Core/Config.php @@ -97,7 +97,7 @@ class Config } } - $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']); diff --git a/src/Core/PConfig.php b/src/Core/PConfig.php index 0acb930b74..50fea04469 100644 --- a/src/Core/PConfig.php +++ b/src/Core/PConfig.php @@ -90,7 +90,7 @@ class PConfig } } - $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; diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 116d64e7cb..96e4a5bb16 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -165,7 +165,7 @@ class Worker 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 { diff --git a/src/Model/Contact.php b/src/Model/Contact.php index bb8302e31d..a78c796edc 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -103,7 +103,7 @@ class Contact extends BaseObject 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; } @@ -145,7 +145,7 @@ class Contact extends BaseObject 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; @@ -490,7 +490,7 @@ class Contact extends BaseObject 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 { @@ -653,18 +653,18 @@ class Contact extends BaseObject /// @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); } @@ -697,7 +697,7 @@ class Contact extends BaseObject } // 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; } @@ -735,7 +735,7 @@ class Contact extends BaseObject $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'] != '') { @@ -759,7 +759,7 @@ class Contact extends BaseObject 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)) { @@ -817,7 +817,7 @@ class Contact extends BaseObject return false; } - $blocked = dba::selectOne('contact', ['blocked'], ['id' => $cid]); + $blocked = dba::selectFirst('contact', ['blocked'], ['id' => $cid]); if (!DBM::is_result($blocked)) { return false; } @@ -837,7 +837,7 @@ class Contact extends BaseObject return false; } - $hidden = dba::selectOne('contact', ['hidden'], ['id' => $cid]); + $hidden = dba::selectFirst('contact', ['hidden'], ['id' => $cid]); if (!DBM::is_result($hidden)) { return false; } @@ -980,7 +980,7 @@ class Contact extends BaseObject 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 { @@ -999,7 +999,7 @@ class Contact extends BaseObject // 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); } @@ -1023,7 +1023,7 @@ class Contact extends BaseObject 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; } @@ -1246,7 +1246,7 @@ class Contact extends BaseObject ); } - $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; diff --git a/src/Model/GContact.php b/src/Model/GContact.php index b09af69987..510afdf164 100644 --- a/src/Model/GContact.php +++ b/src/Model/GContact.php @@ -888,7 +888,7 @@ class GContact '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'], diff --git a/src/Model/Group.php b/src/Model/Group.php index 345a055eb4..1746a3962e 100644 --- a/src/Model/Group.php +++ b/src/Model/Group.php @@ -39,7 +39,7 @@ class Group extends BaseObject // 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 may apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL); @@ -120,7 +120,7 @@ class Group extends BaseObject 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']; } @@ -139,13 +139,13 @@ class Group extends BaseObject 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; diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 3156f5782b..a91636b672 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -38,14 +38,14 @@ class Photo */ 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, @@ -88,7 +88,7 @@ class Photo */ 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'] ); diff --git a/src/Model/User.php b/src/Model/User.php index 927bcaa75f..7a6faaf66b 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -84,7 +84,7 @@ class User 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"]; @@ -112,7 +112,7 @@ class User 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, @@ -328,7 +328,7 @@ class User 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.')); } @@ -530,7 +530,7 @@ class User logger('Removing user: ' . $uid); - $user = dba::selectOne('user', [], ['uid' => $uid]); + $user = dba::selectFirst('user', [], ['uid' => $uid]); call_hooks('remove_user', $user); diff --git a/src/Module/Login.php b/src/Module/Login.php index 5ab8bb904d..8ba4f1035f 100644 --- a/src/Module/Login.php +++ b/src/Module/Login.php @@ -1,306 +1,306 @@ -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.') . '

' . 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::selectOne('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::selectOne('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::selectOne('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; - } -} +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.') . '

' . 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; + } +} diff --git a/src/Network/FKOAuth1.php b/src/Network/FKOAuth1.php index 080e488ad5..07e15ad51e 100644 --- a/src/Network/FKOAuth1.php +++ b/src/Network/FKOAuth1.php @@ -40,7 +40,7 @@ class FKOAuth1 extends OAuthServer { 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); @@ -63,7 +63,7 @@ class FKOAuth1 extends OAuthServer $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; diff --git a/src/Network/FKOAuthDataStore.php b/src/Network/FKOAuthDataStore.php index fe4dbdc163..ccb08ccbba 100644 --- a/src/Network/FKOAuthDataStore.php +++ b/src/Network/FKOAuthDataStore.php @@ -88,7 +88,7 @@ class FKOAuthDataStore extends OAuthDataStore */ 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']); diff --git a/src/Network/Probe.php b/src/Network/Probe.php index fb2e091619..57c1ed284c 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -406,7 +406,7 @@ class Probe $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); @@ -439,7 +439,7 @@ class Probe $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); } diff --git a/src/Object/Post.php b/src/Object/Post.php index 0997f45afb..2675fe2fc2 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -261,7 +261,7 @@ class Post extends BaseObject '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"), diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 7eae2373a3..23220d04cd 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -2015,7 +2015,7 @@ class Diaspora // 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"]; @@ -2317,7 +2317,7 @@ class Diaspora $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"]; @@ -2741,7 +2741,7 @@ class Diaspora 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"])) { @@ -3255,7 +3255,7 @@ class Diaspora // 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']); diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 1bc8f513e0..af57ced7d4 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -254,7 +254,7 @@ class Feed { 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; diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index e5786f517b..242af46045 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -72,7 +72,7 @@ class OStatus 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; @@ -91,7 +91,7 @@ class OStatus $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; @@ -106,7 +106,7 @@ class OStatus 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; @@ -208,7 +208,7 @@ class OStatus 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"], @@ -542,7 +542,7 @@ class OStatus 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; @@ -896,7 +896,7 @@ class OStatus 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']; @@ -976,7 +976,7 @@ class OStatus // 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); diff --git a/src/Protocol/PortableContact.php b/src/Protocol/PortableContact.php index 7685826ba1..f579a40190 100644 --- a/src/Protocol/PortableContact.php +++ b/src/Protocol/PortableContact.php @@ -66,7 +66,7 @@ class PortableContact 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']; @@ -813,7 +813,7 @@ class PortableContact 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()]; diff --git a/src/Util/ExAuth.php b/src/Util/ExAuth.php index 777d410551..5ae24534ac 100644 --- a/src/Util/ExAuth.php +++ b/src/Util/ExAuth.php @@ -226,7 +226,7 @@ class ExAuth 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]); diff --git a/src/Util/Lock.php b/src/Util/Lock.php index 166239a78e..66a568811d 100644 --- a/src/Util/Lock.php +++ b/src/Util/Lock.php @@ -126,7 +126,7 @@ class Lock 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']) { diff --git a/src/Worker/Expire.php b/src/Worker/Expire.php index f48680fb58..9b2308da37 100644 --- a/src/Worker/Expire.php +++ b/src/Worker/Expire.php @@ -39,7 +39,7 @@ class Expire { } 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']); diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 50ac15200c..710bcfa13b 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -267,7 +267,7 @@ class Notifier { $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; diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index f53c392c5a..08dd23ad8b 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -42,7 +42,7 @@ Class OnePoll $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; @@ -339,10 +339,10 @@ Class OnePoll 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 = ''; @@ -384,7 +384,7 @@ Class OnePoll // 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); diff --git a/src/Worker/Queue.php b/src/Worker/Queue.php index 6adc32b834..1b8620a9d3 100644 --- a/src/Worker/Queue.php +++ b/src/Worker/Queue.php @@ -80,7 +80,7 @@ class Queue $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; @@ -113,7 +113,7 @@ class Queue } } - $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; diff --git a/util/global_community_silence.php b/util/global_community_silence.php index 4a324dd744..14cd06e7aa 100755 --- a/util/global_community_silence.php +++ b/util/global_community_silence.php @@ -57,7 +57,7 @@ if (in_array($net['network'], array(NETWORK_PHANTOM, NETWORK_MAIL))) { 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";