mirror of
https://github.com/friendica/friendica
synced 2024-11-18 18:23:40 +00:00
Merge branch 'develop' of https://github.com/friendica/friendica into develop
This commit is contained in:
commit
2f7f9ffdd8
51 changed files with 756 additions and 675 deletions
|
@ -92,6 +92,10 @@ optimize_max_tablesize = -1
|
||||||
; Set to 0 to disable, 2 to enable, 1 is deprecated but wont need mcrypt.
|
; Set to 0 to disable, 2 to enable, 1 is deprecated but wont need mcrypt.
|
||||||
rino_encrypt = 2
|
rino_encrypt = 2
|
||||||
|
|
||||||
|
; temppath (String)
|
||||||
|
; Custom temporary file directory
|
||||||
|
temppath =
|
||||||
|
|
||||||
; theme (String)
|
; theme (String)
|
||||||
; System theme name.
|
; System theme name.
|
||||||
theme = vier
|
theme = vier
|
||||||
|
|
|
@ -12,6 +12,7 @@ use Friendica\Content\Feature;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Content\Text\HTML;
|
use Friendica\Content\Text\HTML;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
|
use Friendica\Core\Authentication;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\NotificationsManager;
|
use Friendica\Core\NotificationsManager;
|
||||||
|
@ -46,7 +47,6 @@ use Friendica\Util\XML;
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
require_once 'mod/share.php';
|
require_once 'mod/share.php';
|
||||||
require_once 'mod/item.php';
|
require_once 'mod/item.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'mod/wall_upload.php';
|
require_once 'mod/wall_upload.php';
|
||||||
|
|
||||||
define('API_METHOD_ANY', '*');
|
define('API_METHOD_ANY', '*');
|
||||||
|
@ -242,7 +242,7 @@ function api_login(App $a)
|
||||||
throw new UnauthorizedException("This API requires login");
|
throw new UnauthorizedException("This API requires login");
|
||||||
}
|
}
|
||||||
|
|
||||||
authenticate_success($record);
|
Authentication::setAuthenticatedSessionForUser($record);
|
||||||
|
|
||||||
$_SESSION["allow_api"] = true;
|
$_SESSION["allow_api"] = true;
|
||||||
|
|
||||||
|
|
|
@ -1,457 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @file include/security.php
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Friendica\Core\Addon;
|
|
||||||
use Friendica\Core\Config;
|
|
||||||
use Friendica\Core\L10n;
|
|
||||||
use Friendica\Core\PConfig;
|
|
||||||
use Friendica\Core\System;
|
|
||||||
use Friendica\Database\DBA;
|
|
||||||
use Friendica\Model\Contact;
|
|
||||||
use Friendica\Model\Group;
|
|
||||||
use Friendica\Util\DateTimeFormat;
|
|
||||||
use Friendica\Model\PermissionSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Calculate the hash that is needed for the "Friendica" cookie
|
|
||||||
*
|
|
||||||
* @param array $user Record from "user" table
|
|
||||||
*
|
|
||||||
* @return string Hashed data
|
|
||||||
*/
|
|
||||||
function cookie_hash($user)
|
|
||||||
{
|
|
||||||
return(hash("sha256", Config::get("system", "site_prvkey") .
|
|
||||||
$user["prvkey"] .
|
|
||||||
$user["password"]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set the "Friendica" cookie
|
|
||||||
*
|
|
||||||
* @param int $time
|
|
||||||
* @param array $user Record from "user" table
|
|
||||||
*/
|
|
||||||
function new_cookie($time, $user = [])
|
|
||||||
{
|
|
||||||
if ($time != 0) {
|
|
||||||
$time = $time + time();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($user) {
|
|
||||||
$value = json_encode(["uid" => $user["uid"],
|
|
||||||
"hash" => cookie_hash($user),
|
|
||||||
"ip" => defaults($_SERVER, 'REMOTE_ADDR', '0.0.0.0')]);
|
|
||||||
} else {
|
|
||||||
$value = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets the provided user's authenticated session
|
|
||||||
*
|
|
||||||
* @todo Should be moved to Friendica\Core\Session once it's created
|
|
||||||
*
|
|
||||||
* @param type $user_record
|
|
||||||
* @param type $login_initial
|
|
||||||
* @param type $interactive
|
|
||||||
* @param type $login_refresh
|
|
||||||
*/
|
|
||||||
function authenticate_success($user_record, $login_initial = false, $interactive = false, $login_refresh = false)
|
|
||||||
{
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
$_SESSION['uid'] = $user_record['uid'];
|
|
||||||
$_SESSION['theme'] = $user_record['theme'];
|
|
||||||
$_SESSION['mobile-theme'] = PConfig::get($user_record['uid'], 'system', 'mobile_theme');
|
|
||||||
$_SESSION['authenticated'] = 1;
|
|
||||||
$_SESSION['page_flags'] = $user_record['page-flags'];
|
|
||||||
$_SESSION['my_url'] = System::baseUrl() . '/profile/' . $user_record['nickname'];
|
|
||||||
$_SESSION['my_address'] = $user_record['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3);
|
|
||||||
$_SESSION['addr'] = defaults($_SERVER, 'REMOTE_ADDR', '0.0.0.0');
|
|
||||||
|
|
||||||
$a->user = $user_record;
|
|
||||||
|
|
||||||
if ($interactive) {
|
|
||||||
if ($a->user['login_date'] <= NULL_DATE) {
|
|
||||||
$_SESSION['return_url'] = 'profile_photo/new';
|
|
||||||
$a->module = 'profile_photo';
|
|
||||||
info(L10n::t("Welcome ") . $a->user['username'] . EOL);
|
|
||||||
info(L10n::t('Please upload a profile photo.') . EOL);
|
|
||||||
} else {
|
|
||||||
info(L10n::t("Welcome back ") . $a->user['username'] . EOL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$member_since = strtotime($a->user['register_date']);
|
|
||||||
if (time() < ($member_since + ( 60 * 60 * 24 * 14))) {
|
|
||||||
$_SESSION['new_member'] = true;
|
|
||||||
} else {
|
|
||||||
$_SESSION['new_member'] = false;
|
|
||||||
}
|
|
||||||
if (strlen($a->user['timezone'])) {
|
|
||||||
date_default_timezone_set($a->user['timezone']);
|
|
||||||
$a->timezone = $a->user['timezone'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$master_record = $a->user;
|
|
||||||
|
|
||||||
if ((x($_SESSION, 'submanage')) && intval($_SESSION['submanage'])) {
|
|
||||||
$user = DBA::selectFirst('user', [], ['uid' => $_SESSION['submanage']]);
|
|
||||||
if (DBA::isResult($user)) {
|
|
||||||
$master_record = $user;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($master_record['parent-uid'] == 0) {
|
|
||||||
// First add our own entry
|
|
||||||
$a->identities = [['uid' => $master_record['uid'],
|
|
||||||
'username' => $master_record['username'],
|
|
||||||
'nickname' => $master_record['nickname']]];
|
|
||||||
|
|
||||||
// Then add all the children
|
|
||||||
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
|
||||||
['parent-uid' => $master_record['uid'], 'account_removed' => false]);
|
|
||||||
if (DBA::isResult($r)) {
|
|
||||||
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Just ensure that the array is always defined
|
|
||||||
$a->identities = [];
|
|
||||||
|
|
||||||
// First entry is our parent
|
|
||||||
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
|
||||||
['uid' => $master_record['parent-uid'], 'account_removed' => false]);
|
|
||||||
if (DBA::isResult($r)) {
|
|
||||||
$a->identities = DBA::toArray($r);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then add all siblings
|
|
||||||
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
|
||||||
['parent-uid' => $master_record['parent-uid'], 'account_removed' => false]);
|
|
||||||
if (DBA::isResult($r)) {
|
|
||||||
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$r = DBA::p("SELECT `user`.`uid`, `user`.`username`, `user`.`nickname`
|
|
||||||
FROM `manage`
|
|
||||||
INNER JOIN `user` ON `manage`.`mid` = `user`.`uid`
|
|
||||||
WHERE `user`.`account_removed` = 0 AND `manage`.`uid` = ?",
|
|
||||||
$master_record['uid']
|
|
||||||
);
|
|
||||||
if (DBA::isResult($r)) {
|
|
||||||
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($login_initial) {
|
|
||||||
logger('auth_identities: ' . print_r($a->identities, true), LOGGER_DEBUG);
|
|
||||||
}
|
|
||||||
if ($login_refresh) {
|
|
||||||
logger('auth_identities refresh: ' . print_r($a->identities, true), LOGGER_DEBUG);
|
|
||||||
}
|
|
||||||
|
|
||||||
$contact = DBA::selectFirst('contact', [], ['uid' => $_SESSION['uid'], 'self' => true]);
|
|
||||||
if (DBA::isResult($contact)) {
|
|
||||||
$a->contact = $contact;
|
|
||||||
$a->cid = $contact['id'];
|
|
||||||
$_SESSION['cid'] = $a->cid;
|
|
||||||
}
|
|
||||||
|
|
||||||
header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] . '"');
|
|
||||||
|
|
||||||
if ($login_initial || $login_refresh) {
|
|
||||||
DBA::update('user', ['login_date' => DateTimeFormat::utcNow()], ['uid' => $_SESSION['uid']]);
|
|
||||||
|
|
||||||
// Set the login date for all identities of the user
|
|
||||||
DBA::update('user', ['login_date' => DateTimeFormat::utcNow()],
|
|
||||||
['parent-uid' => $master_record['uid'], 'account_removed' => false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($login_initial) {
|
|
||||||
/*
|
|
||||||
* If the user specified to remember the authentication, then set a cookie
|
|
||||||
* that expires after one week (the default is when the browser is closed).
|
|
||||||
* The cookie will be renewed automatically.
|
|
||||||
* The week ensures that sessions will expire after some inactivity.
|
|
||||||
*/
|
|
||||||
if (!empty($_SESSION['remember'])) {
|
|
||||||
logger('Injecting cookie for remembered user ' . $a->user['nickname']);
|
|
||||||
new_cookie(604800, $user_record);
|
|
||||||
unset($_SESSION['remember']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($login_initial) {
|
|
||||||
Addon::callHooks('logged_in', $a->user);
|
|
||||||
|
|
||||||
if (($a->module !== 'home') && isset($_SESSION['return_url'])) {
|
|
||||||
goaway(System::baseUrl() . '/' . $_SESSION['return_url']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function can_write_wall($owner)
|
|
||||||
{
|
|
||||||
static $verified = 0;
|
|
||||||
|
|
||||||
if (!local_user() && !remote_user()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$uid = local_user();
|
|
||||||
if ($uid == $owner) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (local_user() && ($owner == 0)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (remote_user()) {
|
|
||||||
// use remembered decision and avoid a DB lookup for each and every display item
|
|
||||||
// DO NOT use this function if there are going to be multiple owners
|
|
||||||
// We have a contact-id for an authenticated remote user, this block determines if the contact
|
|
||||||
// belongs to this page owner, and has the necessary permissions to post content
|
|
||||||
|
|
||||||
if ($verified === 2) {
|
|
||||||
return true;
|
|
||||||
} elseif ($verified === 1) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
$cid = 0;
|
|
||||||
|
|
||||||
if (!empty($_SESSION['remote'])) {
|
|
||||||
foreach ($_SESSION['remote'] as $visitor) {
|
|
||||||
if ($visitor['uid'] == $owner) {
|
|
||||||
$cid = $visitor['cid'];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$cid) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$r = q("SELECT `contact`.*, `user`.`page-flags` FROM `contact` INNER JOIN `user` on `user`.`uid` = `contact`.`uid`
|
|
||||||
WHERE `contact`.`uid` = %d AND `contact`.`id` = %d AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
|
|
||||||
AND `user`.`blockwall` = 0 AND `readonly` = 0 AND ( `contact`.`rel` IN ( %d , %d ) OR `user`.`page-flags` = %d ) LIMIT 1",
|
|
||||||
intval($owner),
|
|
||||||
intval($cid),
|
|
||||||
intval(Contact::SHARING),
|
|
||||||
intval(Contact::FRIEND),
|
|
||||||
intval(Contact::PAGE_COMMUNITY)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (DBA::isResult($r)) {
|
|
||||||
$verified = 2;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$verified = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @TODO $groups should be array
|
|
||||||
function permissions_sql($owner_id, $remote_verified = false, $groups = null)
|
|
||||||
{
|
|
||||||
$local_user = local_user();
|
|
||||||
$remote_user = remote_user();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct permissions
|
|
||||||
*
|
|
||||||
* default permissions - anonymous user
|
|
||||||
*/
|
|
||||||
$sql = " AND allow_cid = ''
|
|
||||||
AND allow_gid = ''
|
|
||||||
AND deny_cid = ''
|
|
||||||
AND deny_gid = ''
|
|
||||||
";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Profile owner - everything is visible
|
|
||||||
*/
|
|
||||||
if ($local_user && $local_user == $owner_id) {
|
|
||||||
$sql = '';
|
|
||||||
/**
|
|
||||||
* Authenticated visitor. Unless pre-verified,
|
|
||||||
* check that the contact belongs to this $owner_id
|
|
||||||
* and load the groups the visitor belongs to.
|
|
||||||
* If pre-verified, the caller is expected to have already
|
|
||||||
* done this and passed the groups into this function.
|
|
||||||
*/
|
|
||||||
} elseif ($remote_user) {
|
|
||||||
/*
|
|
||||||
* Authenticated visitor. Unless pre-verified,
|
|
||||||
* check that the contact belongs to this $owner_id
|
|
||||||
* and load the groups the visitor belongs to.
|
|
||||||
* If pre-verified, the caller is expected to have already
|
|
||||||
* done this and passed the groups into this function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!$remote_verified) {
|
|
||||||
if (DBA::exists('contact', ['id' => $remote_user, 'uid' => $owner_id, 'blocked' => false])) {
|
|
||||||
$remote_verified = true;
|
|
||||||
$groups = Group::getIdsByContactId($remote_user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($remote_verified) {
|
|
||||||
$gs = '<<>>'; // should be impossible to match
|
|
||||||
|
|
||||||
if (is_array($groups)) {
|
|
||||||
foreach ($groups as $g) {
|
|
||||||
$gs .= '|<' . intval($g) . '>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = sprintf(
|
|
||||||
" AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
|
|
||||||
AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
|
|
||||||
)
|
|
||||||
",
|
|
||||||
intval($remote_user),
|
|
||||||
DBA::escape($gs),
|
|
||||||
intval($remote_user),
|
|
||||||
DBA::escape($gs)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
function item_permissions_sql($owner_id, $remote_verified = false, $groups = null)
|
|
||||||
{
|
|
||||||
$local_user = local_user();
|
|
||||||
$remote_user = remote_user();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Construct permissions
|
|
||||||
*
|
|
||||||
* default permissions - anonymous user
|
|
||||||
*/
|
|
||||||
$sql = " AND NOT `item`.`private`";
|
|
||||||
|
|
||||||
// Profile owner - everything is visible
|
|
||||||
if ($local_user && ($local_user == $owner_id)) {
|
|
||||||
$sql = '';
|
|
||||||
} elseif ($remote_user) {
|
|
||||||
/*
|
|
||||||
* Authenticated visitor. Unless pre-verified,
|
|
||||||
* check that the contact belongs to this $owner_id
|
|
||||||
* and load the groups the visitor belongs to.
|
|
||||||
* If pre-verified, the caller is expected to have already
|
|
||||||
* done this and passed the groups into this function.
|
|
||||||
*/
|
|
||||||
$set = PermissionSet::get($owner_id, $remote_user, $groups);
|
|
||||||
|
|
||||||
if (!empty($set)) {
|
|
||||||
$sql_set = " OR (`item`.`private` IN (1,2) AND `item`.`wall` AND `item`.`psid` IN (" . implode(',', $set) . "))";
|
|
||||||
} else {
|
|
||||||
$sql_set = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = " AND (NOT `item`.`private`" . $sql_set . ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Functions used to protect against Cross-Site Request Forgery
|
|
||||||
* The security token has to base on at least one value that an attacker can't know - here it's the session ID and the private key.
|
|
||||||
* In this implementation, a security token is reusable (if the user submits a form, goes back and resubmits the form, maybe with small changes;
|
|
||||||
* or if the security token is used for ajax-calls that happen several times), but only valid for a certain amout of time (3hours).
|
|
||||||
* The "typename" seperates the security tokens of different types of forms. This could be relevant in the following case:
|
|
||||||
* A security token is used to protekt a link from CSRF (e.g. the "delete this profile"-link).
|
|
||||||
* If the new page contains by any chance external elements, then the used security token is exposed by the referrer.
|
|
||||||
* Actually, important actions should not be triggered by Links / GET-Requests at all, but somethimes they still are,
|
|
||||||
* so this mechanism brings in some damage control (the attacker would be able to forge a request to a form of this type, but not to forms of other types).
|
|
||||||
*/
|
|
||||||
function get_form_security_token($typename = '')
|
|
||||||
{
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
$timestamp = time();
|
|
||||||
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $timestamp . $typename);
|
|
||||||
|
|
||||||
return $timestamp . '.' . $sec_hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_form_security_token($typename = '', $formname = 'form_security_token')
|
|
||||||
{
|
|
||||||
$hash = null;
|
|
||||||
|
|
||||||
if (!empty($_REQUEST[$formname])) {
|
|
||||||
/// @TODO Careful, not secured!
|
|
||||||
$hash = $_REQUEST[$formname];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($_SERVER['HTTP_X_CSRF_TOKEN'])) {
|
|
||||||
/// @TODO Careful, not secured!
|
|
||||||
$hash = $_SERVER['HTTP_X_CSRF_TOKEN'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($hash)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$max_livetime = 10800; // 3 hours
|
|
||||||
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
$x = explode('.', $hash);
|
|
||||||
if (time() > (IntVal($x[0]) + $max_livetime)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename);
|
|
||||||
|
|
||||||
return ($sec_hash == $x[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_form_security_std_err_msg()
|
|
||||||
{
|
|
||||||
return L10n::t("The form security token was not correct. This probably happened because the form has been opened for too long \x28>3 hours\x29 before submitting it.") . EOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_form_security_token_redirectOnErr($err_redirect, $typename = '', $formname = 'form_security_token')
|
|
||||||
{
|
|
||||||
if (!check_form_security_token($typename, $formname)) {
|
|
||||||
$a = get_app();
|
|
||||||
logger('check_form_security_token failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
|
|
||||||
logger('check_form_security_token failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
|
|
||||||
notice(check_form_security_std_err_msg());
|
|
||||||
goaway(System::baseUrl() . $err_redirect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'form_security_token')
|
|
||||||
{
|
|
||||||
if (!check_form_security_token($typename, $formname)) {
|
|
||||||
$a = get_app();
|
|
||||||
logger('check_form_security_token failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
|
|
||||||
logger('check_form_security_token failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
|
|
||||||
header('HTTP/1.1 403 Forbidden');
|
|
||||||
killme();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Kills the "Friendica" cookie and all session data
|
|
||||||
*/
|
|
||||||
function nuke_session()
|
|
||||||
{
|
|
||||||
new_cookie(-3600); // make sure cookie is deleted on browser close, as a security measure
|
|
||||||
session_unset();
|
|
||||||
session_destroy();
|
|
||||||
}
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Content\Feature;
|
use Friendica\Content\Feature;
|
||||||
use Friendica\Content\Text\Markdown;
|
use Friendica\Content\Text\Markdown;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
|
@ -314,7 +315,7 @@ function admin_page_tos(App $a)
|
||||||
'$preview' => L10n::t('Privacy Statement Preview'),
|
'$preview' => L10n::t('Privacy Statement Preview'),
|
||||||
'$privtext' => $tos->privacy_complete,
|
'$privtext' => $tos->privacy_complete,
|
||||||
'$tostext' => ['tostext', L10n::t('The Terms of Service'), Config::get('system', 'tostext'), L10n::t('Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below.')],
|
'$tostext' => ['tostext', L10n::t('The Terms of Service'), Config::get('system', 'tostext'), L10n::t('Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below.')],
|
||||||
'$form_security_token' => get_form_security_token("admin_tos"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_tos"),
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -325,7 +326,7 @@ function admin_page_tos(App $a)
|
||||||
*/
|
*/
|
||||||
function admin_page_tos_post(App $a)
|
function admin_page_tos_post(App $a)
|
||||||
{
|
{
|
||||||
check_form_security_token_redirectOnErr('/admin/tos', 'admin_tos');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/tos', 'admin_tos');
|
||||||
|
|
||||||
if (!x($_POST, "page_tos")) {
|
if (!x($_POST, "page_tos")) {
|
||||||
return;
|
return;
|
||||||
|
@ -385,7 +386,7 @@ function admin_page_blocklist(App $a)
|
||||||
'$entries' => $blocklistform,
|
'$entries' => $blocklistform,
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
'$confirm_delete' => L10n::t('Delete entry from blocklist?'),
|
'$confirm_delete' => L10n::t('Delete entry from blocklist?'),
|
||||||
'$form_security_token' => get_form_security_token("admin_blocklist")
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_blocklist")
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,7 +401,7 @@ function admin_page_blocklist_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/blocklist', 'admin_blocklist');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/blocklist', 'admin_blocklist');
|
||||||
|
|
||||||
if (x($_POST['page_blocklist_save'])) {
|
if (x($_POST['page_blocklist_save'])) {
|
||||||
// Add new item to blocklist
|
// Add new item to blocklist
|
||||||
|
@ -443,7 +444,7 @@ function admin_page_contactblock_post(App $a)
|
||||||
$contact_url = x($_POST, 'contact_url') ? $_POST['contact_url'] : '';
|
$contact_url = x($_POST, 'contact_url') ? $_POST['contact_url'] : '';
|
||||||
$contacts = x($_POST, 'contacts') ? $_POST['contacts'] : [];
|
$contacts = x($_POST, 'contacts') ? $_POST['contacts'] : [];
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/contactblock', 'admin_contactblock');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/contactblock', 'admin_contactblock');
|
||||||
|
|
||||||
if (x($_POST, 'page_contactblock_block')) {
|
if (x($_POST, 'page_contactblock_block')) {
|
||||||
$contact_id = Contact::getIdForURL($contact_url);
|
$contact_id = Contact::getIdForURL($contact_url);
|
||||||
|
@ -500,7 +501,7 @@ function admin_page_contactblock(App $a)
|
||||||
'$h_newblock' => L10n::t('Block New Remote Contact'),
|
'$h_newblock' => L10n::t('Block New Remote Contact'),
|
||||||
'$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')],
|
'$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')],
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_contactblock"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_contactblock"),
|
||||||
|
|
||||||
// values //
|
// values //
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
|
@ -535,7 +536,7 @@ function admin_page_deleteitem(App $a)
|
||||||
'$intro2' => L10n::t('You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.'),
|
'$intro2' => L10n::t('You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.'),
|
||||||
'$deleteitemguid' => ['deleteitemguid', L10n::t("GUID"), '', L10n::t("The GUID of the item you want to delete."), 'required', 'autofocus'],
|
'$deleteitemguid' => ['deleteitemguid', L10n::t("GUID"), '', L10n::t("The GUID of the item you want to delete."), 'required', 'autofocus'],
|
||||||
'$baseurl' => System::baseUrl(),
|
'$baseurl' => System::baseUrl(),
|
||||||
'$form_security_token' => get_form_security_token("admin_deleteitem")
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_deleteitem")
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,7 +554,7 @@ function admin_page_deleteitem_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/deleteitem/', 'admin_deleteitem');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/deleteitem/', 'admin_deleteitem');
|
||||||
|
|
||||||
if (x($_POST['page_deleteitem_submit'])) {
|
if (x($_POST['page_deleteitem_submit'])) {
|
||||||
$guid = trim(notags($_POST['deleteitemguid']));
|
$guid = trim(notags($_POST['deleteitemguid']));
|
||||||
|
@ -945,7 +946,7 @@ function admin_page_summary(App $a)
|
||||||
*/
|
*/
|
||||||
function admin_page_site_post(App $a)
|
function admin_page_site_post(App $a)
|
||||||
{
|
{
|
||||||
check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/site', 'admin_site');
|
||||||
|
|
||||||
if (!empty($_POST['republish_directory'])) {
|
if (!empty($_POST['republish_directory'])) {
|
||||||
Worker::add(PRIORITY_LOW, 'Directory');
|
Worker::add(PRIORITY_LOW, 'Directory');
|
||||||
|
@ -1541,7 +1542,7 @@ function admin_page_site(App $a)
|
||||||
'$relay_server_tags' => ['relay_server_tags', L10n::t("Server tags"), Config::get('system','relay_server_tags'), L10n::t("Comma separated list of tags for the 'tags' subscription.")],
|
'$relay_server_tags' => ['relay_server_tags', L10n::t("Server tags"), Config::get('system','relay_server_tags'), L10n::t("Comma separated list of tags for the 'tags' subscription.")],
|
||||||
'$relay_user_tags' => ['relay_user_tags', L10n::t("Allow user tags"), Config::get('system', 'relay_user_tags', true), L10n::t("If enabled, the tags from the saved searches will used for the 'tags' subscription in addition to the 'relay_server_tags'.")],
|
'$relay_user_tags' => ['relay_user_tags', L10n::t("Allow user tags"), Config::get('system', 'relay_user_tags', true), L10n::t("If enabled, the tags from the saved searches will used for the 'tags' subscription in addition to the 'relay_server_tags'.")],
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_site"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_site"),
|
||||||
'$relocate_button' => L10n::t('Start Relocation'),
|
'$relocate_button' => L10n::t('Start Relocation'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -1656,7 +1657,7 @@ function admin_page_users_post(App $a)
|
||||||
$nu_email = defaults($_POST, 'new_user_email' , '');
|
$nu_email = defaults($_POST, 'new_user_email' , '');
|
||||||
$nu_language = Config::get('system', 'language');
|
$nu_language = Config::get('system', 'language');
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users');
|
||||||
|
|
||||||
if (!($nu_name === "") && !($nu_email === "") && !($nu_nickname === "")) {
|
if (!($nu_name === "") && !($nu_email === "") && !($nu_nickname === "")) {
|
||||||
try {
|
try {
|
||||||
|
@ -1772,14 +1773,14 @@ function admin_page_users(App $a)
|
||||||
}
|
}
|
||||||
switch ($a->argv[2]) {
|
switch ($a->argv[2]) {
|
||||||
case "delete":
|
case "delete":
|
||||||
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
|
||||||
// delete user
|
// delete user
|
||||||
User::remove($uid);
|
User::remove($uid);
|
||||||
|
|
||||||
notice(L10n::t("User '%s' deleted", $user['username']) . EOL);
|
notice(L10n::t("User '%s' deleted", $user['username']) . EOL);
|
||||||
break;
|
break;
|
||||||
case "block":
|
case "block":
|
||||||
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
|
||||||
q("UPDATE `user` SET `blocked` = %d WHERE `uid` = %s",
|
q("UPDATE `user` SET `blocked` = %d WHERE `uid` = %s",
|
||||||
intval(1 - $user['blocked']),
|
intval(1 - $user['blocked']),
|
||||||
intval($uid)
|
intval($uid)
|
||||||
|
@ -1926,7 +1927,7 @@ function admin_page_users(App $a)
|
||||||
'$confirm_delete_multi' => L10n::t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete_multi' => L10n::t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
'$confirm_delete' => L10n::t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete' => L10n::t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_users"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_users"),
|
||||||
|
|
||||||
// values //
|
// values //
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
|
@ -1971,7 +1972,7 @@ function admin_page_addons(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x($_GET, "a") && $_GET['a'] == "t") {
|
if (x($_GET, "a") && $_GET['a'] == "t") {
|
||||||
check_form_security_token_redirectOnErr('/admin/addons', 'admin_themes', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_themes', 't');
|
||||||
|
|
||||||
// Toggle addon status
|
// Toggle addon status
|
||||||
$idx = array_search($addon, $a->addons);
|
$idx = array_search($addon, $a->addons);
|
||||||
|
@ -2033,7 +2034,7 @@ function admin_page_addons(App $a)
|
||||||
'$screenshot' => '',
|
'$screenshot' => '',
|
||||||
'$readme' => $readme,
|
'$readme' => $readme,
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_themes"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_themes"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2041,7 +2042,7 @@ function admin_page_addons(App $a)
|
||||||
* List addons
|
* List addons
|
||||||
*/
|
*/
|
||||||
if (x($_GET, "a") && $_GET['a'] == "r") {
|
if (x($_GET, "a") && $_GET['a'] == "r") {
|
||||||
check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/addons', 'admin_themes', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError(System::baseUrl() . '/admin/addons', 'admin_themes', 't');
|
||||||
Addon::reload();
|
Addon::reload();
|
||||||
info("Addons reloaded");
|
info("Addons reloaded");
|
||||||
goaway(System::baseUrl() . '/admin/addons');
|
goaway(System::baseUrl() . '/admin/addons');
|
||||||
|
@ -2084,7 +2085,7 @@ function admin_page_addons(App $a)
|
||||||
'$addons' => $addons,
|
'$addons' => $addons,
|
||||||
'$pcount' => count($addons),
|
'$pcount' => count($addons),
|
||||||
'$noplugshint' => L10n::t('There are currently no addons available on your node. You can find the official addon repository at %1$s and might find other interesting addons in the open addon registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'),
|
'$noplugshint' => L10n::t('There are currently no addons available on your node. You can find the official addon repository at %1$s and might find other interesting addons in the open addon registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'),
|
||||||
'$form_security_token' => get_form_security_token("admin_themes"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_themes"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2219,7 +2220,7 @@ function admin_page_themes(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x($_GET, "a") && $_GET['a'] == "t") {
|
if (x($_GET, "a") && $_GET['a'] == "t") {
|
||||||
check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/themes', 'admin_themes', 't');
|
||||||
|
|
||||||
// Toggle theme status
|
// Toggle theme status
|
||||||
|
|
||||||
|
@ -2301,13 +2302,13 @@ function admin_page_themes(App $a)
|
||||||
'$screenshot' => $screenshot,
|
'$screenshot' => $screenshot,
|
||||||
'$readme' => $readme,
|
'$readme' => $readme,
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_themes"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_themes"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// reload active themes
|
// reload active themes
|
||||||
if (x($_GET, "a") && $_GET['a'] == "r") {
|
if (x($_GET, "a") && $_GET['a'] == "r") {
|
||||||
check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/themes', 'admin_themes', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError(System::baseUrl() . '/admin/themes', 'admin_themes', 't');
|
||||||
foreach ($themes as $th) {
|
foreach ($themes as $th) {
|
||||||
if ($th['allowed']) {
|
if ($th['allowed']) {
|
||||||
Theme::uninstall($th['name']);
|
Theme::uninstall($th['name']);
|
||||||
|
@ -2340,7 +2341,7 @@ function admin_page_themes(App $a)
|
||||||
'$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'),
|
'$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'),
|
||||||
'$experimental' => L10n::t('[Experimental]'),
|
'$experimental' => L10n::t('[Experimental]'),
|
||||||
'$unsupported' => L10n::t('[Unsupported]'),
|
'$unsupported' => L10n::t('[Unsupported]'),
|
||||||
'$form_security_token' => get_form_security_token("admin_themes"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_themes"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2352,7 +2353,7 @@ function admin_page_themes(App $a)
|
||||||
function admin_page_logs_post(App $a)
|
function admin_page_logs_post(App $a)
|
||||||
{
|
{
|
||||||
if (x($_POST, "page_logs")) {
|
if (x($_POST, "page_logs")) {
|
||||||
check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/logs', 'admin_logs');
|
||||||
|
|
||||||
$logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
|
$logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
|
||||||
$debugging = ((x($_POST,'debugging')) ? true : false);
|
$debugging = ((x($_POST,'debugging')) ? true : false);
|
||||||
|
@ -2414,7 +2415,7 @@ function admin_page_logs(App $a)
|
||||||
'$debugging' => ['debugging', L10n::t("Enable Debugging"), Config::get('system', 'debugging'), ""],
|
'$debugging' => ['debugging', L10n::t("Enable Debugging"), Config::get('system', 'debugging'), ""],
|
||||||
'$logfile' => ['logfile', L10n::t("Log file"), Config::get('system', 'logfile'), L10n::t("Must be writable by web server. Relative to your Friendica top-level directory.")],
|
'$logfile' => ['logfile', L10n::t("Log file"), Config::get('system', 'logfile'), L10n::t("Must be writable by web server. Relative to your Friendica top-level directory.")],
|
||||||
'$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices],
|
'$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices],
|
||||||
'$form_security_token' => get_form_security_token("admin_logs"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_logs"),
|
||||||
'$phpheader' => L10n::t("PHP logging"),
|
'$phpheader' => L10n::t("PHP logging"),
|
||||||
'$phphint' => L10n::t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),
|
'$phphint' => L10n::t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),
|
||||||
'$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE);\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');",
|
'$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE);\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');",
|
||||||
|
@ -2485,7 +2486,7 @@ function admin_page_viewlogs(App $a)
|
||||||
*/
|
*/
|
||||||
function admin_page_features_post(App $a)
|
function admin_page_features_post(App $a)
|
||||||
{
|
{
|
||||||
check_form_security_token_redirectOnErr('/admin/features', 'admin_manage_features');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/admin/features', 'admin_manage_features');
|
||||||
|
|
||||||
logger('postvars: ' . print_r($_POST, true), LOGGER_DATA);
|
logger('postvars: ' . print_r($_POST, true), LOGGER_DATA);
|
||||||
|
|
||||||
|
@ -2550,7 +2551,7 @@ function admin_page_features(App $a)
|
||||||
|
|
||||||
$tpl = get_markup_template('admin/settings_features.tpl');
|
$tpl = get_markup_template('admin/settings_features.tpl');
|
||||||
$o = replace_macros($tpl, [
|
$o = replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("admin_manage_features"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("admin_manage_features"),
|
||||||
'$title' => L10n::t('Manage Additional Features'),
|
'$title' => L10n::t('Manage Additional Features'),
|
||||||
'$features' => $arr,
|
'$features' => $arr,
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/dba.php';
|
require_once 'include/dba.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
function attach_init(App $a)
|
function attach_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,7 @@ function attach_init(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql_extra = permissions_sql($r['uid']);
|
$sql_extra = Security::getPermissionsSQLByUserId($r['uid']);
|
||||||
|
|
||||||
// Now we'll see if we can access the attachment
|
// Now we'll see if we can access the attachment
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,12 @@ use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
use Friendica\Model\Event;
|
use Friendica\Model\Event;
|
||||||
use Friendica\Model\Group;
|
use Friendica\Model\Group;
|
||||||
|
use Friendica\Model\Item;
|
||||||
use Friendica\Model\Profile;
|
use Friendica\Model\Profile;
|
||||||
use Friendica\Protocol\DFRN;
|
use Friendica\Protocol\DFRN;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Temporal;
|
use Friendica\Util\Temporal;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
function cal_init(App $a)
|
function cal_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -141,7 +143,7 @@ function cal_content(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the permissions
|
// get the permissions
|
||||||
$sql_perms = item_permissions_sql($owner_uid, $remote_contact, $groups);
|
$sql_perms = Item::getPermissionsSQLByUserId($owner_uid, $remote_contact, $groups);
|
||||||
// we only want to have the events of the profile owner
|
// we only want to have the events of the profile owner
|
||||||
$sql_extra = " AND `event`.`cid` = 0 " . $sql_perms;
|
$sql_extra = " AND `event`.`cid` = 0 " . $sql_perms;
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ use Friendica\Core\L10n;
|
||||||
use Friendica\Core\PConfig;
|
use Friendica\Core\PConfig;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
function community_init(App $a)
|
function community_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -90,7 +91,6 @@ function community_content(App $a, $update = 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
|
|
||||||
if (!$update) {
|
if (!$update) {
|
||||||
|
@ -227,19 +227,12 @@ function community_getitems($start, $itemspage, $content, $accounttype)
|
||||||
return DBA::toArray($r);
|
return DBA::toArray($r);
|
||||||
} elseif ($content == 'global') {
|
} elseif ($content == 'global') {
|
||||||
if (!is_null($accounttype)) {
|
if (!is_null($accounttype)) {
|
||||||
$sql_accounttype = " AND `owner`.`contact-type` = ?";
|
$condition = ["`uid` = ? AND `owner`.`contact-type` = ?", 0, $accounttype];
|
||||||
$values = [$accounttype, $start, $itemspage];
|
|
||||||
} else {
|
} else {
|
||||||
$sql_accounttype = "";
|
$condition = ['uid' => 0];
|
||||||
$values = [$start, $itemspage];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = DBA::p("SELECT `uri` FROM `thread`
|
$r = Item::selectThreadForUser(0, ['uri'], $condition, ['order' => ['commented' => true], 'limit' => [$start, $itemspage]]);
|
||||||
INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
|
|
||||||
INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
|
|
||||||
INNER JOIN `contact` AS `owner` ON `owner`.`id`=`item`.`owner-id`
|
|
||||||
WHERE `thread`.`uid` = 0 AND NOT `author`.`hidden` AND NOT `author`.`blocked` $sql_accounttype
|
|
||||||
ORDER BY `thread`.`commented` DESC LIMIT ?, ?", $values);
|
|
||||||
return DBA::toArray($r);
|
return DBA::toArray($r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\User;
|
use Friendica\Model\User;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'mod/settings.php';
|
require_once 'mod/settings.php';
|
||||||
|
|
||||||
|
@ -28,7 +30,7 @@ function delegate_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/delegate', 'delegate');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/delegate', 'delegate');
|
||||||
|
|
||||||
$parent_uid = defaults($_POST, 'parent_user', 0);
|
$parent_uid = defaults($_POST, 'parent_user', 0);
|
||||||
$parent_password = defaults($_POST, 'parent_password', '');
|
$parent_password = defaults($_POST, 'parent_password', '');
|
||||||
|
@ -162,7 +164,7 @@ function delegate_content(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
$o = replace_macros(get_markup_template('delegate.tpl'), [
|
$o = replace_macros(get_markup_template('delegate.tpl'), [
|
||||||
'$form_security_token' => get_form_security_token('delegate'),
|
'$form_security_token' => BaseModule::getFormSecurityToken('delegate'),
|
||||||
'$parent_header' => L10n::t('Parent User'),
|
'$parent_header' => L10n::t('Parent User'),
|
||||||
'$parent_user' => $parent_user,
|
'$parent_user' => $parent_user,
|
||||||
'$parent_password' => $parent_password,
|
'$parent_password' => $parent_password,
|
||||||
|
|
|
@ -18,6 +18,7 @@ use Friendica\Model\Item;
|
||||||
use Friendica\Model\Profile;
|
use Friendica\Model\Profile;
|
||||||
use Friendica\Protocol\DFRN;
|
use Friendica\Protocol\DFRN;
|
||||||
use Friendica\Protocol\ActivityPub;
|
use Friendica\Protocol\ActivityPub;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
function display_init(App $a)
|
function display_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -200,7 +201,6 @@ function display_content(App $a, $update = false, $update_uid = 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
@ -325,7 +325,7 @@ function display_content(App $a, $update = false, $update_uid = 0)
|
||||||
$o .= status_editor($a, $x, 0, true);
|
$o .= status_editor($a, $x, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql_extra = item_permissions_sql($a->profile['uid'], $is_remote_contact, $groups);
|
$sql_extra = Item::getPermissionsSQLByUserId($a->profile['uid'], $is_remote_contact, $groups);
|
||||||
|
|
||||||
if (local_user() && (local_user() == $a->profile['uid'])) {
|
if (local_user() && (local_user() == $a->profile['uid'])) {
|
||||||
$condition = ['parent-uri' => $item_parent_uri, 'uid' => local_user(), 'unseen' => true];
|
$condition = ['parent-uri' => $item_parent_uri, 'uid' => local_user(), 'unseen' => true];
|
||||||
|
|
|
@ -6,7 +6,6 @@ use Friendica\App;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\PConfig;
|
use Friendica\Core\PConfig;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
function filer_content(App $a)
|
function filer_content(App $a)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\PConfig;
|
use Friendica\Core\PConfig;
|
||||||
|
@ -13,6 +14,7 @@ use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model;
|
use Friendica\Model;
|
||||||
use Friendica\Module;
|
use Friendica\Module;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
function group_init(App $a) {
|
function group_init(App $a) {
|
||||||
if (local_user()) {
|
if (local_user()) {
|
||||||
|
@ -28,7 +30,7 @@ function group_post(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc == 2) && ($a->argv[1] === 'new')) {
|
if (($a->argc == 2) && ($a->argv[1] === 'new')) {
|
||||||
check_form_security_token_redirectOnErr('/group/new', 'group_edit');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/group/new', 'group_edit');
|
||||||
|
|
||||||
$name = notags(trim($_POST['groupname']));
|
$name = notags(trim($_POST['groupname']));
|
||||||
$r = Model\Group::create(local_user(), $name);
|
$r = Model\Group::create(local_user(), $name);
|
||||||
|
@ -46,7 +48,7 @@ function group_post(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc == 2) && intval($a->argv[1])) {
|
if (($a->argc == 2) && intval($a->argv[1])) {
|
||||||
check_form_security_token_redirectOnErr('/group', 'group_edit');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_edit');
|
||||||
|
|
||||||
$r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
$r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||||
intval($a->argv[1]),
|
intval($a->argv[1]),
|
||||||
|
@ -107,7 +109,7 @@ function group_content(App $a) {
|
||||||
'$title' => L10n::t('Create a group of contacts/friends.'),
|
'$title' => L10n::t('Create a group of contacts/friends.'),
|
||||||
'$gname' => ['groupname', L10n::t('Group Name: '), '', ''],
|
'$gname' => ['groupname', L10n::t('Group Name: '), '', ''],
|
||||||
'$gid' => 'new',
|
'$gid' => 'new',
|
||||||
'$form_security_token' => get_form_security_token("group_edit"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("group_edit"),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,7 +139,7 @@ function group_content(App $a) {
|
||||||
|
|
||||||
|
|
||||||
if (($a->argc == 3) && ($a->argv[1] === 'drop')) {
|
if (($a->argc == 3) && ($a->argv[1] === 'drop')) {
|
||||||
check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_drop', 't');
|
||||||
|
|
||||||
if (intval($a->argv[2])) {
|
if (intval($a->argv[2])) {
|
||||||
$r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
$r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||||
|
@ -162,7 +164,7 @@ function group_content(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
|
if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
|
||||||
check_form_security_token_ForbiddenOnErr('group_member_change', 't');
|
BaseModule::checkFormSecurityTokenForbiddenOnError('group_member_change', 't');
|
||||||
|
|
||||||
$r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
|
$r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
|
||||||
intval($a->argv[2]),
|
intval($a->argv[2]),
|
||||||
|
@ -216,7 +218,7 @@ function group_content(App $a) {
|
||||||
$drop_txt = replace_macros($drop_tpl, [
|
$drop_txt = replace_macros($drop_tpl, [
|
||||||
'$id' => $group['id'],
|
'$id' => $group['id'],
|
||||||
'$delete' => L10n::t('Delete Group'),
|
'$delete' => L10n::t('Delete Group'),
|
||||||
'$form_security_token' => get_form_security_token("group_drop"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("group_drop"),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
@ -225,7 +227,7 @@ function group_content(App $a) {
|
||||||
'$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
|
'$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
|
||||||
'$gid' => $group['id'],
|
'$gid' => $group['id'],
|
||||||
'$drop' => $drop_txt,
|
'$drop' => $drop_txt,
|
||||||
'$form_security_token' => get_form_security_token('group_edit'),
|
'$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),
|
||||||
'$edit_name' => L10n::t('Edit Group Name'),
|
'$edit_name' => L10n::t('Edit Group Name'),
|
||||||
'$editable' => 1,
|
'$editable' => 1,
|
||||||
];
|
];
|
||||||
|
@ -244,7 +246,7 @@ function group_content(App $a) {
|
||||||
'contacts' => [],
|
'contacts' => [],
|
||||||
];
|
];
|
||||||
|
|
||||||
$sec_token = addslashes(get_form_security_token('group_member_change'));
|
$sec_token = addslashes(BaseModule::getFormSecurityToken('group_member_change'));
|
||||||
|
|
||||||
// Format the data of the group members
|
// Format the data of the group members
|
||||||
foreach ($members as $member) {
|
foreach ($members as $member) {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\PConfig;
|
use Friendica\Core\PConfig;
|
||||||
|
@ -14,6 +15,7 @@ use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Protocol\Email;
|
use Friendica\Protocol\Email;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
function invite_post(App $a)
|
function invite_post(App $a)
|
||||||
{
|
{
|
||||||
|
@ -22,7 +24,7 @@ function invite_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/', 'send_invite');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/', 'send_invite');
|
||||||
|
|
||||||
$max_invites = intval(Config::get('system', 'max_invites'));
|
$max_invites = intval(Config::get('system', 'max_invites'));
|
||||||
if (! $max_invites) {
|
if (! $max_invites) {
|
||||||
|
@ -139,7 +141,7 @@ function invite_content(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$o = replace_macros($tpl, [
|
$o = replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("send_invite"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("send_invite"),
|
||||||
'$title' => L10n::t('Send invitations'),
|
'$title' => L10n::t('Send invitations'),
|
||||||
'$recipients' => ['recipients', L10n::t('Enter email addresses, one per line:')],
|
'$recipients' => ['recipients', L10n::t('Enter email addresses, one per line:')],
|
||||||
'$message' => ['message', L10n::t('Your message:'),L10n::t('You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web.') . "\r\n" . "\r\n"
|
'$message' => ['message', L10n::t('Your message:'),L10n::t('You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web.') . "\r\n" . "\r\n"
|
||||||
|
|
|
@ -32,6 +32,7 @@ use Friendica\Protocol\Diaspora;
|
||||||
use Friendica\Protocol\Email;
|
use Friendica\Protocol\Email;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Emailer;
|
use Friendica\Util\Emailer;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/enotify.php';
|
require_once 'include/enotify.php';
|
||||||
require_once 'include/text.php';
|
require_once 'include/text.php';
|
||||||
|
@ -42,8 +43,6 @@ function item_post(App $a) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
$uid = local_user();
|
$uid = local_user();
|
||||||
|
|
||||||
if (!empty($_REQUEST['dropitems'])) {
|
if (!empty($_REQUEST['dropitems'])) {
|
||||||
|
@ -162,7 +161,7 @@ function item_post(App $a) {
|
||||||
$allow_comment = local_user() && ($profile_uid == 0) && $parent && in_array($parent_item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
|
$allow_comment = local_user() && ($profile_uid == 0) && $parent && in_array($parent_item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
|
||||||
|
|
||||||
// Now check that valid personal details have been provided
|
// Now check that valid personal details have been provided
|
||||||
if (!can_write_wall($profile_uid) && !$allow_comment) {
|
if (!Security::canWriteToUserWall($profile_uid) && !$allow_comment) {
|
||||||
notice(L10n::t('Permission denied.') . EOL) ;
|
notice(L10n::t('Permission denied.') . EOL) ;
|
||||||
|
|
||||||
if (!empty($_REQUEST['return'])) {
|
if (!empty($_REQUEST['return'])) {
|
||||||
|
@ -871,8 +870,6 @@ function item_content(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
|
||||||
if (($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) {
|
if (($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) {
|
||||||
|
|
|
@ -4,7 +4,6 @@ use Friendica\App;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
function like_content(App $a) {
|
function like_content(App $a) {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* @file mod/manage.php
|
* @file mod/manage.php
|
||||||
*/
|
*/
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\Core\Authentication;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
|
@ -109,8 +110,7 @@ function manage_post(App $a) {
|
||||||
unset($_SESSION['sysmsg_info']);
|
unset($_SESSION['sysmsg_info']);
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once('include/security.php');
|
Authentication::setAuthenticatedSessionForUser($r[0], true, true);
|
||||||
authenticate_success($r[0], true, true);
|
|
||||||
|
|
||||||
if ($limited_id) {
|
if ($limited_id) {
|
||||||
$_SESSION['submanage'] = $original_id;
|
$_SESSION['submanage'] = $original_id;
|
||||||
|
|
|
@ -33,7 +33,6 @@ function notes_content(App $a, $update = false)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
|
|
||||||
$o = Profile::getTabs($a, true);
|
$o = Profile::getTabs($a, true);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\Core\Authentication;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
|
@ -50,8 +51,7 @@ function openid_content(App $a) {
|
||||||
|
|
||||||
unset($_SESSION['openid']);
|
unset($_SESSION['openid']);
|
||||||
|
|
||||||
require_once('include/security.php');
|
Authentication::setAuthenticatedSessionForUser($r[0],true,true);
|
||||||
authenticate_success($r[0],true,true);
|
|
||||||
|
|
||||||
// just in case there was no return url set
|
// just in case there was no return url set
|
||||||
// and we fell through
|
// and we fell through
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Object\Image;
|
use Friendica\Object\Image;
|
||||||
|
use Friendica\Util\Security;
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
function photo_init(App $a)
|
function photo_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -111,7 +110,7 @@ function photo_init(App $a)
|
||||||
intval($resolution)
|
intval($resolution)
|
||||||
);
|
);
|
||||||
if (DBA::isResult($r)) {
|
if (DBA::isResult($r)) {
|
||||||
$sql_extra = permissions_sql($r[0]['uid']);
|
$sql_extra = Security::getPermissionsSQLByUserId($r[0]['uid']);
|
||||||
|
|
||||||
// Now we'll see if we can access the photo
|
// Now we'll see if we can access the photo
|
||||||
$r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1",
|
$r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1",
|
||||||
|
|
|
@ -26,9 +26,9 @@ use Friendica\Protocol\DFRN;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Map;
|
use Friendica\Util\Map;
|
||||||
use Friendica\Util\Temporal;
|
use Friendica\Util\Temporal;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
function photos_init(App $a) {
|
function photos_init(App $a) {
|
||||||
|
|
||||||
|
@ -948,7 +948,6 @@ function photos_content(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
|
|
||||||
if (empty($a->data['user'])) {
|
if (empty($a->data['user'])) {
|
||||||
|
@ -1053,7 +1052,7 @@ function photos_content(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql_extra = permissions_sql($owner_uid, $remote_contact, $groups);
|
$sql_extra = Security::getPermissionsSQLByUserId($owner_uid, $remote_contact, $groups);
|
||||||
|
|
||||||
$o = "";
|
$o = "";
|
||||||
|
|
||||||
|
@ -1473,7 +1472,7 @@ function photos_content(App $a)
|
||||||
$tpl = get_markup_template('photo_item.tpl');
|
$tpl = get_markup_template('photo_item.tpl');
|
||||||
$return_url = $a->cmd;
|
$return_url = $a->cmd;
|
||||||
|
|
||||||
if ($can_post || can_write_wall($owner_uid)) {
|
if ($can_post || Security::canWriteToUserWall($owner_uid)) {
|
||||||
$like_tpl = get_markup_template('like_noshare.tpl');
|
$like_tpl = get_markup_template('like_noshare.tpl');
|
||||||
$likebuttons = replace_macros($like_tpl, [
|
$likebuttons = replace_macros($like_tpl, [
|
||||||
'$id' => $link_item['id'],
|
'$id' => $link_item['id'],
|
||||||
|
@ -1485,7 +1484,7 @@ function photos_content(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DBA::isResult($items)) {
|
if (!DBA::isResult($items)) {
|
||||||
if (($can_post || can_write_wall($owner_uid))) {
|
if (($can_post || Security::canWriteToUserWall($owner_uid))) {
|
||||||
$comments .= replace_macros($cmnt_tpl, [
|
$comments .= replace_macros($cmnt_tpl, [
|
||||||
'$return_path' => '',
|
'$return_path' => '',
|
||||||
'$jsreload' => $return_url,
|
'$jsreload' => $return_url,
|
||||||
|
@ -1524,7 +1523,7 @@ function photos_content(App $a)
|
||||||
$dislike = format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike', $link_item['id']);
|
$dislike = format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike', $link_item['id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($can_post || can_write_wall($owner_uid))) {
|
if (($can_post || Security::canWriteToUserWall($owner_uid))) {
|
||||||
$comments .= replace_macros($cmnt_tpl,[
|
$comments .= replace_macros($cmnt_tpl,[
|
||||||
'$return_path' => '',
|
'$return_path' => '',
|
||||||
'$jsreload' => $return_url,
|
'$jsreload' => $return_url,
|
||||||
|
@ -1584,7 +1583,7 @@ function photos_content(App $a)
|
||||||
'$comment' => $comment
|
'$comment' => $comment
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (($can_post || can_write_wall($owner_uid))) {
|
if (($can_post || Security::canWriteToUserWall($owner_uid))) {
|
||||||
$comments .= replace_macros($cmnt_tpl, [
|
$comments .= replace_macros($cmnt_tpl, [
|
||||||
'$return_path' => '',
|
'$return_path' => '',
|
||||||
'$jsreload' => $return_url,
|
'$jsreload' => $return_url,
|
||||||
|
|
|
@ -21,7 +21,6 @@ use Friendica\Core\Worker;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
function poke_init(App $a)
|
function poke_init(App $a)
|
||||||
|
|
|
@ -20,6 +20,7 @@ use Friendica\Model\Profile;
|
||||||
use Friendica\Module\Login;
|
use Friendica\Module\Login;
|
||||||
use Friendica\Protocol\DFRN;
|
use Friendica\Protocol\DFRN;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
|
use Friendica\Util\Security;
|
||||||
use Friendica\Protocol\ActivityPub;
|
use Friendica\Protocol\ActivityPub;
|
||||||
|
|
||||||
function profile_init(App $a)
|
function profile_init(App $a)
|
||||||
|
@ -130,7 +131,6 @@ function profile_content(App $a, $update = 0)
|
||||||
return Login::form();
|
return Login::form();
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ function profile_content(App $a, $update = 0)
|
||||||
$a->page['aside'] .= Widget::categories(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (!empty($category) ? xmlify($category) : ''));
|
$a->page['aside'] .= Widget::categories(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (!empty($category) ? xmlify($category) : ''));
|
||||||
$a->page['aside'] .= Widget::tagCloud();
|
$a->page['aside'] .= Widget::tagCloud();
|
||||||
|
|
||||||
if (can_write_wall($a->profile['profile_uid'])) {
|
if (Security::canWriteToUserWall($a->profile['profile_uid'])) {
|
||||||
$x = [
|
$x = [
|
||||||
'is_owner' => $is_owner,
|
'is_owner' => $is_owner,
|
||||||
'allow_location' => ($is_owner || $commvisitor) && $a->profile['allow_location'],
|
'allow_location' => ($is_owner || $commvisitor) && $a->profile['allow_location'],
|
||||||
|
@ -234,7 +234,7 @@ function profile_content(App $a, $update = 0)
|
||||||
|
|
||||||
|
|
||||||
// Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups
|
// Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups
|
||||||
$sql_extra = item_permissions_sql($a->profile['profile_uid'], $remote_contact, $groups);
|
$sql_extra = Item::getPermissionsSQLByUserId($a->profile['profile_uid'], $remote_contact, $groups);
|
||||||
$sql_extra2 = '';
|
$sql_extra2 = '';
|
||||||
|
|
||||||
if ($update) {
|
if ($update) {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
|
@ -13,6 +14,7 @@ use Friendica\Model\Contact;
|
||||||
use Friendica\Model\Photo;
|
use Friendica\Model\Photo;
|
||||||
use Friendica\Model\Profile;
|
use Friendica\Model\Profile;
|
||||||
use Friendica\Object\Image;
|
use Friendica\Object\Image;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
function profile_photo_init(App $a)
|
function profile_photo_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -30,7 +32,7 @@ function profile_photo_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/profile_photo', 'profile_photo');
|
||||||
|
|
||||||
if (!empty($_POST['cropfinal']) && $_POST['cropfinal'] == 1) {
|
if (!empty($_POST['cropfinal']) && $_POST['cropfinal'] == 1) {
|
||||||
|
|
||||||
|
@ -186,7 +188,7 @@ function profile_photo_content(App $a)
|
||||||
$imagecrop = [];
|
$imagecrop = [];
|
||||||
|
|
||||||
if (isset($a->argv[1]) && $a->argv[1] == 'use' && $a->argc >= 3) {
|
if (isset($a->argv[1]) && $a->argv[1] == 'use' && $a->argc >= 3) {
|
||||||
// check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
|
// BaseModule::checkFormSecurityTokenRedirectOnError('/profile_photo', 'profile_photo');
|
||||||
|
|
||||||
$resource_id = $a->argv[2];
|
$resource_id = $a->argv[2];
|
||||||
//die(":".local_user());
|
//die(":".local_user());
|
||||||
|
@ -246,7 +248,7 @@ function profile_photo_content(App $a)
|
||||||
'$title' => L10n::t('Upload Profile Photo'),
|
'$title' => L10n::t('Upload Profile Photo'),
|
||||||
'$submit' => L10n::t('Upload'),
|
'$submit' => L10n::t('Upload'),
|
||||||
'$profiles' => $profiles,
|
'$profiles' => $profiles,
|
||||||
'$form_security_token' => get_form_security_token("profile_photo"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("profile_photo"),
|
||||||
'$select' => sprintf('%s %s', L10n::t('or'),
|
'$select' => sprintf('%s %s', L10n::t('or'),
|
||||||
($newuser) ? '<a href="' . System::baseUrl() . '">' . L10n::t('skip this step') . '</a>' : '<a href="' . System::baseUrl() . '/photos/' . $a->user['nickname'] . '">' . L10n::t('select a photo from your photo albums') . '</a>')
|
($newuser) ? '<a href="' . System::baseUrl() . '">' . L10n::t('skip this step') . '</a>' : '<a href="' . System::baseUrl() . '/photos/' . $a->user['nickname'] . '">' . L10n::t('select a photo from your photo albums') . '</a>')
|
||||||
]);
|
]);
|
||||||
|
@ -263,7 +265,7 @@ function profile_photo_content(App $a)
|
||||||
'$image_url' => System::baseUrl() . '/photo/' . $filename,
|
'$image_url' => System::baseUrl() . '/photo/' . $filename,
|
||||||
'$title' => L10n::t('Crop Image'),
|
'$title' => L10n::t('Crop Image'),
|
||||||
'$desc' => L10n::t('Please adjust the image cropping for optimum viewing.'),
|
'$desc' => L10n::t('Please adjust the image cropping for optimum viewing.'),
|
||||||
'$form_security_token' => get_form_security_token("profile_photo"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("profile_photo"),
|
||||||
'$done' => L10n::t('Done Editing')
|
'$done' => L10n::t('Done Editing')
|
||||||
]);
|
]);
|
||||||
return $o;
|
return $o;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Content\ContactSelector;
|
use Friendica\Content\ContactSelector;
|
||||||
use Friendica\Content\Feature;
|
use Friendica\Content\Feature;
|
||||||
use Friendica\Content\Nav;
|
use Friendica\Content\Nav;
|
||||||
|
@ -41,7 +42,7 @@ function profiles_init(App $a) {
|
||||||
return; // NOTREACHED
|
return; // NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/profiles', 'profile_drop', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/profiles', 'profile_drop', 't');
|
||||||
|
|
||||||
// move every contact using this profile as their default to the user default
|
// move every contact using this profile as their default to the user default
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ function profiles_init(App $a) {
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] === 'new')) {
|
if (($a->argc > 1) && ($a->argv[1] === 'new')) {
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/profiles', 'profile_new', 't');
|
||||||
|
|
||||||
$r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
|
$r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
|
||||||
intval(local_user()));
|
intval(local_user()));
|
||||||
|
@ -100,7 +101,7 @@ function profiles_init(App $a) {
|
||||||
|
|
||||||
if (($a->argc > 2) && ($a->argv[1] === 'clone')) {
|
if (($a->argc > 2) && ($a->argv[1] === 'clone')) {
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/profiles', 'profile_clone', 't');
|
||||||
|
|
||||||
$r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
|
$r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
|
||||||
intval(local_user()));
|
intval(local_user()));
|
||||||
|
@ -195,7 +196,7 @@ function profiles_post(App $a) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/profiles', 'profile_edit');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/profiles', 'profile_edit');
|
||||||
|
|
||||||
$is_default = (($orig[0]['is-default']) ? 1 : 0);
|
$is_default = (($orig[0]['is-default']) ? 1 : 0);
|
||||||
|
|
||||||
|
@ -565,10 +566,10 @@ function profiles_content(App $a) {
|
||||||
],
|
],
|
||||||
|
|
||||||
'$multi_profiles' => Feature::isEnabled(local_user(), 'multi_profiles'),
|
'$multi_profiles' => Feature::isEnabled(local_user(), 'multi_profiles'),
|
||||||
'$form_security_token' => get_form_security_token("profile_edit"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("profile_edit"),
|
||||||
'$form_security_token_photo' => get_form_security_token("profile_photo"),
|
'$form_security_token_photo' => BaseModule::getFormSecurityToken("profile_photo"),
|
||||||
'$profile_clone_link' => ((Feature::isEnabled(local_user(), 'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_clone") : ""),
|
'$profile_clone_link' => ((Feature::isEnabled(local_user(), 'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t=' . BaseModule::getFormSecurityToken("profile_clone") : ""),
|
||||||
'$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_drop"),
|
'$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t=' . BaseModule::getFormSecurityToken("profile_drop"),
|
||||||
|
|
||||||
'$profile_action' => L10n::t('Profile Actions'),
|
'$profile_action' => L10n::t('Profile Actions'),
|
||||||
'$banner' => L10n::t('Edit Profile Details'),
|
'$banner' => L10n::t('Edit Profile Details'),
|
||||||
|
@ -681,7 +682,7 @@ function profiles_content(App $a) {
|
||||||
'$header' => L10n::t('Edit/Manage Profiles'),
|
'$header' => L10n::t('Edit/Manage Profiles'),
|
||||||
'$chg_photo' => L10n::t('Change profile photo'),
|
'$chg_photo' => L10n::t('Change profile photo'),
|
||||||
'$cr_new' => L10n::t('Create New Profile'),
|
'$cr_new' => L10n::t('Create New Profile'),
|
||||||
'$cr_new_link' => 'profiles/new?t=' . get_form_security_token("profile_new"),
|
'$cr_new_link' => 'profiles/new?t=' . BaseModule::getFormSecurityToken("profile_new"),
|
||||||
'$profiles' => $profiles
|
'$profiles' => $profiles
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,7 @@ use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
use Friendica\Protocol\OStatus;
|
use Friendica\Protocol\OStatus;
|
||||||
|
|
||||||
require_once('include/security.php');
|
require_once 'include/items.php';
|
||||||
require_once('include/items.php');
|
|
||||||
|
|
||||||
function hub_return($valid, $body)
|
function hub_return($valid, $body)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
|
@ -18,7 +19,7 @@ require_once 'include/enotify.php';
|
||||||
|
|
||||||
function register_post(App $a)
|
function register_post(App $a)
|
||||||
{
|
{
|
||||||
check_form_security_token_redirectOnErr('/register', 'register');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/register', 'register');
|
||||||
|
|
||||||
$verified = 0;
|
$verified = 0;
|
||||||
$blocked = 1;
|
$blocked = 1;
|
||||||
|
@ -289,7 +290,7 @@ function register_content(App $a)
|
||||||
'$showprivstatement' => Config::get('system', 'tosprivstatement'),
|
'$showprivstatement' => Config::get('system', 'tosprivstatement'),
|
||||||
'$privstatement' => $tos->privacy_complete,
|
'$privstatement' => $tos->privacy_complete,
|
||||||
'$baseurl' => System::baseurl(),
|
'$baseurl' => System::baseurl(),
|
||||||
'$form_security_token' => get_form_security_token("register"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("register"),
|
||||||
'$explicit_content' => Config::get('system', 'explicit_content', false),
|
'$explicit_content' => Config::get('system', 'explicit_content', false),
|
||||||
'$explicit_content_note' => L10n::t('Note: This node explicitly contains adult content')
|
'$explicit_content_note' => L10n::t('Note: This node explicitly contains adult content')
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -13,7 +13,6 @@ use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
require_once 'mod/dirfind.php';
|
require_once 'mod/dirfind.php';
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\Content\Feature;
|
use Friendica\Content\Feature;
|
||||||
use Friendica\Content\Nav;
|
use Friendica\Content\Nav;
|
||||||
use Friendica\Core\ACL;
|
use Friendica\Core\ACL;
|
||||||
|
@ -22,6 +23,7 @@ use Friendica\Model\User;
|
||||||
use Friendica\Protocol\Email;
|
use Friendica\Protocol\Email;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
use Friendica\Util\Temporal;
|
use Friendica\Util\Temporal;
|
||||||
|
use Friendica\Util\Security;
|
||||||
use Friendica\Module\Login;
|
use Friendica\Module\Login;
|
||||||
|
|
||||||
function get_theme_config_file($theme)
|
function get_theme_config_file($theme)
|
||||||
|
@ -154,7 +156,7 @@ function settings_post(App $a)
|
||||||
$old_page_flags = $a->user['page-flags'];
|
$old_page_flags = $a->user['page-flags'];
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST, 'remove')) {
|
if (($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST, 'remove')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/oauth', 'settings_oauth');
|
||||||
|
|
||||||
$key = $_POST['remove'];
|
$key = $_POST['remove'];
|
||||||
DBA::delete('tokens', ['id' => $key, 'uid' => local_user()]);
|
DBA::delete('tokens', ['id' => $key, 'uid' => local_user()]);
|
||||||
|
@ -163,7 +165,7 @@ function settings_post(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 2) && ($a->argv[1] === 'oauth') && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && x($_POST, 'submit')) {
|
if (($a->argc > 2) && ($a->argv[1] === 'oauth') && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && x($_POST, 'submit')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/oauth', 'settings_oauth');
|
||||||
|
|
||||||
$name = defaults($_POST, 'name' , '');
|
$name = defaults($_POST, 'name' , '');
|
||||||
$key = defaults($_POST, 'key' , '');
|
$key = defaults($_POST, 'key' , '');
|
||||||
|
@ -209,14 +211,14 @@ function settings_post(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
|
if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/addon', 'settings_addon');
|
||||||
|
|
||||||
Addon::callHooks('addon_settings_post', $_POST);
|
Addon::callHooks('addon_settings_post', $_POST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
|
if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/connectors', 'settings_connectors');
|
||||||
|
|
||||||
if (x($_POST, 'general-submit')) {
|
if (x($_POST, 'general-submit')) {
|
||||||
PConfig::set(local_user(), 'system', 'disable_cw', intval($_POST['disable_cw']));
|
PConfig::set(local_user(), 'system', 'disable_cw', intval($_POST['disable_cw']));
|
||||||
|
@ -298,7 +300,7 @@ function settings_post(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] === 'features')) {
|
if (($a->argc > 1) && ($a->argv[1] === 'features')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/features', 'settings_features');
|
||||||
foreach ($_POST as $k => $v) {
|
foreach ($_POST as $k => $v) {
|
||||||
if (strpos($k, 'feature_') === 0) {
|
if (strpos($k, 'feature_') === 0) {
|
||||||
PConfig::set(local_user(), 'feature', substr($k, 8), ((intval($v)) ? 1 : 0));
|
PConfig::set(local_user(), 'feature', substr($k, 8), ((intval($v)) ? 1 : 0));
|
||||||
|
@ -309,7 +311,7 @@ function settings_post(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 1) && ($a->argv[1] === 'display')) {
|
if (($a->argc > 1) && ($a->argv[1] === 'display')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/display', 'settings_display');
|
||||||
|
|
||||||
$theme = x($_POST, 'theme') ? notags(trim($_POST['theme'])) : $a->user['theme'];
|
$theme = x($_POST, 'theme') ? notags(trim($_POST['theme'])) : $a->user['theme'];
|
||||||
$mobile_theme = x($_POST, 'mobile_theme') ? notags(trim($_POST['mobile_theme'])) : '';
|
$mobile_theme = x($_POST, 'mobile_theme') ? notags(trim($_POST['mobile_theme'])) : '';
|
||||||
|
@ -373,7 +375,7 @@ function settings_post(App $a)
|
||||||
return; // NOTREACHED
|
return; // NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/settings', 'settings');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings', 'settings');
|
||||||
|
|
||||||
if (x($_POST,'resend_relocate')) {
|
if (x($_POST,'resend_relocate')) {
|
||||||
Worker::add(PRIORITY_HIGH, 'Notifier', 'relocate', local_user());
|
Worker::add(PRIORITY_HIGH, 'Notifier', 'relocate', local_user());
|
||||||
|
@ -671,7 +673,7 @@ function settings_content(App $a)
|
||||||
if (($a->argc > 2) && ($a->argv[2] === 'add')) {
|
if (($a->argc > 2) && ($a->argv[2] === 'add')) {
|
||||||
$tpl = get_markup_template('settings/oauth_edit.tpl');
|
$tpl = get_markup_template('settings/oauth_edit.tpl');
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_oauth"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_oauth"),
|
||||||
'$title' => L10n::t('Add application'),
|
'$title' => L10n::t('Add application'),
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
'$cancel' => L10n::t('Cancel'),
|
'$cancel' => L10n::t('Cancel'),
|
||||||
|
@ -697,7 +699,7 @@ function settings_content(App $a)
|
||||||
|
|
||||||
$tpl = get_markup_template('settings/oauth_edit.tpl');
|
$tpl = get_markup_template('settings/oauth_edit.tpl');
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_oauth"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_oauth"),
|
||||||
'$title' => L10n::t('Add application'),
|
'$title' => L10n::t('Add application'),
|
||||||
'$submit' => L10n::t('Update'),
|
'$submit' => L10n::t('Update'),
|
||||||
'$cancel' => L10n::t('Cancel'),
|
'$cancel' => L10n::t('Cancel'),
|
||||||
|
@ -711,7 +713,7 @@ function settings_content(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($a->argc > 3) && ($a->argv[2] === 'delete')) {
|
if (($a->argc > 3) && ($a->argv[2] === 'delete')) {
|
||||||
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
|
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/oauth', 'settings_oauth', 't');
|
||||||
|
|
||||||
DBA::delete('clients', ['client_id' => $a->argv[3], 'uid' => local_user()]);
|
DBA::delete('clients', ['client_id' => $a->argv[3], 'uid' => local_user()]);
|
||||||
goaway(System::baseUrl(true)."/settings/oauth/");
|
goaway(System::baseUrl(true)."/settings/oauth/");
|
||||||
|
@ -729,7 +731,7 @@ function settings_content(App $a)
|
||||||
|
|
||||||
$tpl = get_markup_template('settings/oauth.tpl');
|
$tpl = get_markup_template('settings/oauth.tpl');
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_oauth"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_oauth"),
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
'$title' => L10n::t('Connected Apps'),
|
'$title' => L10n::t('Connected Apps'),
|
||||||
'$add' => L10n::t('Add application'),
|
'$add' => L10n::t('Add application'),
|
||||||
|
@ -756,7 +758,7 @@ function settings_content(App $a)
|
||||||
|
|
||||||
$tpl = get_markup_template('settings/addons.tpl');
|
$tpl = get_markup_template('settings/addons.tpl');
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_addon"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_addon"),
|
||||||
'$title' => L10n::t('Addon Settings'),
|
'$title' => L10n::t('Addon Settings'),
|
||||||
'$settings_addons' => $settings_addons
|
'$settings_addons' => $settings_addons
|
||||||
]);
|
]);
|
||||||
|
@ -777,7 +779,7 @@ function settings_content(App $a)
|
||||||
|
|
||||||
$tpl = get_markup_template('settings/features.tpl');
|
$tpl = get_markup_template('settings/features.tpl');
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_features"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_features"),
|
||||||
'$title' => L10n::t('Additional Features'),
|
'$title' => L10n::t('Additional Features'),
|
||||||
'$features' => $arr,
|
'$features' => $arr,
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
|
@ -836,7 +838,7 @@ function settings_content(App $a)
|
||||||
$mail_disabled_message = (($mail_disabled) ? L10n::t('Email access is disabled on this site.') : '');
|
$mail_disabled_message = (($mail_disabled) ? L10n::t('Email access is disabled on this site.') : '');
|
||||||
|
|
||||||
$o .= replace_macros($tpl, [
|
$o .= replace_macros($tpl, [
|
||||||
'$form_security_token' => get_form_security_token("settings_connectors"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_connectors"),
|
||||||
|
|
||||||
'$title' => L10n::t('Social Networks'),
|
'$title' => L10n::t('Social Networks'),
|
||||||
|
|
||||||
|
@ -956,7 +958,7 @@ function settings_content(App $a)
|
||||||
$tpl = get_markup_template('settings/display.tpl');
|
$tpl = get_markup_template('settings/display.tpl');
|
||||||
$o = replace_macros($tpl, [
|
$o = replace_macros($tpl, [
|
||||||
'$ptitle' => L10n::t('Display Settings'),
|
'$ptitle' => L10n::t('Display Settings'),
|
||||||
'$form_security_token' => get_form_security_token("settings_display"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings_display"),
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
'$uid' => local_user(),
|
'$uid' => local_user(),
|
||||||
|
@ -1185,7 +1187,7 @@ function settings_content(App $a)
|
||||||
'$submit' => L10n::t('Save Settings'),
|
'$submit' => L10n::t('Save Settings'),
|
||||||
'$baseurl' => System::baseUrl(true),
|
'$baseurl' => System::baseUrl(true),
|
||||||
'$uid' => local_user(),
|
'$uid' => local_user(),
|
||||||
'$form_security_token' => get_form_security_token("settings"),
|
'$form_security_token' => BaseModule::getFormSecurityToken("settings"),
|
||||||
'$nickname_block' => $prof_addr,
|
'$nickname_block' => $prof_addr,
|
||||||
|
|
||||||
'$h_pass' => L10n::t('Password Settings'),
|
'$h_pass' => L10n::t('Password Settings'),
|
||||||
|
|
|
@ -8,8 +8,8 @@ use Friendica\Core\L10n;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
function subthread_content(App $a) {
|
function subthread_content(App $a) {
|
||||||
|
@ -32,7 +32,7 @@ function subthread_content(App $a) {
|
||||||
|
|
||||||
$owner_uid = $item['uid'];
|
$owner_uid = $item['uid'];
|
||||||
|
|
||||||
if (!can_write_wall($owner_uid)) {
|
if (!Security::canWriteToUserWall($owner_uid)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ use Friendica\Core\Worker;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
|
|
||||||
function tagger_content(App $a) {
|
function tagger_content(App $a) {
|
||||||
|
|
|
@ -14,9 +14,9 @@ use Friendica\Model\Group;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
use Friendica\Model\Profile;
|
use Friendica\Model\Profile;
|
||||||
use Friendica\Protocol\DFRN;
|
use Friendica\Protocol\DFRN;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/items.php';
|
require_once 'include/items.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
function videos_init(App $a)
|
function videos_init(App $a)
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,7 @@ function videos_init(App $a)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/// @TODO Old-lost code?
|
/// @TODO Old-lost code?
|
||||||
/*$sql_extra = permissions_sql($a->data['user']['uid']);
|
/*$sql_extra = Security::getPermissionsSQLByUserId($a->data['user']['uid']);
|
||||||
|
|
||||||
$albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d $sql_extra order by created desc",
|
$albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d $sql_extra order by created desc",
|
||||||
intval($a->data['user']['uid'])
|
intval($a->data['user']['uid'])
|
||||||
|
@ -193,7 +193,6 @@ function videos_content(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/conversation.php';
|
require_once 'include/conversation.php';
|
||||||
|
|
||||||
if (empty($a->data['user'])) {
|
if (empty($a->data['user'])) {
|
||||||
|
@ -302,7 +301,7 @@ function videos_content(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql_extra = permissions_sql($owner_uid, $remote_contact, $groups);
|
$sql_extra = Security::getPermissionsSQLByUserId($owner_uid, $remote_contact, $groups);
|
||||||
|
|
||||||
$o = "";
|
$o = "";
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
|
|
||||||
namespace Friendica;
|
namespace Friendica;
|
||||||
|
|
||||||
|
use Friendica\Core\L10n;
|
||||||
|
use Friendica\Core\System;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All modules in Friendica should extend BaseModule, although not all modules
|
* All modules in Friendica should extend BaseModule, although not all modules
|
||||||
* need to extend all the methods described here
|
* need to extend all the methods described here
|
||||||
|
@ -69,4 +72,84 @@ abstract class BaseModule extends BaseObject
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions used to protect against Cross-Site Request Forgery
|
||||||
|
* The security token has to base on at least one value that an attacker can't know - here it's the session ID and the private key.
|
||||||
|
* In this implementation, a security token is reusable (if the user submits a form, goes back and resubmits the form, maybe with small changes;
|
||||||
|
* or if the security token is used for ajax-calls that happen several times), but only valid for a certain amout of time (3hours).
|
||||||
|
* The "typename" seperates the security tokens of different types of forms. This could be relevant in the following case:
|
||||||
|
* A security token is used to protekt a link from CSRF (e.g. the "delete this profile"-link).
|
||||||
|
* If the new page contains by any chance external elements, then the used security token is exposed by the referrer.
|
||||||
|
* Actually, important actions should not be triggered by Links / GET-Requests at all, but somethimes they still are,
|
||||||
|
* so this mechanism brings in some damage control (the attacker would be able to forge a request to a form of this type, but not to forms of other types).
|
||||||
|
*/
|
||||||
|
public static function getFormSecurityToken($typename = '')
|
||||||
|
{
|
||||||
|
$a = get_app();
|
||||||
|
|
||||||
|
$timestamp = time();
|
||||||
|
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $timestamp . $typename);
|
||||||
|
|
||||||
|
return $timestamp . '.' . $sec_hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function checkFormSecurityToken($typename = '', $formname = 'form_security_token')
|
||||||
|
{
|
||||||
|
$hash = null;
|
||||||
|
|
||||||
|
if (!empty($_REQUEST[$formname])) {
|
||||||
|
/// @TODO Careful, not secured!
|
||||||
|
$hash = $_REQUEST[$formname];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($_SERVER['HTTP_X_CSRF_TOKEN'])) {
|
||||||
|
/// @TODO Careful, not secured!
|
||||||
|
$hash = $_SERVER['HTTP_X_CSRF_TOKEN'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($hash)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$max_livetime = 10800; // 3 hours
|
||||||
|
|
||||||
|
$a = get_app();
|
||||||
|
|
||||||
|
$x = explode('.', $hash);
|
||||||
|
if (time() > (IntVal($x[0]) + $max_livetime)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename);
|
||||||
|
|
||||||
|
return ($sec_hash == $x[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getFormSecurityStandardErrorMessage()
|
||||||
|
{
|
||||||
|
return L10n::t("The form security token was not correct. This probably happened because the form has been opened for too long \x28>3 hours\x29 before submitting it.") . EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function checkFormSecurityTokenRedirectOnError($err_redirect, $typename = '', $formname = 'form_security_token')
|
||||||
|
{
|
||||||
|
if (!self::checkFormSecurityToken($typename, $formname)) {
|
||||||
|
$a = get_app();
|
||||||
|
logger('checkFormSecurityToken failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
|
||||||
|
logger('checkFormSecurityToken failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
|
||||||
|
notice(self::getFormSecurityStandardErrorMessage());
|
||||||
|
goaway(System::baseUrl() . $err_redirect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function checkFormSecurityTokenForbiddenOnError($typename = '', $formname = 'form_security_token')
|
||||||
|
{
|
||||||
|
if (!self::checkFormSecurityToken($typename, $formname)) {
|
||||||
|
$a = get_app();
|
||||||
|
logger('checkFormSecurityToken failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
|
||||||
|
logger('checkFormSecurityToken failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
|
||||||
|
header('HTTP/1.1 403 Forbidden');
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1319,7 +1319,7 @@ class BBCode extends BaseObject
|
||||||
|
|
||||||
// Handle Diaspora posts
|
// Handle Diaspora posts
|
||||||
$text = preg_replace_callback(
|
$text = preg_replace_callback(
|
||||||
"&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
|
"&\[url=/?posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
|
||||||
function ($match) {
|
function ($match) {
|
||||||
return "[url=" . System::baseUrl() . "/display/" . $match[1] . "]" . $match[2] . "[/url]";
|
return "[url=" . System::baseUrl() . "/display/" . $match[1] . "]" . $match[2] . "[/url]";
|
||||||
}, $text
|
}, $text
|
||||||
|
|
|
@ -9,9 +9,10 @@ namespace Friendica\Content\Widget;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Model\Item;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/dba.php';
|
require_once 'include/dba.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TagCloud widget
|
* TagCloud widget
|
||||||
|
@ -73,7 +74,7 @@ class TagCloud
|
||||||
*/
|
*/
|
||||||
private static function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)
|
private static function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)
|
||||||
{
|
{
|
||||||
$sql_options = item_permissions_sql($uid);
|
$sql_options = Item::getPermissionsSQLByUserId($uid);
|
||||||
$limit = $count ? sprintf('LIMIT %d', intval($count)) : '';
|
$limit = $count ? sprintf('LIMIT %d', intval($count)) : '';
|
||||||
|
|
||||||
if ($flags) {
|
if ($flags) {
|
||||||
|
|
212
src/Core/Authentication.php
Normal file
212
src/Core/Authentication.php
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file /src/Core/Authentication.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Friendica\Core;
|
||||||
|
|
||||||
|
use Friendica\Core\Addon;
|
||||||
|
use Friendica\BaseObject;
|
||||||
|
use Friendica\Core\Config;
|
||||||
|
use Friendica\Util\DateTimeFormat;
|
||||||
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Core\L10n;
|
||||||
|
use Friendica\Core\PConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Authentification, Session and Cookies
|
||||||
|
*/
|
||||||
|
class Authentication extends BaseObject
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @brief Calculate the hash that is needed for the "Friendica" cookie
|
||||||
|
*
|
||||||
|
* @param array $user Record from "user" table
|
||||||
|
*
|
||||||
|
* @return string Hashed data
|
||||||
|
*/
|
||||||
|
public static function getCookieHashForUser($user)
|
||||||
|
{
|
||||||
|
return(hash("sha256", Config::get("system", "site_prvkey") .
|
||||||
|
$user["prvkey"] .
|
||||||
|
$user["password"]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the "Friendica" cookie
|
||||||
|
*
|
||||||
|
* @param int $time
|
||||||
|
* @param array $user Record from "user" table
|
||||||
|
*/
|
||||||
|
public static function setCookie($time, $user = [])
|
||||||
|
{
|
||||||
|
if ($time != 0) {
|
||||||
|
$time = $time + time();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
$value = json_encode(["uid" => $user["uid"],
|
||||||
|
"hash" => self::getCookieHashForUser($user),
|
||||||
|
"ip" => defaults($_SERVER, 'REMOTE_ADDR', '0.0.0.0')]);
|
||||||
|
} else {
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the provided user's authenticated session
|
||||||
|
*
|
||||||
|
* @todo Should be moved to Friendica\Core\Session once it's created
|
||||||
|
*
|
||||||
|
* @param type $user_record
|
||||||
|
* @param type $login_initial
|
||||||
|
* @param type $interactive
|
||||||
|
* @param type $login_refresh
|
||||||
|
*/
|
||||||
|
public static function setAuthenticatedSessionForUser($user_record, $login_initial = false, $interactive = false, $login_refresh = false)
|
||||||
|
{
|
||||||
|
$a = self::getApp();
|
||||||
|
|
||||||
|
$_SESSION['uid'] = $user_record['uid'];
|
||||||
|
$_SESSION['theme'] = $user_record['theme'];
|
||||||
|
$_SESSION['mobile-theme'] = PConfig::get($user_record['uid'], 'system', 'mobile_theme');
|
||||||
|
$_SESSION['authenticated'] = 1;
|
||||||
|
$_SESSION['page_flags'] = $user_record['page-flags'];
|
||||||
|
$_SESSION['my_url'] = $a->getbaseUrl() . '/profile/' . $user_record['nickname'];
|
||||||
|
$_SESSION['my_address'] = $user_record['nickname'] . '@' . substr($a->getbaseUrl(), strpos($a->getbaseUrl(), '://') + 3);
|
||||||
|
$_SESSION['addr'] = defaults($_SERVER, 'REMOTE_ADDR', '0.0.0.0');
|
||||||
|
|
||||||
|
$a->user = $user_record;
|
||||||
|
|
||||||
|
if ($interactive) {
|
||||||
|
if ($a->user['login_date'] <= NULL_DATE) {
|
||||||
|
$_SESSION['return_url'] = 'profile_photo/new';
|
||||||
|
$a->module = 'profile_photo';
|
||||||
|
info(L10n::t("Welcome ") . $a->user['username'] . EOL);
|
||||||
|
info(L10n::t('Please upload a profile photo.') . EOL);
|
||||||
|
} else {
|
||||||
|
info(L10n::t("Welcome back ") . $a->user['username'] . EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$member_since = strtotime($a->user['register_date']);
|
||||||
|
if (time() < ($member_since + ( 60 * 60 * 24 * 14))) {
|
||||||
|
$_SESSION['new_member'] = true;
|
||||||
|
} else {
|
||||||
|
$_SESSION['new_member'] = false;
|
||||||
|
}
|
||||||
|
if (strlen($a->user['timezone'])) {
|
||||||
|
date_default_timezone_set($a->user['timezone']);
|
||||||
|
$a->timezone = $a->user['timezone'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$master_record = $a->user;
|
||||||
|
|
||||||
|
if ((x($_SESSION, 'submanage')) && intval($_SESSION['submanage'])) {
|
||||||
|
$user = DBA::selectFirst('user', [], ['uid' => $_SESSION['submanage']]);
|
||||||
|
if (DBA::isResult($user)) {
|
||||||
|
$master_record = $user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($master_record['parent-uid'] == 0) {
|
||||||
|
// First add our own entry
|
||||||
|
$a->identities = [['uid' => $master_record['uid'],
|
||||||
|
'username' => $master_record['username'],
|
||||||
|
'nickname' => $master_record['nickname']]];
|
||||||
|
|
||||||
|
// Then add all the children
|
||||||
|
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
||||||
|
['parent-uid' => $master_record['uid'], 'account_removed' => false]);
|
||||||
|
if (DBA::isResult($r)) {
|
||||||
|
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Just ensure that the array is always defined
|
||||||
|
$a->identities = [];
|
||||||
|
|
||||||
|
// First entry is our parent
|
||||||
|
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
||||||
|
['uid' => $master_record['parent-uid'], 'account_removed' => false]);
|
||||||
|
if (DBA::isResult($r)) {
|
||||||
|
$a->identities = DBA::toArray($r);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then add all siblings
|
||||||
|
$r = DBA::select('user', ['uid', 'username', 'nickname'],
|
||||||
|
['parent-uid' => $master_record['parent-uid'], 'account_removed' => false]);
|
||||||
|
if (DBA::isResult($r)) {
|
||||||
|
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = DBA::p("SELECT `user`.`uid`, `user`.`username`, `user`.`nickname`
|
||||||
|
FROM `manage`
|
||||||
|
INNER JOIN `user` ON `manage`.`mid` = `user`.`uid`
|
||||||
|
WHERE `user`.`account_removed` = 0 AND `manage`.`uid` = ?",
|
||||||
|
$master_record['uid']
|
||||||
|
);
|
||||||
|
if (DBA::isResult($r)) {
|
||||||
|
$a->identities = array_merge($a->identities, DBA::toArray($r));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($login_initial) {
|
||||||
|
logger('auth_identities: ' . print_r($a->identities, true), LOGGER_DEBUG);
|
||||||
|
}
|
||||||
|
if ($login_refresh) {
|
||||||
|
logger('auth_identities refresh: ' . print_r($a->identities, true), LOGGER_DEBUG);
|
||||||
|
}
|
||||||
|
|
||||||
|
$contact = DBA::selectFirst('contact', [], ['uid' => $_SESSION['uid'], 'self' => true]);
|
||||||
|
if (DBA::isResult($contact)) {
|
||||||
|
$a->contact = $contact;
|
||||||
|
$a->cid = $contact['id'];
|
||||||
|
$_SESSION['cid'] = $a->cid;
|
||||||
|
}
|
||||||
|
|
||||||
|
header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] . '"');
|
||||||
|
|
||||||
|
if ($login_initial || $login_refresh) {
|
||||||
|
DBA::update('user', ['login_date' => DateTimeFormat::utcNow()], ['uid' => $_SESSION['uid']]);
|
||||||
|
|
||||||
|
// Set the login date for all identities of the user
|
||||||
|
DBA::update('user', ['login_date' => DateTimeFormat::utcNow()],
|
||||||
|
['parent-uid' => $master_record['uid'], 'account_removed' => false]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($login_initial) {
|
||||||
|
/*
|
||||||
|
* If the user specified to remember the authentication, then set a cookie
|
||||||
|
* that expires after one week (the default is when the browser is closed).
|
||||||
|
* The cookie will be renewed automatically.
|
||||||
|
* The week ensures that sessions will expire after some inactivity.
|
||||||
|
*/
|
||||||
|
if (!empty($_SESSION['remember'])) {
|
||||||
|
logger('Injecting cookie for remembered user ' . $a->user['nickname']);
|
||||||
|
self::setCookie(604800, $user_record);
|
||||||
|
unset($_SESSION['remember']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($login_initial) {
|
||||||
|
Addon::callHooks('logged_in', $a->user);
|
||||||
|
|
||||||
|
if (($a->module !== 'home') && isset($_SESSION['return_url'])) {
|
||||||
|
goaway($a->getbaseUrl() . '/' . $_SESSION['return_url']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Kills the "Friendica" cookie and all session data
|
||||||
|
*/
|
||||||
|
public static function deleteSession()
|
||||||
|
{
|
||||||
|
self::setCookie(-3600); // make sure cookie is deleted on browser close, as a security measure
|
||||||
|
session_unset();
|
||||||
|
session_destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,11 @@ class Conversation
|
||||||
const PARCEL_TWITTER = 67;
|
const PARCEL_TWITTER = 67;
|
||||||
const PARCEL_UNKNOWN = 255;
|
const PARCEL_UNKNOWN = 255;
|
||||||
|
|
||||||
|
public static function getByItemUri($item_uri)
|
||||||
|
{
|
||||||
|
return DBA::selectFirst('conversation', [], ['item-uri' => $item_uri]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Store the conversation data
|
* @brief Store the conversation data
|
||||||
*
|
*
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
*/
|
*/
|
||||||
namespace Friendica\Model;
|
namespace Friendica\Model;
|
||||||
|
|
||||||
|
use Friendica\BaseModule;
|
||||||
use Friendica\BaseObject;
|
use Friendica\BaseObject;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
require_once 'include/dba.php';
|
require_once 'include/dba.php';
|
||||||
|
@ -409,7 +411,7 @@ class Group extends BaseObject
|
||||||
'$createtext' => L10n::t('Create a new group'),
|
'$createtext' => L10n::t('Create a new group'),
|
||||||
'$creategroup' => L10n::t('Group Name: '),
|
'$creategroup' => L10n::t('Group Name: '),
|
||||||
'$editgroupstext' => L10n::t('Edit groups'),
|
'$editgroupstext' => L10n::t('Edit groups'),
|
||||||
'$form_security_token' => get_form_security_token('group_edit'),
|
'$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ use Friendica\Protocol\Diaspora;
|
||||||
use Friendica\Protocol\OStatus;
|
use Friendica\Protocol\OStatus;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\XML;
|
use Friendica\Util\XML;
|
||||||
|
use Friendica\Util\Security;
|
||||||
use Text_LanguageDetect;
|
use Text_LanguageDetect;
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
|
@ -80,7 +81,7 @@ class Item extends BaseObject
|
||||||
// All fields in the item table
|
// All fields in the item table
|
||||||
const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
|
const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
|
||||||
'contact-id', 'type', 'wall', 'gravity', 'extid', 'icid', 'iaid', 'psid',
|
'contact-id', 'type', 'wall', 'gravity', 'extid', 'icid', 'iaid', 'psid',
|
||||||
'uri-hash', 'created', 'edited', 'commented', 'received', 'changed', 'verb',
|
'created', 'edited', 'commented', 'received', 'changed', 'verb',
|
||||||
'postopts', 'plink', 'resource-id', 'event-id', 'tag', 'attach', 'inform',
|
'postopts', 'plink', 'resource-id', 'event-id', 'tag', 'attach', 'inform',
|
||||||
'file', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'post-type',
|
'file', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'post-type',
|
||||||
'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
|
'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
|
||||||
|
@ -529,7 +530,7 @@ class Item extends BaseObject
|
||||||
|
|
||||||
$fields['item'] = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
|
$fields['item'] = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
|
||||||
'contact-id', 'owner-id', 'author-id', 'type', 'wall', 'gravity', 'extid',
|
'contact-id', 'owner-id', 'author-id', 'type', 'wall', 'gravity', 'extid',
|
||||||
'created', 'edited', 'commented', 'received', 'changed', 'psid', 'uri-hash',
|
'created', 'edited', 'commented', 'received', 'changed', 'psid',
|
||||||
'resource-id', 'event-id', 'tag', 'attach', 'post-type', 'file',
|
'resource-id', 'event-id', 'tag', 'attach', 'post-type', 'file',
|
||||||
'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
|
'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
|
||||||
'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global',
|
'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global',
|
||||||
|
@ -765,19 +766,6 @@ class Item extends BaseObject
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Generate a server unique item hash for linking between the item tables
|
|
||||||
*
|
|
||||||
* @param string $uri Item URI
|
|
||||||
* @param date $created Item creation date
|
|
||||||
*
|
|
||||||
* @return string the item hash
|
|
||||||
*/
|
|
||||||
private static function itemHash($uri, $created)
|
|
||||||
{
|
|
||||||
return round(strtotime($created) / 100) . hash('ripemd128', $uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Update existing item entries
|
* @brief Update existing item entries
|
||||||
*
|
*
|
||||||
|
@ -803,7 +791,7 @@ class Item extends BaseObject
|
||||||
// We cannot simply expand the condition to check for origin entries
|
// We cannot simply expand the condition to check for origin entries
|
||||||
// The condition needn't to be a simple array but could be a complex condition.
|
// The condition needn't to be a simple array but could be a complex condition.
|
||||||
// And we have to execute this query before the update to ensure to fetch the same data.
|
// And we have to execute this query before the update to ensure to fetch the same data.
|
||||||
$items = DBA::select('item', ['id', 'origin', 'uri', 'created', 'uri-hash', 'iaid', 'icid', 'tag', 'file'], $condition);
|
$items = DBA::select('item', ['id', 'origin', 'uri', 'uri-id', 'iaid', 'icid', 'tag', 'file'], $condition);
|
||||||
|
|
||||||
$content_fields = [];
|
$content_fields = [];
|
||||||
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
||||||
|
@ -858,34 +846,11 @@ class Item extends BaseObject
|
||||||
$rows = DBA::affectedRows();
|
$rows = DBA::affectedRows();
|
||||||
|
|
||||||
while ($item = DBA::fetch($items)) {
|
while ($item = DBA::fetch($items)) {
|
||||||
|
|
||||||
// This part here can safely be removed when the legacy fields in the item had been removed
|
|
||||||
if (empty($item['uri-hash']) && !empty($item['uri']) && !empty($item['created'])) {
|
|
||||||
|
|
||||||
// Fetch the uri-hash from an existing item entry if there is one
|
|
||||||
$item_condition = ["`uri` = ? AND `uri-hash` != ''", $item['uri']];
|
|
||||||
$existing = DBA::selectfirst('item', ['uri-hash'], $item_condition);
|
|
||||||
if (DBA::isResult($existing)) {
|
|
||||||
$item['uri-hash'] = $existing['uri-hash'];
|
|
||||||
} else {
|
|
||||||
$item['uri-hash'] = self::itemHash($item['uri'], $item['created']);
|
|
||||||
}
|
|
||||||
|
|
||||||
DBA::update('item', ['uri-hash' => $item['uri-hash']], ['id' => $item['id']]);
|
|
||||||
DBA::update('item-activity', ['uri-hash' => $item['uri-hash']], ["`uri` = ? AND `uri-hash` = ''", $item['uri']]);
|
|
||||||
DBA::update('item-content', ['uri-plink-hash' => $item['uri-hash']], ["`uri` = ? AND `uri-plink-hash` = ''", $item['uri']]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($item['iaid']) || (!empty($content_fields['verb']) && (self::activityToIndex($content_fields['verb']) >= 0))) {
|
if (!empty($item['iaid']) || (!empty($content_fields['verb']) && (self::activityToIndex($content_fields['verb']) >= 0))) {
|
||||||
if (!empty($item['iaid'])) {
|
self::updateActivity($content_fields, ['uri-id' => $item['uri-id']]);
|
||||||
$update_condition = ['id' => $item['iaid']];
|
|
||||||
} else {
|
|
||||||
$update_condition = ['uri-hash' => $item['uri-hash']];
|
|
||||||
}
|
|
||||||
self::updateActivity($content_fields, $update_condition);
|
|
||||||
|
|
||||||
if (empty($item['iaid'])) {
|
if (empty($item['iaid'])) {
|
||||||
$item_activity = DBA::selectFirst('item-activity', ['id'], ['uri-hash' => $item['uri-hash']]);
|
$item_activity = DBA::selectFirst('item-activity', ['id'], ['uri-id' => $item['uri-id']]);
|
||||||
if (DBA::isResult($item_activity)) {
|
if (DBA::isResult($item_activity)) {
|
||||||
$item_fields = ['iaid' => $item_activity['id'], 'icid' => null];
|
$item_fields = ['iaid' => $item_activity['id'], 'icid' => null];
|
||||||
foreach (self::MIXED_CONTENT_FIELDLIST as $field) {
|
foreach (self::MIXED_CONTENT_FIELDLIST as $field) {
|
||||||
|
@ -909,15 +874,10 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!empty($item['icid'])) {
|
self::updateContent($content_fields, ['uri-id' => $item['uri-id']]);
|
||||||
$update_condition = ['id' => $item['icid']];
|
|
||||||
} else {
|
|
||||||
$update_condition = ['uri-plink-hash' => $item['uri-hash']];
|
|
||||||
}
|
|
||||||
self::updateContent($content_fields, $update_condition);
|
|
||||||
|
|
||||||
if (empty($item['icid'])) {
|
if (empty($item['icid'])) {
|
||||||
$item_content = DBA::selectFirst('item-content', [], ['uri-plink-hash' => $item['uri-hash']]);
|
$item_content = DBA::selectFirst('item-content', [], ['uri-id' => $item['uri-id']]);
|
||||||
if (DBA::isResult($item_content)) {
|
if (DBA::isResult($item_content)) {
|
||||||
$item_fields = ['icid' => $item_content['id']];
|
$item_fields = ['icid' => $item_content['id']];
|
||||||
// Clear all fields in the item table that have a content in the item-content table
|
// Clear all fields in the item table that have a content in the item-content table
|
||||||
|
@ -1380,13 +1340,6 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure to always have the same creation date.
|
|
||||||
$existing = self::selectfirst(['created', 'uri-hash'], ['uri' => $item['uri']]);
|
|
||||||
if (DBA::isResult($existing)) {
|
|
||||||
$item['created'] = $existing['created'];
|
|
||||||
$item['uri-hash'] = $existing['uri-hash'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$item['wall'] = intval(defaults($item, 'wall', 0));
|
$item['wall'] = intval(defaults($item, 'wall', 0));
|
||||||
$item['extid'] = trim(defaults($item, 'extid', ''));
|
$item['extid'] = trim(defaults($item, 'extid', ''));
|
||||||
$item['author-name'] = trim(defaults($item, 'author-name', ''));
|
$item['author-name'] = trim(defaults($item, 'author-name', ''));
|
||||||
|
@ -1429,9 +1382,6 @@ class Item extends BaseObject
|
||||||
$item['inform'] = trim(defaults($item, 'inform', ''));
|
$item['inform'] = trim(defaults($item, 'inform', ''));
|
||||||
$item['file'] = trim(defaults($item, 'file', ''));
|
$item['file'] = trim(defaults($item, 'file', ''));
|
||||||
|
|
||||||
// Unique identifier to be linked against item-activities and item-content
|
|
||||||
$item['uri-hash'] = defaults($item, 'uri-hash', self::itemHash($item['uri'], $item['created']));
|
|
||||||
|
|
||||||
// When there is no content then we don't post it
|
// When there is no content then we don't post it
|
||||||
if ($item['body'].$item['title'] == '') {
|
if ($item['body'].$item['title'] == '') {
|
||||||
logger('No body, no title.');
|
logger('No body, no title.');
|
||||||
|
@ -1927,8 +1877,7 @@ class Item extends BaseObject
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$fields = ['uri' => $item['uri'], 'activity' => $activity_index,
|
$fields = ['activity' => $activity_index, 'uri-hash' => (string)$item['uri-id'], 'uri-id' => $item['uri-id']];
|
||||||
'uri-hash' => $item['uri-hash'], 'uri-id' => $item['uri-id']];
|
|
||||||
|
|
||||||
// We just remove everything that is content
|
// We just remove everything that is content
|
||||||
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
||||||
|
@ -1942,7 +1891,7 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do we already have this content?
|
// Do we already have this content?
|
||||||
$item_activity = DBA::selectFirst('item-activity', ['id'], ['uri-hash' => $item['uri-hash']]);
|
$item_activity = DBA::selectFirst('item-activity', ['id'], ['uri-id' => $item['uri-id']]);
|
||||||
if (DBA::isResult($item_activity)) {
|
if (DBA::isResult($item_activity)) {
|
||||||
$item['iaid'] = $item_activity['id'];
|
$item['iaid'] = $item_activity['id'];
|
||||||
logger('Fetched activity for URI ' . $item['uri'] . ' (' . $item['iaid'] . ')');
|
logger('Fetched activity for URI ' . $item['uri'] . ' (' . $item['iaid'] . ')');
|
||||||
|
@ -1968,8 +1917,7 @@ class Item extends BaseObject
|
||||||
*/
|
*/
|
||||||
private static function insertContent(&$item)
|
private static function insertContent(&$item)
|
||||||
{
|
{
|
||||||
$fields = ['uri' => $item['uri'], 'uri-plink-hash' => $item['uri-hash'],
|
$fields = ['uri-plink-hash' => (string)$item['uri-id'], 'uri-id' => $item['uri-id']];
|
||||||
'uri-id' => $item['uri-id']];
|
|
||||||
|
|
||||||
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
|
||||||
if (isset($item[$field])) {
|
if (isset($item[$field])) {
|
||||||
|
@ -1985,7 +1933,7 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do we already have this content?
|
// Do we already have this content?
|
||||||
$item_content = DBA::selectFirst('item-content', ['id'], ['uri-plink-hash' => $item['uri-hash']]);
|
$item_content = DBA::selectFirst('item-content', ['id'], ['uri-id' => $item['uri-id']]);
|
||||||
if (DBA::isResult($item_content)) {
|
if (DBA::isResult($item_content)) {
|
||||||
$item['icid'] = $item_content['id'];
|
$item['icid'] = $item_content['id'];
|
||||||
logger('Fetched content for URI ' . $item['uri'] . ' (' . $item['icid'] . ')');
|
logger('Fetched content for URI ' . $item['uri'] . ' (' . $item['icid'] . ')');
|
||||||
|
@ -3060,7 +3008,7 @@ class Item extends BaseObject
|
||||||
$uid = local_user();
|
$uid = local_user();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!can_write_wall($uid)) {
|
if (!Security::canWriteToUserWall($uid)) {
|
||||||
logger('like: unable to write on wall ' . $uid);
|
logger('like: unable to write on wall ' . $uid);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3246,4 +3194,41 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getPermissionsSQLByUserId($owner_id, $remote_verified = false, $groups = null)
|
||||||
|
{
|
||||||
|
$local_user = local_user();
|
||||||
|
$remote_user = remote_user();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construct permissions
|
||||||
|
*
|
||||||
|
* default permissions - anonymous user
|
||||||
|
*/
|
||||||
|
$sql = " AND NOT `item`.`private`";
|
||||||
|
|
||||||
|
// Profile owner - everything is visible
|
||||||
|
if ($local_user && ($local_user == $owner_id)) {
|
||||||
|
$sql = '';
|
||||||
|
} elseif ($remote_user) {
|
||||||
|
/*
|
||||||
|
* Authenticated visitor. Unless pre-verified,
|
||||||
|
* check that the contact belongs to this $owner_id
|
||||||
|
* and load the groups the visitor belongs to.
|
||||||
|
* If pre-verified, the caller is expected to have already
|
||||||
|
* done this and passed the groups into this function.
|
||||||
|
*/
|
||||||
|
$set = PermissionSet::get($owner_id, $remote_user, $groups);
|
||||||
|
|
||||||
|
if (!empty($set)) {
|
||||||
|
$sql_set = " OR (`item`.`private` IN (1,2) AND `item`.`wall` AND `item`.`psid` IN (" . implode(',', $set) . "))";
|
||||||
|
} else {
|
||||||
|
$sql_set = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = " AND (NOT `item`.`private`" . $sql_set . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ use Friendica\Database\DBA;
|
||||||
use Friendica\Object\Image;
|
use Friendica\Object\Image;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'include/dba.php';
|
require_once 'include/dba.php';
|
||||||
|
|
||||||
|
@ -226,7 +227,7 @@ class Photo
|
||||||
*/
|
*/
|
||||||
public static function getAlbums($uid, $update = false)
|
public static function getAlbums($uid, $update = false)
|
||||||
{
|
{
|
||||||
$sql_extra = permissions_sql($uid);
|
$sql_extra = Security::getPermissionsSQLByUserId($uid);
|
||||||
|
|
||||||
$key = "photo_albums:".$uid.":".local_user().":".remote_user();
|
$key = "photo_albums:".$uid.":".local_user().":".remote_user();
|
||||||
$albums = Cache::get($key);
|
$albums = Cache::get($key);
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*/
|
*/
|
||||||
namespace Friendica\Model;
|
namespace Friendica\Model;
|
||||||
|
|
||||||
use DivineOmega\PasswordExposed\PasswordStatus;
|
use DivineOmega\PasswordExposed;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
|
@ -20,7 +20,6 @@ use Friendica\Util\Crypto;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
use LightOpenID;
|
use LightOpenID;
|
||||||
use function password_exposed;
|
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
require_once 'include/dba.php';
|
require_once 'include/dba.php';
|
||||||
|
@ -280,7 +279,14 @@ class User
|
||||||
*/
|
*/
|
||||||
public static function isPasswordExposed($password)
|
public static function isPasswordExposed($password)
|
||||||
{
|
{
|
||||||
return password_exposed($password) === PasswordStatus::EXPOSED;
|
$cache = new \DivineOmega\DOFileCachePSR6\CacheItemPool();
|
||||||
|
$cache->changeConfig([
|
||||||
|
'cacheDirectory' => get_temppath() . '/password-exposed-cache/',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$PasswordExposedCHecker = new PasswordExposed\PasswordExposedChecker(null, $cache);
|
||||||
|
|
||||||
|
return $PasswordExposedCHecker->passwordExposed($password) === PasswordExposed\PasswordStatus::EXPOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -684,7 +690,7 @@ class User
|
||||||
Login Name: %4$s
|
Login Name: %4$s
|
||||||
Password: %5$s
|
Password: %5$s
|
||||||
',
|
',
|
||||||
$body, $user['username'], $sitename, $siteurl, $user['nickname'], $password
|
$user['username'], $sitename, $siteurl, $user['nickname'], $password
|
||||||
));
|
));
|
||||||
|
|
||||||
return notification([
|
return notification([
|
||||||
|
@ -742,7 +748,7 @@ class User
|
||||||
If you ever want to delete your account, you can do so at %3$s/removeme
|
If you ever want to delete your account, you can do so at %3$s/removeme
|
||||||
|
|
||||||
Thank you and welcome to %2$s.',
|
Thank you and welcome to %2$s.',
|
||||||
$body, $user['email'], $sitename, $siteurl, $user['username'], $password
|
$user['email'], $sitename, $siteurl, $user['username'], $password
|
||||||
));
|
));
|
||||||
|
|
||||||
return notification([
|
return notification([
|
||||||
|
|
39
src/Module/Itemsource.php
Normal file
39
src/Module/Itemsource.php
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Friendica\Module;
|
||||||
|
|
||||||
|
use Friendica\Core\L10n;
|
||||||
|
use Friendica\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Hypolite Petovan <mrpetovan@gmail.com>
|
||||||
|
*/
|
||||||
|
class Itemsource extends \Friendica\BaseModule
|
||||||
|
{
|
||||||
|
public static function content()
|
||||||
|
{
|
||||||
|
if (!is_site_admin()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$source = '';
|
||||||
|
$item_uri = '';
|
||||||
|
if (!empty($_REQUEST['guid'])) {
|
||||||
|
$item = Model\Item::selectFirst([], ['guid' => $_REQUEST['guid']]);
|
||||||
|
|
||||||
|
$conversation = Model\Conversation::getByItemUri($item['uri']);
|
||||||
|
|
||||||
|
$item_uri = $item['uri'];
|
||||||
|
$source = htmlspecialchars($conversation['source']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template('debug/itemsource.tpl');
|
||||||
|
$o = replace_macros($tpl, [
|
||||||
|
'$guid' => ['guid', L10n::t('Item Guid'), htmlentities(defaults($_REQUEST, 'guid', '')), ''],
|
||||||
|
'$source' => $source,
|
||||||
|
'$item_uri' => $item_uri
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ namespace Friendica\Module;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Friendica\BaseModule;
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
|
use Friendica\Core\Authentication;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
@ -16,7 +17,6 @@ use Friendica\Util\Network;
|
||||||
use LightOpenID;
|
use LightOpenID;
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
require_once 'include/text.php';
|
require_once 'include/text.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -148,13 +148,13 @@ class Login extends BaseModule
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$remember) {
|
if (!$remember) {
|
||||||
new_cookie(0); // 0 means delete on browser exit
|
Authentication::setCookie(0); // 0 means delete on browser exit
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we haven't failed up this point, log them in.
|
// if we haven't failed up this point, log them in.
|
||||||
$_SESSION['remember'] = $remember;
|
$_SESSION['remember'] = $remember;
|
||||||
$_SESSION['last_login_date'] = DateTimeFormat::utcNow();
|
$_SESSION['last_login_date'] = DateTimeFormat::utcNow();
|
||||||
authenticate_success($record, true, true);
|
Authentication::setAuthenticatedSessionForUser($record, true, true);
|
||||||
|
|
||||||
if (x($_SESSION, 'return_url')) {
|
if (x($_SESSION, 'return_url')) {
|
||||||
$return_url = $_SESSION['return_url'];
|
$return_url = $_SESSION['return_url'];
|
||||||
|
@ -188,9 +188,9 @@ class Login extends BaseModule
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
if (DBA::isResult($user)) {
|
if (DBA::isResult($user)) {
|
||||||
if ($data->hash != cookie_hash($user)) {
|
if ($data->hash != Authentication::getCookieHashForUser($user)) {
|
||||||
logger("Hash for user " . $data->uid . " doesn't fit.");
|
logger("Hash for user " . $data->uid . " doesn't fit.");
|
||||||
nuke_session();
|
Authentication::deleteSession();
|
||||||
goaway(self::getApp()->getBaseURL());
|
goaway(self::getApp()->getBaseURL());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,11 +198,11 @@ class Login extends BaseModule
|
||||||
// Expires after 7 days by default,
|
// Expires after 7 days by default,
|
||||||
// can be set via system.auth_cookie_lifetime
|
// can be set via system.auth_cookie_lifetime
|
||||||
$authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7);
|
$authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7);
|
||||||
new_cookie($authcookiedays * 24 * 60 * 60, $user);
|
Authentication::setCookie($authcookiedays * 24 * 60 * 60, $user);
|
||||||
|
|
||||||
// Do the authentification if not done by now
|
// Do the authentification if not done by now
|
||||||
if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) {
|
if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) {
|
||||||
authenticate_success($user);
|
Authentication::setAuthenticatedSessionForUser($user);
|
||||||
|
|
||||||
if (Config::get('system', 'paranoia')) {
|
if (Config::get('system', 'paranoia')) {
|
||||||
$_SESSION['addr'] = $data->ip;
|
$_SESSION['addr'] = $data->ip;
|
||||||
|
@ -227,7 +227,7 @@ class Login extends BaseModule
|
||||||
if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {
|
if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {
|
||||||
logger('Session address changed. Paranoid setting in effect, blocking session. ' .
|
logger('Session address changed. Paranoid setting in effect, blocking session. ' .
|
||||||
$_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
|
$_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
|
||||||
nuke_session();
|
Authentication::deleteSession();
|
||||||
goaway(self::getApp()->getBaseURL());
|
goaway(self::getApp()->getBaseURL());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ class Login extends BaseModule
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
if (!DBA::isResult($user)) {
|
if (!DBA::isResult($user)) {
|
||||||
nuke_session();
|
Authentication::deleteSession();
|
||||||
goaway(self::getApp()->getBaseURL());
|
goaway(self::getApp()->getBaseURL());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ class Login extends BaseModule
|
||||||
$_SESSION['last_login_date'] = DateTimeFormat::utcNow();
|
$_SESSION['last_login_date'] = DateTimeFormat::utcNow();
|
||||||
$login_refresh = true;
|
$login_refresh = true;
|
||||||
}
|
}
|
||||||
authenticate_success($user, false, false, $login_refresh);
|
Authentication::setAuthenticatedSessionForUser($user, false, false, $login_refresh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,10 @@ namespace Friendica\Module;
|
||||||
|
|
||||||
use Friendica\BaseModule;
|
use Friendica\BaseModule;
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
|
use Friendica\Core\Authentication;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logout module
|
* Logout module
|
||||||
|
@ -24,7 +24,7 @@ class Logout extends BaseModule
|
||||||
public static function init()
|
public static function init()
|
||||||
{
|
{
|
||||||
Addon::callHooks("logging_out");
|
Addon::callHooks("logging_out");
|
||||||
nuke_session();
|
Authentication::deleteSession();
|
||||||
info(L10n::t('Logged out.') . EOL);
|
info(L10n::t('Logged out.') . EOL);
|
||||||
goaway(self::getApp()->getBaseURL());
|
goaway(self::getApp()->getBaseURL());
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,6 @@ use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
use Friendica\Util\Proxy as ProxyUtils;
|
use Friendica\Util\Proxy as ProxyUtils;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Module Proxy
|
* @brief Module Proxy
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -7,6 +7,7 @@ namespace Friendica\Object;
|
||||||
use Friendica\BaseObject;
|
use Friendica\BaseObject;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Object\Post;
|
use Friendica\Object\Post;
|
||||||
|
use Friendica\Util\Security;
|
||||||
|
|
||||||
require_once 'boot.php';
|
require_once 'boot.php';
|
||||||
require_once 'include/text.php';
|
require_once 'include/text.php';
|
||||||
|
@ -61,11 +62,11 @@ class Thread extends BaseObject
|
||||||
break;
|
break;
|
||||||
case 'profile':
|
case 'profile':
|
||||||
$this->profile_owner = $a->profile['profile_uid'];
|
$this->profile_owner = $a->profile['profile_uid'];
|
||||||
$this->writable = can_write_wall($this->profile_owner);
|
$this->writable = Security::canWriteToUserWall($this->profile_owner);
|
||||||
break;
|
break;
|
||||||
case 'display':
|
case 'display':
|
||||||
$this->profile_owner = $a->profile['uid'];
|
$this->profile_owner = $a->profile['uid'];
|
||||||
$this->writable = can_write_wall($this->profile_owner) || $writable;
|
$this->writable = Security::canWriteToUserWall($this->profile_owner) || $writable;
|
||||||
break;
|
break;
|
||||||
case 'community':
|
case 'community':
|
||||||
$this->profile_owner = 0;
|
$this->profile_owner = 0;
|
||||||
|
|
|
@ -743,6 +743,26 @@ class Transmitter
|
||||||
return $attachments;
|
return $attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback function to replace a Friendica style mention in a mention that is used on AP
|
||||||
|
*
|
||||||
|
* @param array $match Matching values for the callback
|
||||||
|
* @return string Replaced mention
|
||||||
|
*/
|
||||||
|
private static function mentionCallback($match)
|
||||||
|
{
|
||||||
|
if (empty($match[1])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = Contact::getDetailsByURL($match[1]);
|
||||||
|
if (empty($data) || empty($data['nick'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '@[url=' . $data['url'] . ']' . $data['nick'] . '[/url]';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove image elements and replaces them with links to the image
|
* Remove image elements and replaces them with links to the image
|
||||||
*
|
*
|
||||||
|
@ -851,6 +871,9 @@ class Transmitter
|
||||||
$body = self::removePictures($body);
|
$body = self::removePictures($body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
|
||||||
|
$body = preg_replace_callback($regexp, ['self', 'mentionCallback'], $body);
|
||||||
|
|
||||||
$data['content'] = BBCode::convert($body, false, 7);
|
$data['content'] = BBCode::convert($body, false, 7);
|
||||||
$data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"];
|
$data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"];
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,6 @@ class DFRN
|
||||||
}
|
}
|
||||||
|
|
||||||
$contact = $r[0];
|
$contact = $r[0];
|
||||||
include_once 'include/security.php';
|
|
||||||
|
|
||||||
$set = PermissionSet::get($owner_id, $contact['id']);
|
$set = PermissionSet::get($owner_id, $contact['id']);
|
||||||
|
|
||||||
|
|
|
@ -1200,7 +1200,7 @@ class Diaspora
|
||||||
);
|
);
|
||||||
|
|
||||||
preg_replace_callback(
|
preg_replace_callback(
|
||||||
"&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
|
"&\[url=/?posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
|
||||||
function ($match) use ($item) {
|
function ($match) use ($item) {
|
||||||
self::fetchGuidSub($match, $item);
|
self::fetchGuidSub($match, $item);
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,8 +7,6 @@ use Friendica\BaseObject;
|
||||||
use Friendica\Core\Config;
|
use Friendica\Core\Config;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
|
|
||||||
require_once 'include/security.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Proxy utilities class
|
* @brief Proxy utilities class
|
||||||
*/
|
*/
|
||||||
|
|
155
src/Util/Security.php
Normal file
155
src/Util/Security.php
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file /src/Util/Security.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Friendica\Util;
|
||||||
|
|
||||||
|
use Friendica\BaseObject;
|
||||||
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Model\Contact;
|
||||||
|
use Friendica\Model\Group;
|
||||||
|
use Friendica\Core\L10n;
|
||||||
|
use Friendica\Model\PermissionSet;
|
||||||
|
use Friendica\Core\System;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Secures that User is allow to do requests
|
||||||
|
*/
|
||||||
|
class Security extends BaseObject
|
||||||
|
{
|
||||||
|
public static function canWriteToUserWall($owner)
|
||||||
|
{
|
||||||
|
static $verified = 0;
|
||||||
|
|
||||||
|
if (!local_user() && !remote_user()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$uid = local_user();
|
||||||
|
if ($uid == $owner) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local_user() && ($owner == 0)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remote_user()) {
|
||||||
|
// use remembered decision and avoid a DB lookup for each and every display item
|
||||||
|
// DO NOT use this function if there are going to be multiple owners
|
||||||
|
// We have a contact-id for an authenticated remote user, this block determines if the contact
|
||||||
|
// belongs to this page owner, and has the necessary permissions to post content
|
||||||
|
|
||||||
|
if ($verified === 2) {
|
||||||
|
return true;
|
||||||
|
} elseif ($verified === 1) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
$cid = 0;
|
||||||
|
|
||||||
|
if (!empty($_SESSION['remote'])) {
|
||||||
|
foreach ($_SESSION['remote'] as $visitor) {
|
||||||
|
if ($visitor['uid'] == $owner) {
|
||||||
|
$cid = $visitor['cid'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$cid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = q("SELECT `contact`.*, `user`.`page-flags` FROM `contact` INNER JOIN `user` on `user`.`uid` = `contact`.`uid`
|
||||||
|
WHERE `contact`.`uid` = %d AND `contact`.`id` = %d AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
|
||||||
|
AND `user`.`blockwall` = 0 AND `readonly` = 0 AND ( `contact`.`rel` IN ( %d , %d ) OR `user`.`page-flags` = %d ) LIMIT 1",
|
||||||
|
intval($owner),
|
||||||
|
intval($cid),
|
||||||
|
intval(Contact::SHARING),
|
||||||
|
intval(Contact::FRIEND),
|
||||||
|
intval(Contact::PAGE_COMMUNITY)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (DBA::isResult($r)) {
|
||||||
|
$verified = 2;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$verified = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @TODO $groups should be array
|
||||||
|
public static function getPermissionsSQLByUserId($owner_id, $remote_verified = false, $groups = null)
|
||||||
|
{
|
||||||
|
$local_user = local_user();
|
||||||
|
$remote_user = remote_user();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construct permissions
|
||||||
|
*
|
||||||
|
* default permissions - anonymous user
|
||||||
|
*/
|
||||||
|
$sql = " AND allow_cid = ''
|
||||||
|
AND allow_gid = ''
|
||||||
|
AND deny_cid = ''
|
||||||
|
AND deny_gid = ''
|
||||||
|
";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Profile owner - everything is visible
|
||||||
|
*/
|
||||||
|
if ($local_user && $local_user == $owner_id) {
|
||||||
|
$sql = '';
|
||||||
|
/*
|
||||||
|
* Authenticated visitor. Unless pre-verified,
|
||||||
|
* check that the contact belongs to this $owner_id
|
||||||
|
* and load the groups the visitor belongs to.
|
||||||
|
* If pre-verified, the caller is expected to have already
|
||||||
|
* done this and passed the groups into this function.
|
||||||
|
*/
|
||||||
|
} elseif ($remote_user) {
|
||||||
|
/*
|
||||||
|
* Authenticated visitor. Unless pre-verified,
|
||||||
|
* check that the contact belongs to this $owner_id
|
||||||
|
* and load the groups the visitor belongs to.
|
||||||
|
* If pre-verified, the caller is expected to have already
|
||||||
|
* done this and passed the groups into this function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!$remote_verified) {
|
||||||
|
if (DBA::exists('contact', ['id' => $remote_user, 'uid' => $owner_id, 'blocked' => false])) {
|
||||||
|
$remote_verified = true;
|
||||||
|
$groups = Group::getIdsByContactId($remote_user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($remote_verified) {
|
||||||
|
$gs = '<<>>'; // should be impossible to match
|
||||||
|
|
||||||
|
if (is_array($groups)) {
|
||||||
|
foreach ($groups as $g) {
|
||||||
|
$gs .= '|<' . intval($g) . '>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = sprintf(
|
||||||
|
" AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
|
||||||
|
AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
|
||||||
|
)
|
||||||
|
",
|
||||||
|
intval($remote_user),
|
||||||
|
DBA::escape($gs),
|
||||||
|
intval($remote_user),
|
||||||
|
DBA::escape($gs)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
28
view/templates/debug/itemsource.tpl
Normal file
28
view/templates/debug/itemsource.tpl
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<h2>Item Source</h2>
|
||||||
|
<form action="itemsource" method="get" class="panel panel-default">
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="form-group">
|
||||||
|
{{include file="field_input.tpl" field=$guid}}
|
||||||
|
</div>
|
||||||
|
<p><button type="submit" class="btn btn-primary">Submit</button></p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{{if $source}}
|
||||||
|
<div class="itemsource-results">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">Item URI</h3>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{{$item_uri}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">Source</h3>
|
||||||
|
</div>
|
||||||
|
<pre><code class="language-php">{{$source}}</code></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
|
@ -1489,6 +1489,9 @@ section #jotOpen {
|
||||||
.fbrowser.image .photo-album-image-wrapper {
|
.fbrowser.image .photo-album-image-wrapper {
|
||||||
box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.2);
|
box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
|
.fbrowser.image .photo-album-image-wrapper .caption {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
.fbrowser .profile-rotator-wrapper {
|
.fbrowser .profile-rotator-wrapper {
|
||||||
min-height: 200px;
|
min-height: 200px;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue