From 4395c2067941f9052eb2ccf009eed0adb8e05cf9 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 3 Dec 2017 22:15:31 -0500 Subject: [PATCH 1/9] Fix formatting and add documentation - mod/register - mod/regmod - Model/User - Worker/CronJobs --- mod/register.php | 4 +-- mod/regmod.php | 43 +++++++++++++++----------------- src/Model/User.php | 13 ++++++++++ src/Worker/CronJobs.php | 54 ++++++++++++++++++++++------------------- 4 files changed, 63 insertions(+), 51 deletions(-) diff --git a/mod/register.php b/mod/register.php index cd6385144..8645ecb9c 100644 --- a/mod/register.php +++ b/mod/register.php @@ -6,9 +6,9 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Core\Worker; -require_once('include/enotify.php'); -require_once('include/bbcode.php'); require_once('include/user.php'); +require_once 'include/enotify.php'; +require_once 'include/bbcode.php'; if(! function_exists('register_post')) { function register_post(App $a) { diff --git a/mod/regmod.php b/mod/regmod.php index 6d76e7ea7..7fce6914f 100644 --- a/mod/regmod.php +++ b/mod/regmod.php @@ -6,11 +6,12 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; -require_once('include/enotify.php'); require_once('include/user.php'); -function user_allow($hash) { +require_once 'include/enotify.php'; +function user_allow($hash) +{ $a = get_app(); $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1", @@ -18,7 +19,7 @@ function user_allow($hash) { ); - if (! DBM::is_result($register)) { + if (!DBM::is_result($register)) { return false; } @@ -26,7 +27,7 @@ function user_allow($hash) { intval($register[0]['uid']) ); - if (! DBM::is_result($user)) { + if (!DBM::is_result($user)) { killme(); } @@ -44,7 +45,7 @@ function user_allow($hash) { ); if (DBM::is_result($r) && $r[0]['net-publish']) { $url = System::baseUrl() . '/profile/' . $user[0]['nickname']; - if ($url && strlen(Config::get('system','directory'))) { + if ($url && strlen(Config::get('system', 'directory'))) { Worker::add(PRIORITY_LOW, "Directory", $url); } } @@ -60,20 +61,17 @@ function user_allow($hash) { pop_lang(); - if($res) { - info( t('Account approved.') . EOL ); + if ($res) { + info(t('Account approved.') . EOL); return true; } - } - // This does not have to go through user_remove() and save the nickname // permanently against re-registration, as the person was not yet // allowed to have friends on this system - -function user_deny($hash) { - +function user_deny($hash) +{ $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1", dbesc($hash) ); @@ -91,23 +89,22 @@ function user_deny($hash) { notice(sprintf(t('Registration revoked for %s'), $user[0]['username']) . EOL); return true; - } -function regmod_content(App $a) { - +function regmod_content(App $a) +{ global $lang; $_SESSION['return_url'] = $a->cmd; - if (! local_user()) { - info( t('Please login.') . EOL); + if (!local_user()) { + info(t('Please login.') . EOL); $o .= '

' . login(($a->config['register_policy'] == REGISTER_CLOSED) ? 0 : 1); return $o; } - if ((!is_site_admin()) || (x($_SESSION,'submanage') && intval($_SESSION['submanage']))) { - notice( t('Permission denied.') . EOL); + if ((!is_site_admin()) || (x($_SESSION, 'submanage') && intval($_SESSION['submanage']))) { + notice(t('Permission denied.') . EOL); return ''; } @@ -115,20 +112,18 @@ function regmod_content(App $a) { killme(); } - $cmd = $a->argv[1]; + $cmd = $a->argv[1]; $hash = $a->argv[2]; - - if ($cmd === 'deny') { user_deny($hash); - goaway(System::baseUrl()."/admin/users/"); + goaway(System::baseUrl() . "/admin/users/"); killme(); } if ($cmd === 'allow') { user_allow($hash); - goaway(System::baseUrl()."/admin/users/"); + goaway(System::baseUrl() . "/admin/users/"); killme(); } } diff --git a/src/Model/User.php b/src/Model/User.php index b2beb8e19..398cd19b4 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -20,6 +20,19 @@ require_once 'include/plugin.php'; */ class User { + /** + * @brief Authenticate a user with a clear text password + * + * User info can be any of the following: + * - User DB object + * - User Id + * - User email or username or nickname + * - User array with at least the uid and the hashed password + * + * @param mixed $user_info + * @param string $password + * @return boolean + */ public static function authenticate($user_info, $password) { if (is_object($user_info)) { diff --git a/src/Worker/CronJobs.php b/src/Worker/CronJobs.php index cbfa86ed8..a59cd4f9f 100644 --- a/src/Worker/CronJobs.php +++ b/src/Worker/CronJobs.php @@ -1,4 +1,5 @@ '%s' @@ -120,9 +124,9 @@ class CronJobs { * * @param App $a */ - private static function clearCache(App $a) { - - $last = Config::get('system','cache_last_cleared'); + private static function clearCache(App $a) + { + $last = Config::get('system', 'cache_last_cleared'); if ($last) { $next = $last + (3600); // Once per hour @@ -142,16 +146,16 @@ class CronJobs { clear_cache(); // clear cache for photos - clear_cache($a->get_basepath(), $a->get_basepath()."/photo"); + clear_cache($a->get_basepath(), $a->get_basepath() . "/photo"); // clear smarty cache - clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled"); + clear_cache($a->get_basepath() . "/view/smarty3/compiled", $a->get_basepath() . "/view/smarty3/compiled"); // clear cache for image proxy if (!Config::get("system", "proxy_disabled")) { - clear_cache($a->get_basepath(), $a->get_basepath()."/proxy"); + clear_cache($a->get_basepath(), $a->get_basepath() . "/proxy"); - $cachetime = Config::get('system','proxy_cache_time'); + $cachetime = Config::get('system', 'proxy_cache_time'); if (!$cachetime) { $cachetime = PROXY_DEFAULT_TIME; } @@ -166,13 +170,13 @@ class CronJobs { dba::delete('parsed_url', array("`created` < NOW() - INTERVAL 3 MONTH")); // Maximum table size in megabyte - $max_tablesize = intval(Config::get('system','optimize_max_tablesize')) * 1000000; + $max_tablesize = intval(Config::get('system', 'optimize_max_tablesize')) * 1000000; if ($max_tablesize == 0) { $max_tablesize = 100 * 1000000; // Default are 100 MB } if ($max_tablesize > 0) { // Minimum fragmentation level in percent - $fragmentation_level = intval(Config::get('system','optimize_fragmentation')) / 100; + $fragmentation_level = intval(Config::get('system', 'optimize_fragmentation')) / 100; if ($fragmentation_level == 0) { $fragmentation_level = 0.3; // Default value is 30% } @@ -194,7 +198,7 @@ class CronJobs { // Calculate fragmentation $fragmentation = $table["Data_free"] / ($table["Data_length"] + $table["Index_length"]); - logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG); + logger("Table " . $table["Name"] . " - Fragmentation level: " . round($fragmentation * 100, 2), LOGGER_DEBUG); // Don't optimize tables that needn't to be optimized if ($fragmentation < $fragmentation_level) { @@ -202,12 +206,12 @@ class CronJobs { } // So optimize it - logger("Optimize Table ".$table["Name"], LOGGER_DEBUG); + logger("Optimize Table " . $table["Name"], LOGGER_DEBUG); q("OPTIMIZE TABLE `%s`", dbesc($table["Name"])); } } - Config::set('system','cache_last_cleared', time()); + Config::set('system', 'cache_last_cleared', time()); } /** @@ -215,8 +219,8 @@ class CronJobs { * * @param App $a */ - private static function repairDiaspora(App $a) { - + private static function repairDiaspora(App $a) + { $starttime = time(); $r = q("SELECT `id`, `url` FROM `contact` @@ -241,7 +245,7 @@ class CronJobs { continue; } - logger("Repair contact ".$contact["id"]." ".$contact["url"], LOGGER_DEBUG); + logger("Repair contact " . $contact["id"] . " " . $contact["url"], LOGGER_DEBUG); q("UPDATE `contact` SET `batch` = '%s', `notify` = '%s', `poll` = '%s', pubkey = '%s' WHERE `id` = %d", dbesc($data["batch"]), dbesc($data["notify"]), dbesc($data["poll"]), dbesc($data["pubkey"]), intval($contact["id"])); @@ -252,15 +256,15 @@ class CronJobs { * @brief Do some repairs in database entries * */ - private static function repairDatabase() { - + private static function repairDatabase() + { // Sometimes there seem to be issues where the "self" contact vanishes. // We haven't found the origin of the problem by now. $r = q("SELECT `uid` FROM `user` WHERE NOT EXISTS (SELECT `uid` FROM `contact` WHERE `contact`.`uid` = `user`.`uid` AND `contact`.`self`)"); if (DBM::is_result($r)) { foreach ($r AS $user) { - logger('Create missing self contact for user '.$user['uid']); user_create_self_contact($user['uid']); + logger('Create missing self contact for user ' . $user['uid']); } } From b0dcfc2724188c309a70ce5281e94fdf6a733498 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 3 Dec 2017 22:27:49 -0500 Subject: [PATCH 2/9] Add class methods derived from include/user functions - Add User::create - Add User::sendRegisterPendingEmail - Add User::sendRegisterOpenEmail - Add Contact::createSelfFromUserId --- src/Model/User.php | 429 ++++++++++++++++++++++++++++++++++++++++- src/Object/Contact.php | 46 +++++ 2 files changed, 474 insertions(+), 1 deletion(-) diff --git a/src/Model/User.php b/src/Model/User.php index 398cd19b4..72e3aea93 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -7,14 +7,23 @@ namespace Friendica\Model; +use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; +use Friendica\Object\Contact; +use Friendica\Object\Photo; use dba; require_once 'boot.php'; +require_once 'include/crypto.php'; +require_once 'include/enotify.php'; +require_once 'include/group.php'; +require_once 'include/network.php'; +require_once 'library/openid.php'; +require_once 'include/pgettext.php'; require_once 'include/plugin.php'; - +require_once 'include/text.php'; /** * @brief This class handles User related functions */ @@ -79,6 +88,424 @@ class User return $user['uid']; } + /** + * @brief Catch-all user creation function + * + * Creates a user from the provided data array, either form fields or OpenID. + * Required: { username, nickname, email } or { openid_url } + * + * Performs the following: + * - Sends to the OpenId auth URL (if relevant) + * - Creates new key pairs for crypto + * - Create self-contact + * - Create profile image + * + * @param array $data + * @return string + */ + public static function create(array $data) + { + $a = get_app(); + $result = array('success' => false, 'user' => null, 'password' => '', 'message' => ''); + + $using_invites = Config::get('system', 'invitation_only'); + $num_invites = Config::get('system', 'number_invites'); + + $invite_id = x($data, 'invite_id') ? notags(trim($data['invite_id'])) : ''; + $username = x($data, 'username') ? notags(trim($data['username'])) : ''; + $nickname = x($data, 'nickname') ? notags(trim($data['nickname'])) : ''; + $email = x($data, 'email') ? notags(trim($data['email'])) : ''; + $openid_url = x($data, 'openid_url') ? notags(trim($data['openid_url'])) : ''; + $photo = x($data, 'photo') ? notags(trim($data['photo'])) : ''; + $password = x($data, 'password') ? trim($data['password']) : ''; + $password1 = x($data, 'password1') ? trim($data['password1']) : ''; + $confirm = x($data, 'confirm') ? trim($data['confirm']) : ''; + $blocked = x($data, 'blocked') ? intval($data['blocked']) : 0; + $verified = x($data, 'verified') ? intval($data['verified']) : 0; + + $publish = x($data, 'profile_publish_reg') && intval($data['profile_publish_reg']) ? 1 : 0; + $netpublish = strlen(Config::get('system', 'directory')) ? $publish : 0; + + if ($password1 != $confirm) { + $result['message'] .= t('Passwords do not match. Password unchanged.') . EOL; + return $result; + } elseif ($password1 != "") { + $password = $password1; + } + + $tmp_str = $openid_url; + + if ($using_invites) { + if (!$invite_id) { + $result['message'] .= t('An invitation is required.') . EOL; + return $result; + } + $r = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1", dbesc($invite_id)); + if (!results($r)) { + $result['message'] .= t('Invitation could not be verified.') . EOL; + return $result; + } + } + + if (!x($username) || !x($email) || !x($nickname)) { + if ($openid_url) { + if (!validate_url($tmp_str)) { + $result['message'] .= t('Invalid OpenID url') . EOL; + return $result; + } + $_SESSION['register'] = 1; + $_SESSION['openid'] = $openid_url; + + $openid = new LightOpenID; + $openid->identity = $openid_url; + $openid->returnUrl = System::baseUrl() . '/openid'; + $openid->required = array('namePerson/friendly', 'contact/email', 'namePerson'); + $openid->optional = array('namePerson/first', 'media/image/aspect11', 'media/image/default'); + try { + $authurl = $openid->authUrl(); + } catch (Exception $e) { + $result['message'] .= t("We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.") . EOL . EOL . t("The error message was:") . $e->getMessage() . EOL; + return $result; + } + goaway($authurl); + // NOTREACHED + } + + notice(t('Please enter the required information.') . EOL); + return; + } + + if (!validate_url($tmp_str)) { + $openid_url = ''; + } + + $err = ''; + + // collapse multiple spaces in name + $username = preg_replace('/ +/', ' ', $username); + + if (mb_strlen($username) > 48) { + $result['message'] .= t('Please use a shorter name.') . EOL; + } + if (mb_strlen($username) < 3) { + $result['message'] .= t('Name too short.') . EOL; + } + + // So now we are just looking for a space in the full name. + + $loose_reg = Config::get('system', 'no_regfullname'); + if (!$loose_reg) { + $username = mb_convert_case($username, MB_CASE_TITLE, 'UTF-8'); + if (!strpos($username, ' ')) { + $result['message'] .= t("That doesn't appear to be your full \x28First Last\x29 name.") . EOL; + } + } + + + if (!allowed_email($email)) { + $result['message'] .= t('Your email domain is not among those allowed on this site.') . EOL; + } + + if (!valid_email($email) || !validate_email($email)) { + $result['message'] .= t('Not a valid email address.') . EOL; + } + + // Disallow somebody creating an account using openid that uses the admin email address, + // since openid bypasses email verification. We'll allow it if there is not yet an admin account. + + $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email']))); + + //if((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0) && strlen($openid_url)) { + if (x($a->config, 'admin_email') && in_array(strtolower($email), $adminlist) && strlen($openid_url)) { + $r = q("SELECT * FROM `user` WHERE `email` = '%s' LIMIT 1", + dbesc($email) + ); + if (DBM::is_result($r)) { + $result['message'] .= t('Cannot use that email.') . EOL; + } + } + + $nickname = $data['nickname'] = strtolower($nickname); + + if (!preg_match("/^[a-z0-9][a-z0-9\_]*$/", $nickname)) { + $result['message'] .= t('Your "nickname" can only contain "a-z", "0-9" and "_".') . EOL; + } + + $r = q("SELECT `uid` FROM `user` + WHERE `nickname` = '%s' LIMIT 1", + dbesc($nickname) + ); + if (DBM::is_result($r)) { + $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL; + } + + // Check deleted accounts that had this nickname. Doesn't matter to us, + // but could be a security issue for federated platforms. + + $r = q("SELECT * FROM `userd` + WHERE `username` = '%s' LIMIT 1", + dbesc($nickname) + ); + if (DBM::is_result($r)) { + $result['message'] .= t('Nickname was once registered here and may not be re-used. Please choose another.') . EOL; + } + + if (strlen($result['message'])) { + return $result; + } + + $new_password = strlen($password) ? $password : autoname(6) . mt_rand(100, 9999); + $new_password_encoded = hash('whirlpool', $new_password); + + $result['password'] = $new_password; + + $keys = new_keypair(4096); + + if ($keys === false) { + $result['message'] .= t('SERIOUS ERROR: Generation of security keys failed.') . EOL; + return $result; + } + + $prvkey = $keys['prvkey']; + $pubkey = $keys['pubkey']; + + // Create another keypair for signing/verifying salmon protocol messages. + $sres = new_keypair(512); + $sprvkey = $sres['prvkey']; + $spubkey = $sres['pubkey']; + + $r = q("INSERT INTO `user` (`guid`, `username`, `password`, `email`, `openid`, `nickname`, + `pubkey`, `prvkey`, `spubkey`, `sprvkey`, `register_date`, `verified`, `blocked`, `timezone`, `default-location`) + VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 'UTC', '')", + dbesc(generate_user_guid()), + dbesc($username), + dbesc($new_password_encoded), + dbesc($email), + dbesc($openid_url), + dbesc($nickname), + dbesc($pubkey), + dbesc($prvkey), + dbesc($spubkey), + dbesc($sprvkey), + dbesc(datetime_convert()), + intval($verified), + intval($blocked) + ); + + if ($r) { + $r = q("SELECT * FROM `user` + WHERE `username` = '%s' AND `password` = '%s' LIMIT 1", + dbesc($username), + dbesc($new_password_encoded) + ); + if (DBM::is_result($r)) { + $u = $r[0]; + $newuid = intval($r[0]['uid']); + } + } else { + $result['message'] .= t('An error occurred during registration. Please try again.') . EOL; + return $result; + } + + /** + * if somebody clicked submit twice very quickly, they could end up with two accounts + * due to race condition. Remove this one. + */ + $r = q("SELECT `uid` FROM `user` + WHERE `nickname` = '%s' ", + dbesc($nickname) + ); + if (DBM::is_result($r) && count($r) > 1 && $newuid) { + $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL; + dba::delete('user', array('uid' => $newuid)); + return $result; + } + + if (x($newuid) !== false) { + $r = q("INSERT INTO `profile` ( `uid`, `profile-name`, `is-default`, `name`, `photo`, `thumb`, `publish`, `net-publish` ) + VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, %d ) ", + intval($newuid), + t('default'), + 1, + dbesc($username), + dbesc(System::baseUrl() . "/photo/profile/{$newuid}.jpg"), + dbesc(System::baseUrl() . "/photo/avatar/{$newuid}.jpg"), + intval($publish), + intval($netpublish) + ); + if ($r === false) { + $result['message'] .= t('An error occurred creating your default profile. Please try again.') . EOL; + // Start fresh next time. + dba::delete('user', array('uid' => $newuid)); + return $result; + } + + // Create the self contact + Contact::createSelfFromUserId($newuid); + + // Create a group with no members. This allows somebody to use it + // right away as a default group for new contacts. + + group_add($newuid, t('Friends')); + + $r = q("SELECT `id` FROM `group` WHERE `uid` = %d AND `name` = '%s'", + intval($newuid), + dbesc(t('Friends')) + ); + if (DBM::is_result($r)) { + $def_gid = $r[0]['id']; + + q("UPDATE `user` SET `def_gid` = %d WHERE `uid` = %d", + intval($r[0]['id']), + intval($newuid) + ); + } + + if (Config::get('system', 'newuser_private') && $def_gid) { + q("UPDATE `user` SET `allow_gid` = '%s' WHERE `uid` = %d", + dbesc("<" . $def_gid . ">"), + intval($newuid) + ); + } + } + + // if we have no OpenID photo try to look up an avatar + if (!strlen($photo)) { + $photo = avatar_img($email); + } + + // unless there is no avatar-plugin loaded + if (strlen($photo)) { + $photo_failure = false; + + $filename = basename($photo); + $img_str = fetch_url($photo, true); + // guess mimetype from headers or filename + $type = Photo::guessImageType($photo, true); + + + $img = new Photo($img_str, $type); + if ($img->isValid()) { + $img->scaleImageSquare(175); + + $hash = photo_new_resource(); + + $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 4); + + if ($r === false) { + $photo_failure = true; + } + + $img->scaleImage(80); + + $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 5); + + if ($r === false) { + $photo_failure = true; + } + + $img->scaleImage(48); + + $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 6); + + if ($r === false) { + $photo_failure = true; + } + + if (!$photo_failure) { + q("UPDATE `photo` SET `profile` = 1 WHERE `resource-id` = '%s' ", + dbesc($hash) + ); + } + } + } + + call_hooks('register_account', $newuid); + + $result['success'] = true; + $result['user'] = $u; + return $result; + } + + /** + * @brief Sends pending registration confiƕmation email + * + * @param string $email + * @param string $sitename + * @param string $username + * @return NULL|boolean from notification() and email() inherited + */ + public static function sendRegisterPendingEmail($email, $sitename, $username) + { + $body = deindent(t(' + Dear %1$s, + Thank you for registering at %2$s. Your account is pending for approval by the administrator. + ')); + + $body = sprintf($body, $username, $sitename); + + return notification(array( + 'type' => SYSTEM_EMAIL, + 'to_email' => $email, + 'subject'=> sprintf( t('Registration at %s'), $sitename), + 'body' => $body)); + } + + /** + * @brief Sends registration confirmation + * + * It's here as a function because the mail is sent from different parts + * + * @param string $email + * @param string $sitename + * @param string $siteurl + * @param string $username + * @param string $password + * @return NULL|boolean from notification() and email() inherited + */ + public static function sendRegisterOpenEmail($email, $sitename, $siteurl, $username, $password) + { + $preamble = deindent(t(' + Dear %1$s, + Thank you for registering at %2$s. Your account has been created. + ')); + $body = deindent(t(' + The login details are as follows: + Site Location: %3$s + Login Name: %1$s + Password: %5$s + + You may change your password from your account "Settings" page after logging + in. + + Please take a few moments to review the other account settings on that page. + + You may also wish to add some basic information to your default profile + (on the "Profiles" page) so that other people can easily find you. + + We recommend setting your full name, adding a profile photo, + adding some profile "keywords" (very useful in making new friends) - and + perhaps what country you live in; if you do not wish to be more specific + than that. + + We fully respect your right to privacy, and none of these items are necessary. + If you are new and do not know anybody here, they may help + you to make some new and interesting friends. + + + Thank you and welcome to %2$s.')); + + $preamble = sprintf($preamble, $username, $sitename); + $body = sprintf($body, $email, $sitename, $siteurl, $username, $password); + + return notification(array( + 'type' => SYSTEM_EMAIL, + 'to_email' => $email, + 'subject'=> sprintf( t('Registration details for %s'), $sitename), + 'preamble'=> $preamble, + 'body' => $body)); + } + /** * @param object $uid user to remove * @return void diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 34519401c..fc1b26aba 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -28,6 +28,52 @@ require_once 'include/text.php'; */ class Contact extends BaseObject { + /** + * Creates the self-contact for the provided user id + * + * @param int $uid + * @return bool Operation success + */ + public static function createSelfFromUserId($uid) + { + // Only create the entry if it doesn't exist yet + if (dba::exists('contact', ['uid' => intval($uid), 'self'])) { + return true; + } + + $user = dba::select('user', ['uid', 'username', 'nickname'], ['uid' => intval($uid)], ['limit' => 1]); + if (!DBM::is_result($user)) { + return false; + } + + $return = dba::insert('contact', [ + 'uid' => $user['uid'], + 'created' => datetime_convert(), + 'self' => 1, + 'name' => $user['username'], + 'nick' => $user['nickname'], + 'photo' => System::baseUrl() . '/photo/profile/' . $user['uid'] . '.jpg', + 'thumb' => System::baseUrl() . '/photo/avatar/' . $user['uid'] . '.jpg', + 'micro' => System::baseUrl() . '/photo/micro/' . $user['uid'] . '.jpg', + 'blocked' => 0, + 'pending' => 0, + 'url' => System::baseUrl() . '/profile/' . $user['nickname'], + 'nurl' => normalise_link(System::baseUrl() . '/profile/' . $user['nickname']), + 'addr' => $user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3), + 'request' => System::baseUrl() . '/dfrn_request/' . $user['nickname'], + 'notify' => System::baseUrl() . '/dfrn_notify/' . $user['nickname'], + 'poll' => System::baseUrl() . '/dfrn_poll/' . $user['nickname'], + 'confirm' => System::baseUrl() . '/dfrn_confirm/' . $user['nickname'], + 'poco' => System::baseUrl() . '/poco/' . $user['nickname'], + 'name-date' => datetime_convert(), + 'uri-date' => datetime_convert(), + 'avatar-date' => datetime_convert(), + 'closeness' => 0 + ]); + + return $return; + } + /** * @brief Marks a contact for removal * From 27212c7f3904d42308686bf82b9b300be3d8dc7c Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 3 Dec 2017 22:29:06 -0500 Subject: [PATCH 3/9] Update function calls to use Model\User and Object\Contact --- mod/admin.php | 4 +--- mod/register.php | 8 ++++---- mod/regmod.php | 4 +--- src/Worker/CronJobs.php | 3 ++- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/mod/admin.php b/mod/admin.php index d73ac23fd..1b6975ab8 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1466,9 +1466,7 @@ function admin_page_users_post(App $a) check_form_security_token_redirectOnErr('/admin/users', 'admin_users'); if (!($nu_name === "") && !($nu_email === "") && !($nu_nickname === "")) { - require_once 'include/user.php'; - - $result = create_user(array('username' => $nu_name, 'email' => $nu_email, + $result = User::create(array('username' => $nu_name, 'email' => $nu_email, 'nickname' => $nu_nickname, 'verified' => 1, 'language' => $nu_language)); if (!$result['success']) { notice($result['message']); diff --git a/mod/register.php b/mod/register.php index 8645ecb9c..4f6dedd24 100644 --- a/mod/register.php +++ b/mod/register.php @@ -5,8 +5,8 @@ use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Core\Worker; +use Friendica\Model\User; -require_once('include/user.php'); require_once 'include/enotify.php'; require_once 'include/bbcode.php'; @@ -61,7 +61,7 @@ function register_post(App $a) { $arr['verified'] = $verified; $arr['language'] = get_browser_language(); - $result = create_user($arr); + $result = User::create($arr); if(! $result['success']) { notice($result['message']); @@ -89,7 +89,7 @@ function register_post(App $a) { // Only send a password mail when the password wasn't manually provided if (!x($_POST,'password1') || !x($_POST,'confirm')) { - $res = send_register_open_eml( + $res = User::sendRegisterOpenEmail( $user['email'], $a->config['sitename'], System::baseUrl(), @@ -159,7 +159,7 @@ function register_post(App $a) { )); } // send notification to the user, that the registration is pending - send_register_pending_eml( + User::sendRegisterPendingEmail( $user['email'], $a->config['sitename'], $user['username']); diff --git a/mod/regmod.php b/mod/regmod.php index 7fce6914f..2c5d61059 100644 --- a/mod/regmod.php +++ b/mod/regmod.php @@ -6,8 +6,6 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; -require_once('include/user.php'); - require_once 'include/enotify.php'; function user_allow($hash) @@ -52,7 +50,7 @@ function user_allow($hash) push_lang($register[0]['language']); - send_register_open_eml( + User::sendRegisterOpenEmail( $user[0]['email'], $a->config['sitename'], System::baseUrl(), diff --git a/src/Worker/CronJobs.php b/src/Worker/CronJobs.php index a59cd4f9f..7df7d030c 100644 --- a/src/Worker/CronJobs.php +++ b/src/Worker/CronJobs.php @@ -12,6 +12,7 @@ use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; +use Friendica\Object\Contact; use Friendica\Protocol\PortableContact; use dba; @@ -263,8 +264,8 @@ class CronJobs $r = q("SELECT `uid` FROM `user` WHERE NOT EXISTS (SELECT `uid` FROM `contact` WHERE `contact`.`uid` = `user`.`uid` AND `contact`.`self`)"); if (DBM::is_result($r)) { foreach ($r AS $user) { - user_create_self_contact($user['uid']); logger('Create missing self contact for user ' . $user['uid']); + Contact::createSelfFromUserId($user['uid']); } } From 85f6d6b7ed518a32fd939335fa646f959f0d636d Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 3 Dec 2017 22:29:13 -0500 Subject: [PATCH 4/9] Remove include/user --- include/user.php | 453 ----------------------------------------------- 1 file changed, 453 deletions(-) delete mode 100644 include/user.php diff --git a/include/user.php b/include/user.php deleted file mode 100644 index 356f10ad0..000000000 --- a/include/user.php +++ /dev/null @@ -1,453 +0,0 @@ - false, 'user' => null, 'password' => '', 'message' => ''); - - $using_invites = Config::get('system','invitation_only'); - $num_invites = Config::get('system','number_invites'); - - - $invite_id = ((x($arr,'invite_id')) ? notags(trim($arr['invite_id'])) : ''); - $username = ((x($arr,'username')) ? notags(trim($arr['username'])) : ''); - $nickname = ((x($arr,'nickname')) ? notags(trim($arr['nickname'])) : ''); - $email = ((x($arr,'email')) ? notags(trim($arr['email'])) : ''); - $openid_url = ((x($arr,'openid_url')) ? notags(trim($arr['openid_url'])) : ''); - $photo = ((x($arr,'photo')) ? notags(trim($arr['photo'])) : ''); - $password = ((x($arr,'password')) ? trim($arr['password']) : ''); - $password1 = ((x($arr,'password1')) ? trim($arr['password1']) : ''); - $confirm = ((x($arr,'confirm')) ? trim($arr['confirm']) : ''); - $blocked = ((x($arr,'blocked')) ? intval($arr['blocked']) : 0); - $verified = ((x($arr,'verified')) ? intval($arr['verified']) : 0); - - $publish = ((x($arr,'profile_publish_reg') && intval($arr['profile_publish_reg'])) ? 1 : 0); - $netpublish = ((strlen(Config::get('system','directory'))) ? $publish : 0); - - if ($password1 != $confirm) { - $result['message'] .= t('Passwords do not match. Password unchanged.') . EOL; - return $result; - } elseif ($password1 != "") - $password = $password1; - - $tmp_str = $openid_url; - - if($using_invites) { - if(! $invite_id) { - $result['message'] .= t('An invitation is required.') . EOL; - return $result; - } - $r = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1", dbesc($invite_id)); - if(! results($r)) { - $result['message'] .= t('Invitation could not be verified.') . EOL; - return $result; - } - } - - if((! x($username)) || (! x($email)) || (! x($nickname))) { - if($openid_url) { - if(! validate_url($tmp_str)) { - $result['message'] .= t('Invalid OpenID url') . EOL; - return $result; - } - $_SESSION['register'] = 1; - $_SESSION['openid'] = $openid_url; - require_once('library/openid.php'); - $openid = new LightOpenID; - $openid->identity = $openid_url; - $openid->returnUrl = System::baseUrl() . '/openid'; - $openid->required = array('namePerson/friendly', 'contact/email', 'namePerson'); - $openid->optional = array('namePerson/first','media/image/aspect11','media/image/default'); - try { - $authurl = $openid->authUrl(); - } catch (Exception $e){ - $result['message'] .= t("We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."). EOL . EOL . t("The error message was:") . $e->getMessage() . EOL; - return $result; - } - goaway($authurl); - // NOTREACHED - } - - notice( t('Please enter the required information.') . EOL ); - return; - } - - if(! validate_url($tmp_str)) - $openid_url = ''; - - - $err = ''; - - // collapse multiple spaces in name - $username = preg_replace('/ +/',' ',$username); - - if(mb_strlen($username) > 48) - $result['message'] .= t('Please use a shorter name.') . EOL; - if(mb_strlen($username) < 3) - $result['message'] .= t('Name too short.') . EOL; - - // So now we are just looking for a space in the full name. - - $loose_reg = Config::get('system','no_regfullname'); - if(! $loose_reg) { - $username = mb_convert_case($username,MB_CASE_TITLE,'UTF-8'); - if(! strpos($username,' ')) - $result['message'] .= t("That doesn't appear to be your full \x28First Last\x29 name.") . EOL; - } - - - if(! allowed_email($email)) - $result['message'] .= t('Your email domain is not among those allowed on this site.') . EOL; - - if((! valid_email($email)) || (! validate_email($email))) - $result['message'] .= t('Not a valid email address.') . EOL; - - // Disallow somebody creating an account using openid that uses the admin email address, - // since openid bypasses email verification. We'll allow it if there is not yet an admin account. - - $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email']))); - - //if((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0) && strlen($openid_url)) { - if((x($a->config,'admin_email')) && in_array(strtolower($email), $adminlist) && strlen($openid_url)) { - $r = q("SELECT * FROM `user` WHERE `email` = '%s' LIMIT 1", - dbesc($email) - ); - if (DBM::is_result($r)) - $result['message'] .= t('Cannot use that email.') . EOL; - } - - $nickname = $arr['nickname'] = strtolower($nickname); - - if(! preg_match("/^[a-z0-9][a-z0-9\_]*$/",$nickname)) - $result['message'] .= t('Your "nickname" can only contain "a-z", "0-9" and "_".') . EOL; - - $r = q("SELECT `uid` FROM `user` - WHERE `nickname` = '%s' LIMIT 1", - dbesc($nickname) - ); - if (DBM::is_result($r)) - $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL; - - // Check deleted accounts that had this nickname. Doesn't matter to us, - // but could be a security issue for federated platforms. - - $r = q("SELECT * FROM `userd` - WHERE `username` = '%s' LIMIT 1", - dbesc($nickname) - ); - if (DBM::is_result($r)) - $result['message'] .= t('Nickname was once registered here and may not be re-used. Please choose another.') . EOL; - - if(strlen($result['message'])) { - return $result; - } - - $new_password = ((strlen($password)) ? $password : autoname(6) . mt_rand(100,9999)); - $new_password_encoded = hash('whirlpool',$new_password); - - $result['password'] = $new_password; - - require_once('include/crypto.php'); - - $keys = new_keypair(4096); - - if($keys === false) { - $result['message'] .= t('SERIOUS ERROR: Generation of security keys failed.') . EOL; - return $result; - } - - $prvkey = $keys['prvkey']; - $pubkey = $keys['pubkey']; - - // Create another keypair for signing/verifying salmon protocol messages. - $sres = new_keypair(512); - $sprvkey = $sres['prvkey']; - $spubkey = $sres['pubkey']; - - $r = q("INSERT INTO `user` (`guid`, `username`, `password`, `email`, `openid`, `nickname`, - `pubkey`, `prvkey`, `spubkey`, `sprvkey`, `register_date`, `verified`, `blocked`, `timezone`, `default-location`) - VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 'UTC', '')", - dbesc(generate_user_guid()), - dbesc($username), - dbesc($new_password_encoded), - dbesc($email), - dbesc($openid_url), - dbesc($nickname), - dbesc($pubkey), - dbesc($prvkey), - dbesc($spubkey), - dbesc($sprvkey), - dbesc(datetime_convert()), - intval($verified), - intval($blocked) - ); - - if ($r) { - $r = q("SELECT * FROM `user` - WHERE `username` = '%s' AND `password` = '%s' LIMIT 1", - dbesc($username), - dbesc($new_password_encoded) - ); - if (DBM::is_result($r)) { - $u = $r[0]; - $newuid = intval($r[0]['uid']); - } - } - else { - $result['message'] .= t('An error occurred during registration. Please try again.') . EOL ; - return $result; - } - - /** - * if somebody clicked submit twice very quickly, they could end up with two accounts - * due to race condition. Remove this one. - */ - - $r = q("SELECT `uid` FROM `user` - WHERE `nickname` = '%s' ", - dbesc($nickname) - ); - if ((DBM::is_result($r)) && (count($r) > 1) && $newuid) { - $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL; - dba::delete('user', array('uid' => $newuid)); - return $result; - } - - if(x($newuid) !== false) { - $r = q("INSERT INTO `profile` ( `uid`, `profile-name`, `is-default`, `name`, `photo`, `thumb`, `publish`, `net-publish` ) - VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, %d ) ", - intval($newuid), - t('default'), - 1, - dbesc($username), - dbesc(System::baseUrl() . "/photo/profile/{$newuid}.jpg"), - dbesc(System::baseUrl() . "/photo/avatar/{$newuid}.jpg"), - intval($publish), - intval($netpublish) - - ); - if ($r === false) { - $result['message'] .= t('An error occurred creating your default profile. Please try again.') . EOL; - // Start fresh next time. - dba::delete('user', array('uid' => $newuid)); - return $result; - } - - // Create the self contact - user_create_self_contact($newuid); - - // Create a group with no members. This allows somebody to use it - // right away as a default group for new contacts. - - require_once('include/group.php'); - group_add($newuid, t('Friends')); - - $r = q("SELECT `id` FROM `group` WHERE `uid` = %d AND `name` = '%s'", - intval($newuid), - dbesc(t('Friends')) - ); - if (DBM::is_result($r)) { - $def_gid = $r[0]['id']; - - q("UPDATE `user` SET `def_gid` = %d WHERE `uid` = %d", - intval($r[0]['id']), - intval($newuid) - ); - } - - if(Config::get('system', 'newuser_private') && $def_gid) { - q("UPDATE `user` SET `allow_gid` = '%s' WHERE `uid` = %d", - dbesc("<" . $def_gid . ">"), - intval($newuid) - ); - } - - } - - // if we have no OpenID photo try to look up an avatar - if(! strlen($photo)) - $photo = avatar_img($email); - - // unless there is no avatar-plugin loaded - if (strlen($photo)) { - $photo_failure = false; - - $filename = basename($photo); - $img_str = fetch_url($photo, true); - // guess mimetype from headers or filename - $type = Photo::guessImageType($photo, true); - - - $img = new Photo($img_str, $type); - if ($img->isValid()) { - $img->scaleImageSquare(175); - - $hash = photo_new_resource(); - - $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 4); - - if ($r === false) { - $photo_failure = true; - } - - $img->scaleImage(80); - - $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 5 ); - - if ($r === false) { - $photo_failure = true; - } - - $img->scaleImage(48); - - $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 6 ); - - if ($r === false) { - $photo_failure = true; - } - - if (! $photo_failure) { - q("UPDATE `photo` SET `profile` = 1 WHERE `resource-id` = '%s' ", - dbesc($hash) - ); - } - } - } - - call_hooks('register_account', $newuid); - - $result['success'] = true; - $result['user'] = $u; - return $result; - -} - -/** - * @brief create the "self" contact from data from the user table - * - * @param integer $uid - */ -function user_create_self_contact($uid) { - - // Only create the entry if it doesn't exist yet - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", intval($uid)); - if (DBM::is_result($r)) { - return; - } - - $r = q("SELECT `uid`, `username`, `nickname` FROM `user` WHERE `uid` = %d", intval($uid)); - if (!DBM::is_result($r)) { - return; - } - - $user = $r[0]; - - q("INSERT INTO `contact` (`uid`, `created`, `self`, `name`, `nick`, `photo`, `thumb`, `micro`, `blocked`, `pending`, `url`, `nurl`, - `addr`, `request`, `notify`, `poll`, `confirm`, `poco`, `name-date`, `uri-date`, `avatar-date`, `closeness`) - VALUES (%d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 0)", - intval($user['uid']), - datetime_convert(), - dbesc($user['username']), - dbesc($user['nickname']), - dbesc(System::baseUrl()."/photo/profile/".$user['uid'].".jpg"), - dbesc(System::baseUrl()."/photo/avatar/".$user['uid'].".jpg"), - dbesc(System::baseUrl()."/photo/micro/".$user['uid'].".jpg"), - dbesc(System::baseUrl()."/profile/".$user['nickname']), - dbesc(normalise_link(System::baseUrl()."/profile/".$user['nickname'])), - dbesc($user['nickname'].'@'.substr(System::baseUrl(), strpos(System::baseUrl(),'://') + 3)), - dbesc(System::baseUrl()."/dfrn_request/".$user['nickname']), - dbesc(System::baseUrl()."/dfrn_notify/".$user['nickname']), - dbesc(System::baseUrl()."/dfrn_poll/".$user['nickname']), - dbesc(System::baseUrl()."/dfrn_confirm/".$user['nickname']), - dbesc(System::baseUrl()."/poco/".$user['nickname']), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(datetime_convert()) - ); -} - -/** - * @brief send registration confiƕmation with the intormation that reg is pending - * - * @param string $email - * @param string $sitename - * @param string $username - * @return NULL|boolean from notification() and email() inherited - */ -function send_register_pending_eml($email, $sitename, $username) { - $body = deindent(t(' - Dear %1$s, - Thank you for registering at %2$s. Your account is pending for approval by the administrator. - ')); - - $body = sprintf($body, $username, $sitename); - - return notification(array( - 'type' => SYSTEM_EMAIL, - 'to_email' => $email, - 'subject'=> sprintf( t('Registration at %s'), $sitename), - 'body' => $body)); -} - -/* - * send registration confirmation. - * It's here as a function because the mail is sent - * from different parts - */ -function send_register_open_eml($email, $sitename, $siteurl, $username, $password){ - $preamble = deindent(t(' - Dear %1$s, - Thank you for registering at %2$s. Your account has been created. - ')); - $body = deindent(t(' - The login details are as follows: - Site Location: %3$s - Login Name: %1$s - Password: %5$s - - You may change your password from your account "Settings" page after logging - in. - - Please take a few moments to review the other account settings on that page. - - You may also wish to add some basic information to your default profile - (on the "Profiles" page) so that other people can easily find you. - - We recommend setting your full name, adding a profile photo, - adding some profile "keywords" (very useful in making new friends) - and - perhaps what country you live in; if you do not wish to be more specific - than that. - - We fully respect your right to privacy, and none of these items are necessary. - If you are new and do not know anybody here, they may help - you to make some new and interesting friends. - - - Thank you and welcome to %2$s.')); - - $preamble = sprintf($preamble, $username, $sitename); - $body = sprintf($body, $email, $sitename, $siteurl, $username, $password); - - return notification(array( - 'type' => SYSTEM_EMAIL, - 'to_email' => $email, - 'subject'=> sprintf( t('Registration details for %s'), $sitename), - 'preamble'=> $preamble, - 'body' => $body)); -} From 2f0da29c753b870866d90e229237ace7e864769c Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 08:33:49 -0500 Subject: [PATCH 5/9] Features to src Move Features to class in Friendica\Content namespace. Update function calls and references. --- boot.php | 1 - include/acl_selectors.php | 7 +- include/api.php | 3 +- include/contact_widgets.php | 11 ++- include/conversation.php | 7 +- include/event.php | 5 +- include/features.php | 144 ---------------------------------- include/identity.php | 7 +- include/items.php | 3 +- include/nav.php | 7 +- include/tags.php | 7 +- include/text.php | 7 +- mod/admin.php | 6 +- mod/cal.php | 4 +- mod/editpost.php | 7 +- mod/network.php | 15 ++-- mod/photos.php | 7 +- mod/ping.php | 5 +- mod/profiles.php | 7 +- mod/search.php | 15 ++-- mod/settings.php | 7 +- src/Content/Features.php | 148 +++++++++++++++++++++++++++++++++++ src/Content/ForumManager.php | 5 +- src/Object/Item.php | 17 ++-- 24 files changed, 241 insertions(+), 211 deletions(-) delete mode 100644 include/features.php create mode 100644 src/Content/Features.php diff --git a/boot.php b/boot.php index 04e14ac4d..15dfec48b 100644 --- a/boot.php +++ b/boot.php @@ -36,7 +36,6 @@ require_once 'include/text.php'; require_once 'include/datetime.php'; require_once 'include/pgettext.php'; require_once 'include/nav.php'; -require_once 'include/features.php'; require_once 'include/identity.php'; require_once 'update.php'; require_once 'include/dbstructure.php'; diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 5ae30d563..50c733e34 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -1,10 +1,9 @@ t('Permissions'), '$aclModalDismiss' => t('Close'), '$features' => array( - 'aclautomention' => (feature_enabled($user['uid'], "aclautomention") ? "true" : "false") + 'aclautomention' => (Features::isEnabled($user['uid'], "aclautomention") ? "true" : "false") ), )); diff --git a/include/api.php b/include/api.php index 12380f4b8..4055f2b4c 100644 --- a/include/api.php +++ b/include/api.php @@ -6,6 +6,7 @@ * @todo Automatically detect if incoming data is HTML or BBCode */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\NotificationsManager; @@ -5100,7 +5101,7 @@ function api_friendica_profile_show($type) $profileid = (x($_REQUEST, 'profile_id') ? $_REQUEST['profile_id'] : 0); // retrieve general information about profiles for user - $multi_profiles = feature_enabled(api_user(), 'multi_profiles'); + $multi_profiles = Features::isEnabled(api_user(), 'multi_profiles'); $directory = Config::get('system', 'directory'); // get data of the specified profile id or all profiles of the user if not specified diff --git a/include/contact_widgets.php b/include/contact_widgets.php index 5108eaf72..af63de767 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -1,5 +1,8 @@ profile['profile_uid'], 'categories')) { + if (! Features::isEnabled($a->profile['profile_uid'], 'categories')) { return ''; } diff --git a/include/conversation.php b/include/conversation.php index bba852e7a..b32a98426 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -3,6 +3,7 @@ * @file include/conversation.php */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; @@ -915,7 +916,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { '$mode' => $mode, '$user' => $a->user, '$threads' => $threads, - '$dropping' => ($page_dropping && feature_enabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False), + '$dropping' => ($page_dropping && Features::isEnabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False), )); return $o; @@ -1305,7 +1306,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { '$title' => $x['title'], '$placeholdertitle' => t('Set title'), '$category' => $x['category'], - '$placeholdercategory' => (feature_enabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), + '$placeholdercategory' => (Features::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), '$wait' => t('Please wait'), '$permset' => t('Permission settings'), '$shortpermset' => t('permissions'), @@ -1321,7 +1322,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { '$lockstate' => $x['lockstate'], '$bang' => $x['bang'], '$profile_uid' => $x['profile_uid'], - '$preview' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''), + '$preview' => ((Features::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''), '$jotplugins' => $jotplugins, '$notes_cid' => $notes_cid, '$sourceapp' => t($a->sourcename), diff --git a/include/event.php b/include/event.php index a0509aa0f..07b90f249 100644 --- a/include/event.php +++ b/include/event.php @@ -5,6 +5,7 @@ */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; @@ -899,7 +900,7 @@ function widget_events() { * for exporting the cal is enabled (otherwise the widget would appear for logged in users * on foreigen profile pages even if the widget is disabled). */ - if (intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) { + if (intval($owner_uid) && local_user() !== $owner_uid && ! Features::isEnabled($owner_uid, "export_calendar")) { return; } @@ -907,7 +908,7 @@ function widget_events() { * If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and * export feature isn't enabled. */ - if (intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) { + if (intval($owner_uid) && ! local_user() && ! Features::isEnabled($owner_uid, "export_calendar")) { return; } diff --git a/include/features.php b/include/features.php deleted file mode 100644 index e03dc4a5b..000000000 --- a/include/features.php +++ /dev/null @@ -1,144 +0,0 @@ - $uid, 'feature' => $feature, 'enabled' => $x); - call_hooks('feature_enabled',$arr); - return($arr['enabled']); -} - -/** - * @brief check if feature is enabled or disabled by default - * - * @param string $feature - * @return boolean - */ -function get_feature_default($feature) { - $f = get_features(); - foreach ($f as $cat) { - foreach ($cat as $feat) { - if (is_array($feat) && $feat[0] === $feature) - return $feat[3]; - } - } - return false; -} - -/** - * @brief Get a list of all available features - * - * The array includes the setting group, the setting name, - * explainations for the setting and if it's enabled or disabled - * by default - * - * @param bool $filtered True removes any locked features - * - * @return array - */ -function get_features($filtered = true) { - - $arr = array( - - // General - 'general' => array( - t('General Features'), - //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')), - array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock','multi_profiles', false)), - array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock','photo_location', false)), - array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock','export_calendar', false)), - ), - - // Post composition - 'composition' => array( - t('Post Composition Features'), - array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock','preview', false)), - array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock','aclautomention', false)), - ), - - // Network sidebar widgets - 'widgets' => array( - t('Network Sidebar Widgets'), - array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock','archives', false)), - array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock','forumlist_widget', false)), - array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock','groups', false)), - array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock','networks', false)), - array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock','savedsearch', false)), - ), - - // Network tabs - 'net_tabs' => array( - t('Network Tabs'), - array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock','personal_tab', false)), - array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock','new_tab', false)), - array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock','link_tab', false)), - ), - - // Item tools - 'tools' => array( - t('Post/Comment Tools'), - array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock','multi_delete', false)), - array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock','edit_posts', false)), - array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock','commtag', false)), - array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock','categories', false)), - array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock','filing', false)), - array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock','dislike', false)), - array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock','star_posts', false)), - array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock','ignore_posts', false)), - ), - - // Advanced Profile Settings - 'advanced_profile' => array( - t('Advanced Profile Settings'), - array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile', false)), - array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic', false)), - ), - ); - - // removed any locked features and remove the entire category if this makes it empty - - if ($filtered) { - foreach ($arr as $k => $x) { - $has_items = false; - $kquantity = count($arr[$k]); - for ($y = 0; $y < $kquantity; $y ++) { - if (is_array($arr[$k][$y])) { - if ($arr[$k][$y][4] === false) { - $has_items = true; - } else { - unset($arr[$k][$y]); - } - } - } - if (! $has_items) { - unset($arr[$k]); - } - } - } - - call_hooks('get_features',$arr); - return $arr; -} diff --git a/include/identity.php b/include/identity.php index 3066b7113..a12d28d1d 100644 --- a/include/identity.php +++ b/include/identity.php @@ -4,6 +4,7 @@ */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Content\ForumManager; use Friendica\Core\Cache; use Friendica\Core\Config; @@ -309,7 +310,7 @@ function profile_sidebar($profile, $block = 0) } // show edit profile to yourself - if (!$is_contact && $profile['uid'] == local_user() && feature_enabled(local_user(), 'multi_profiles')) { + if (!$is_contact && $profile['uid'] == local_user() && Features::isEnabled(local_user(), 'multi_profiles')) { $profile['edit'] = array(System::baseUrl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles')); $r = q( "SELECT * FROM `profile` WHERE `uid` = %d", @@ -336,7 +337,7 @@ function profile_sidebar($profile, $block = 0) } } } - if (!$is_contact && $profile['uid'] == local_user() && !feature_enabled(local_user(), 'multi_profiles')) { + if (!$is_contact && $profile['uid'] == local_user() && !Features::isEnabled(local_user(), 'multi_profiles')) { $profile['edit'] = array(System::baseUrl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile')); $profile['menu'] = array( 'chg_photo' => t('Change profile photo'), @@ -790,7 +791,7 @@ function advanced_profile(App $a) } //show subcribed forum if it is enabled in the usersettings - if (feature_enabled($uid, 'forumlist_profile')) { + if (Features::isEnabled($uid, 'forumlist_profile')) { $profile['forumlist'] = array( t('Forums:'), ForumManager::profileAdvanced($uid)); } diff --git a/include/items.php b/include/items.php index 98149dea5..22df80907 100644 --- a/include/items.php +++ b/include/items.php @@ -4,6 +4,7 @@ */ use Friendica\App; use Friendica\ParseUrl; +use Friendica\Content\Features; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\Worker; @@ -2355,7 +2356,7 @@ function posted_dates($uid, $wall) { function posted_date_widget($url, $uid, $wall) { $o = ''; - if (! feature_enabled($uid, 'archives')) { + if (! Features::isEnabled($uid, 'archives')) { return $o; } diff --git a/include/nav.php b/include/nav.php index 411f0ac5d..2de1a1560 100644 --- a/include/nav.php +++ b/include/nav.php @@ -1,6 +1,9 @@ profile['profile_uid'], 'tagadelic')) { + if(Features::isEnabled($a->profile['profile_uid'], 'tagadelic')) { $owner_id = Contact::getIdForURL($a->profile['url']); if(!$owner_id) { diff --git a/include/text.php b/include/text.php index 9a3d24bd1..b3f75370e 100644 --- a/include/text.php +++ b/include/text.php @@ -1,6 +1,9 @@ $url, '$search_label' => t('Search'), '$save_label' => t('Save'), - '$savedsearch' => feature_enabled(local_user(),'savedsearch'), + '$savedsearch' => Features::isEnabled(local_user(),'savedsearch'), '$search_hint' => t('@name, !forum, #tags, content'), ); diff --git a/mod/admin.php b/mod/admin.php index 1b6975ab8..16cc31c7b 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1,11 +1,11 @@ $fdata) { foreach (array_slice($fdata, 1) as $f) { @@ -2336,7 +2336,7 @@ function admin_page_features(App $a) { if ((argc() > 1) && (argv(1) === 'features')) { $arr = array(); - $features = get_features(false); + $features = Features::get(false); foreach ($features as $fname => $fdata) { $arr[$fname] = array(); diff --git a/mod/cal.php b/mod/cal.php index 170e7ea4c..4ee2efd58 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -5,8 +5,8 @@ * This calendar is for profile visitors and contains only the events * of the profile owner */ - use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; @@ -301,7 +301,7 @@ function cal_content(App $a) { // Test permissions // Respect the export feature setting for all other /cal pages if it's not the own profile - if( ((local_user() !== intval($owner_uid))) && ! feature_enabled($owner_uid, "export_calendar")) { + if( ((local_user() !== intval($owner_uid))) && ! Features::isEnabled($owner_uid, "export_calendar")) { notice( t('Permission denied.') . EOL); goaway('cal/' . $nick); } diff --git a/mod/editpost.php b/mod/editpost.php index 57c933904..9285a4604 100644 --- a/mod/editpost.php +++ b/mod/editpost.php @@ -1,6 +1,9 @@ htmlspecialchars($itm[0]['title']), '$placeholdertitle' => t('Set title'), '$category' => file_tag_file_to_list($itm[0]['file'], 'category'), - '$placeholdercategory' => (feature_enabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''), + '$placeholdercategory' => (Features::isEnabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''), '$emtitle' => t('Example: bob@example.com, mary@example.com'), '$lockstate' => $lockstate, '$acl' => '', // populate_acl((($group) ? $group_acl : $a->user)), diff --git a/mod/network.php b/mod/network.php index e74df1633..c0a3c29b1 100644 --- a/mod/network.php +++ b/mod/network.php @@ -3,6 +3,7 @@ * @file mod/network.php */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Content\ForumManager; use Friendica\Core\System; use Friendica\Core\Config; @@ -156,8 +157,8 @@ function network_init(App $a) { $a->page['aside'] = ''; } - $a->page['aside'] .= (feature_enabled(local_user(),'groups') ? group_side('network/0','network','standard',$group_id) : ''); - $a->page['aside'] .= (feature_enabled(local_user(), 'forumlist_widget') ? ForumManager::widget(local_user(), $cid) : ''); + $a->page['aside'] .= (Features::isEnabled(local_user(),'groups') ? group_side('network/0','network','standard',$group_id) : ''); + $a->page['aside'] .= (Features::isEnabled(local_user(), 'forumlist_widget') ? ForumManager::widget(local_user(), $cid) : ''); $a->page['aside'] .= posted_date_widget('network',local_user(),false); $a->page['aside'] .= networks_widget('network',(x($_GET, 'nets') ? $_GET['nets'] : '')); $a->page['aside'] .= saved_searches($search); @@ -166,7 +167,7 @@ function network_init(App $a) { function saved_searches($search) { - if (!feature_enabled(local_user(),'savedsearch')) { + if (!Features::isEnabled(local_user(),'savedsearch')) { return ''; } @@ -918,7 +919,7 @@ function network_tabs(App $a) ), ); - if (feature_enabled(local_user(),'personal_tab')) { + if (Features::isEnabled(local_user(),'personal_tab')) { $tabs[] = array( 'label' => t('Personal'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1', @@ -929,7 +930,7 @@ function network_tabs(App $a) ); } - if (feature_enabled(local_user(),'new_tab')) { + if (Features::isEnabled(local_user(),'new_tab')) { $tabs[] = array( 'label' => t('New'), 'url' => 'network/new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''), @@ -940,7 +941,7 @@ function network_tabs(App $a) ); } - if (feature_enabled(local_user(),'link_tab')) { + if (Features::isEnabled(local_user(),'link_tab')) { $tabs[] = array( 'label' => t('Shared Links'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1', @@ -951,7 +952,7 @@ function network_tabs(App $a) ); } - if (feature_enabled(local_user(),'star_posts')) { + if (Features::isEnabled(local_user(),'star_posts')) { $tabs[] = array( 'label' => t('Starred'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1', diff --git a/mod/photos.php b/mod/photos.php index 504f0ff14..a9ba835cf 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -3,6 +3,7 @@ * @file mod/photos.php */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\Worker; @@ -895,7 +896,7 @@ function photos_post(App $a) { /// @TODO merge these 2 if() into one? if ($exif && $exif['GPS']) { - if (feature_enabled($channel_id,'photo_location')) { + if (Features::isEnabled($channel_id,'photo_location')) { $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']); $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']); } @@ -1584,7 +1585,7 @@ function photos_content(App $a) { $likebuttons = replace_macros($like_tpl, array( '$id' => $link_item['id'], '$likethis' => t("I like this \x28toggle\x29"), - '$nolike' => (feature_enabled(local_user(), 'dislike') ? t("I don't like this \x28toggle\x29") : ''), + '$nolike' => (Features::isEnabled(local_user(), 'dislike') ? t("I don't like this \x28toggle\x29") : ''), '$wait' => t('Please wait'), '$return_path' => $a->query_string, )); @@ -1735,7 +1736,7 @@ function photos_content(App $a) { $response_verbs = array('like'); - if (feature_enabled($owner_uid, 'dislike')) { + if (Features::isEnabled($owner_uid, 'dislike')) { $response_verbs[] = 'dislike'; } $responses = get_responses($conv_responses,$response_verbs, '', $link_item); diff --git a/mod/ping.php b/mod/ping.php index 99d5777ea..4bb1ffe00 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -3,6 +3,7 @@ * @file include/ping.php */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Content\ForumManager; use Friendica\Core\Cache; use Friendica\Core\System; @@ -149,7 +150,7 @@ function ping_init(App $a) } if ($network_count) { - if (intval(feature_enabled(local_user(), 'groups'))) { + if (intval(Features::isEnabled(local_user(), 'groups'))) { // Find out how unseen network posts are spread across groups $group_counts = groups_count_unseen(); if (DBM::is_result($group_counts)) { @@ -161,7 +162,7 @@ function ping_init(App $a) } } - if (intval(feature_enabled(local_user(), 'forumlist_widget'))) { + if (intval(Features::isEnabled(local_user(), 'forumlist_widget'))) { $forum_counts = ForumManager::countUnseenItems(); if (DBM::is_result($forums_counts)) { foreach ($forums_counts as $forum_count) { diff --git a/mod/profiles.php b/mod/profiles.php index 75023beb6..eb17f34db 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -3,6 +3,7 @@ * @file mod/profiles.php */ use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; @@ -673,10 +674,10 @@ function profiles_content(App $a) { array(t('No'), t('Yes')) //Off - On strings ), - '$multi_profiles' => feature_enabled(local_user(), 'multi_profiles'), + '$multi_profiles' => Features::isEnabled(local_user(), 'multi_profiles'), '$form_security_token' => get_form_security_token("profile_edit"), '$form_security_token_photo' => get_form_security_token("profile_photo"), - '$profile_clone_link' => ((feature_enabled(local_user(), 'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_clone") : ""), + '$profile_clone_link' => ((Features::isEnabled(local_user(), 'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_clone") : ""), '$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_drop"), '$profile_action' => t('Profile Actions'), @@ -754,7 +755,7 @@ function profiles_content(App $a) { return $o; } else { // If we don't support multi profiles, don't display this list. - if (!feature_enabled(local_user(), 'multi_profiles')) { + if (!Features::isEnabled(local_user(), 'multi_profiles')) { $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`=1", local_user() ); diff --git a/mod/search.php b/mod/search.php index 984167fd7..3d9236055 100644 --- a/mod/search.php +++ b/mod/search.php @@ -1,20 +1,23 @@ t('Additional features'), 'url' => 'settings/features', @@ -784,12 +785,12 @@ function settings_content(App $a) { if (($a->argc > 1) && ($a->argv[1] === 'features')) { $arr = array(); - $features = get_features(); + $features = Features::get(); foreach ($features as $fname => $fdata) { $arr[$fname] = array(); $arr[$fname][0] = $fdata[0]; foreach (array_slice($fdata,1) as $f) { - $arr[$fname][1][] = array('feature_' .$f[0], $f[1],((intval(feature_enabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On'))); + $arr[$fname][1][] = array('feature_' .$f[0], $f[1],((intval(Features::isEnabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On'))); } } diff --git a/src/Content/Features.php b/src/Content/Features.php new file mode 100644 index 000000000..91216c91d --- /dev/null +++ b/src/Content/Features.php @@ -0,0 +1,148 @@ + $uid, 'feature' => $feature, 'enabled' => $x); + call_hooks('isEnabled',$arr); + return($arr['enabled']); + } + + /** + * @brief check if feature is enabled or disabled by default + * + * @param string $feature + * @return boolean + */ + private static function getDefault($feature) { + $f = self::get(); + foreach ($f as $cat) { + foreach ($cat as $feat) { + if (is_array($feat) && $feat[0] === $feature) + return $feat[3]; + } + } + return false; + } + + /** + * @brief Get a list of all available features + * + * The array includes the setting group, the setting name, + * explainations for the setting and if it's enabled or disabled + * by default + * + * @param bool $filtered True removes any locked features + * + * @return array + */ + public static function get($filtered = true) { + + $arr = array( + + // General + 'general' => array( + t('General Features'), + //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')), + array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock','multi_profiles', false)), + array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock','photo_location', false)), + array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock','export_calendar', false)), + ), + + // Post composition + 'composition' => array( + t('Post Composition Features'), + array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock','preview', false)), + array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock','aclautomention', false)), + ), + + // Network sidebar widgets + 'widgets' => array( + t('Network Sidebar Widgets'), + array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock','archives', false)), + array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock','forumlist_widget', false)), + array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock','groups', false)), + array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock','networks', false)), + array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock','savedsearch', false)), + ), + + // Network tabs + 'net_tabs' => array( + t('Network Tabs'), + array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock','personal_tab', false)), + array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock','new_tab', false)), + array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock','link_tab', false)), + ), + + // Item tools + 'tools' => array( + t('Post/Comment Tools'), + array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock','multi_delete', false)), + array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock','edit_posts', false)), + array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock','commtag', false)), + array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock','categories', false)), + array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock','filing', false)), + array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock','dislike', false)), + array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock','star_posts', false)), + array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock','ignore_posts', false)), + ), + + // Advanced Profile Settings + 'advanced_profile' => array( + t('Advanced Profile Settings'), + array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile', false)), + array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic', false)), + ), + ); + + // removed any locked features and remove the entire category if this makes it empty + + if ($filtered) { + foreach ($arr as $k => $x) { + $has_items = false; + $kquantity = count($arr[$k]); + for ($y = 0; $y < $kquantity; $y ++) { + if (is_array($arr[$k][$y])) { + if ($arr[$k][$y][4] === false) { + $has_items = true; + } else { + unset($arr[$k][$y]); + } + } + } + if (! $has_items) { + unset($arr[$k]); + } + } + } + + call_hooks('get',$arr); + return $arr; + } +} diff --git a/src/Content/ForumManager.php b/src/Content/ForumManager.php index e5d153f75..8df416e33 100644 --- a/src/Content/ForumManager.php +++ b/src/Content/ForumManager.php @@ -6,6 +6,7 @@ namespace Friendica\Content; use Friendica\App; +use Friendica\Content\Features; use Friendica\Core\System; use Friendica\Database\DBM; use dba; @@ -82,7 +83,7 @@ class ForumManager */ public static function widget($uid, $cid = 0) { - if (! intval(feature_enabled(local_user(), 'forumlist_widget'))) { + if (! intval(Features::isEnabled(local_user(), 'forumlist_widget'))) { return; } @@ -141,7 +142,7 @@ class ForumManager */ public static function profileAdvanced($uid) { - $profile = intval(feature_enabled($uid, 'forumlist_profile')); + $profile = intval(Features::isEnabled($uid, 'forumlist_profile')); if (! $profile) { return; } diff --git a/src/Object/Item.php b/src/Object/Item.php index cd05b91cf..d9a376a50 100644 --- a/src/Object/Item.php +++ b/src/Object/Item.php @@ -5,6 +5,7 @@ namespace Friendica\Object; use Friendica\BaseObject; +use Friendica\Content\Features; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Database\DBM; @@ -161,7 +162,7 @@ class Item extends BaseObject $drop = array( 'dropping' => $dropping, - 'pagedrop' => ((feature_enabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''), + 'pagedrop' => ((Features::isEnabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''), 'select' => t('Select'), 'delete' => t('Delete'), ); @@ -279,7 +280,7 @@ class Item extends BaseObject } $tagger = ''; - if (feature_enabled($conv->getProfileOwner(), 'commtag')) { + if (Features::isEnabled($conv->getProfileOwner(), 'commtag')) { $tagger = array( 'add' => t("add tag"), 'class' => "", @@ -293,7 +294,7 @@ class Item extends BaseObject if ($conv->isWritable()) { $buttons = array( 'like' => array( t("I like this \x28toggle\x29"), t("like")), - 'dislike' => ((feature_enabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''), + 'dislike' => ((Features::isEnabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''), ); if ($shareable) { $buttons['share'] = array( t('Share this'), t('share')); @@ -378,12 +379,12 @@ class Item extends BaseObject 'owner_photo' => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)), 'owner_name' => htmlentities($owner_name_e), 'plink' => get_plink($item), - 'edpost' => ((feature_enabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''), + 'edpost' => ((Features::isEnabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''), 'isstarred' => $isstarred, - 'star' => ((feature_enabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''), - 'ignore' => ((feature_enabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''), + 'star' => ((Features::isEnabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''), + 'ignore' => ((Features::isEnabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''), 'tagger' => $tagger, - 'filer' => ((feature_enabled($conv->getProfileOwner(), 'filing')) ? $filer : ''), + 'filer' => ((Features::isEnabled($conv->getProfileOwner(), 'filing')) ? $filer : ''), 'drop' => $drop, 'vote' => $buttons, 'like' => $responses['like']['output'], @@ -791,7 +792,7 @@ class Item extends BaseObject '$edimg' => t('Image'), '$edurl' => t('Link'), '$edvideo' => t('Video'), - '$preview' => ((feature_enabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''), + '$preview' => ((Features::isEnabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''), '$indent' => $indent, '$sourceapp' => t($a->sourcename), '$ww' => (($conv->getMode() === 'network') ? $ww : ''), From 6e5471def3477e84473bc237e10c7c75c9e6e853 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 09:01:27 -0500 Subject: [PATCH 6/9] Rename to singular Rename and update references. Standards and a require_once. --- include/acl_selectors.php | 2 +- include/api.php | 2 +- include/contact_widgets.php | 6 +++--- include/conversation.php | 6 +++--- include/event.php | 4 ++-- include/identity.php | 6 +++--- include/items.php | 2 +- include/nav.php | 2 +- include/tags.php | 2 +- include/text.php | 2 +- mod/admin.php | 4 ++-- mod/cal.php | 2 +- mod/editpost.php | 2 +- mod/network.php | 14 +++++++------- mod/photos.php | 6 +++--- mod/ping.php | 4 ++-- mod/profiles.php | 6 +++--- mod/search.php | 2 +- mod/settings.php | 6 +++--- src/Content/{Features.php => Feature.php} | 15 +++++++++------ src/Content/ForumManager.php | 4 ++-- src/Object/Item.php | 16 ++++++++-------- 22 files changed, 59 insertions(+), 56 deletions(-) rename src/Content/{Features.php => Feature.php} (96%) diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 50c733e34..7d7c3e1ae 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -377,7 +377,7 @@ function populate_acl($user = null, $show_jotnets = false) { '$aclModalTitle' => t('Permissions'), '$aclModalDismiss' => t('Close'), '$features' => array( - 'aclautomention' => (Features::isEnabled($user['uid'], "aclautomention") ? "true" : "false") + 'aclautomention' => (Feature::isEnabled($user['uid'], "aclautomention") ? "true" : "false") ), )); diff --git a/include/api.php b/include/api.php index 4055f2b4c..320a00d50 100644 --- a/include/api.php +++ b/include/api.php @@ -5101,7 +5101,7 @@ function api_friendica_profile_show($type) $profileid = (x($_REQUEST, 'profile_id') ? $_REQUEST['profile_id'] : 0); // retrieve general information about profiles for user - $multi_profiles = Features::isEnabled(api_user(), 'multi_profiles'); + $multi_profiles = Feature::isEnabled(api_user(), 'multi_profiles'); $directory = Config::get('system', 'directory'); // get data of the specified profile id or all profiles of the user if not specified diff --git a/include/contact_widgets.php b/include/contact_widgets.php index af63de767..0c5244579 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -108,7 +108,7 @@ function networks_widget($baseurl, $selected = '') { return ''; } - if (!Features::isEnabled(local_user(), 'networks')) { + if (!Feature::isEnabled(local_user(), 'networks')) { return ''; } @@ -147,7 +147,7 @@ function fileas_widget($baseurl, $selected = '') { return ''; } - if (! Features::isEnabled(local_user(), 'filing')) { + if (! Feature::isEnabled(local_user(), 'filing')) { return ''; } @@ -181,7 +181,7 @@ function categories_widget($baseurl, $selected = '') { $a = get_app(); - if (! Features::isEnabled($a->profile['profile_uid'], 'categories')) { + if (! Feature::isEnabled($a->profile['profile_uid'], 'categories')) { return ''; } diff --git a/include/conversation.php b/include/conversation.php index b32a98426..1fea1219e 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -916,7 +916,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { '$mode' => $mode, '$user' => $a->user, '$threads' => $threads, - '$dropping' => ($page_dropping && Features::isEnabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False), + '$dropping' => ($page_dropping && Feature::isEnabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False), )); return $o; @@ -1306,7 +1306,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { '$title' => $x['title'], '$placeholdertitle' => t('Set title'), '$category' => $x['category'], - '$placeholdercategory' => (Features::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), + '$placeholdercategory' => (Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), '$wait' => t('Please wait'), '$permset' => t('Permission settings'), '$shortpermset' => t('permissions'), @@ -1322,7 +1322,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { '$lockstate' => $x['lockstate'], '$bang' => $x['bang'], '$profile_uid' => $x['profile_uid'], - '$preview' => ((Features::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''), + '$preview' => ((Feature::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''), '$jotplugins' => $jotplugins, '$notes_cid' => $notes_cid, '$sourceapp' => t($a->sourcename), diff --git a/include/event.php b/include/event.php index 07b90f249..ce974bd50 100644 --- a/include/event.php +++ b/include/event.php @@ -900,7 +900,7 @@ function widget_events() { * for exporting the cal is enabled (otherwise the widget would appear for logged in users * on foreigen profile pages even if the widget is disabled). */ - if (intval($owner_uid) && local_user() !== $owner_uid && ! Features::isEnabled($owner_uid, "export_calendar")) { + if (intval($owner_uid) && local_user() !== $owner_uid && ! Feature::isEnabled($owner_uid, "export_calendar")) { return; } @@ -908,7 +908,7 @@ function widget_events() { * If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and * export feature isn't enabled. */ - if (intval($owner_uid) && ! local_user() && ! Features::isEnabled($owner_uid, "export_calendar")) { + if (intval($owner_uid) && ! local_user() && ! Feature::isEnabled($owner_uid, "export_calendar")) { return; } diff --git a/include/identity.php b/include/identity.php index a12d28d1d..68b6b4be1 100644 --- a/include/identity.php +++ b/include/identity.php @@ -310,7 +310,7 @@ function profile_sidebar($profile, $block = 0) } // show edit profile to yourself - if (!$is_contact && $profile['uid'] == local_user() && Features::isEnabled(local_user(), 'multi_profiles')) { + if (!$is_contact && $profile['uid'] == local_user() && Feature::isEnabled(local_user(), 'multi_profiles')) { $profile['edit'] = array(System::baseUrl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles')); $r = q( "SELECT * FROM `profile` WHERE `uid` = %d", @@ -337,7 +337,7 @@ function profile_sidebar($profile, $block = 0) } } } - if (!$is_contact && $profile['uid'] == local_user() && !Features::isEnabled(local_user(), 'multi_profiles')) { + if (!$is_contact && $profile['uid'] == local_user() && !Feature::isEnabled(local_user(), 'multi_profiles')) { $profile['edit'] = array(System::baseUrl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile')); $profile['menu'] = array( 'chg_photo' => t('Change profile photo'), @@ -791,7 +791,7 @@ function advanced_profile(App $a) } //show subcribed forum if it is enabled in the usersettings - if (Features::isEnabled($uid, 'forumlist_profile')) { + if (Feature::isEnabled($uid, 'forumlist_profile')) { $profile['forumlist'] = array( t('Forums:'), ForumManager::profileAdvanced($uid)); } diff --git a/include/items.php b/include/items.php index 22df80907..3e502aac5 100644 --- a/include/items.php +++ b/include/items.php @@ -2356,7 +2356,7 @@ function posted_dates($uid, $wall) { function posted_date_widget($url, $uid, $wall) { $o = ''; - if (! Features::isEnabled($uid, 'archives')) { + if (! Feature::isEnabled($uid, 'archives')) { return $o; } diff --git a/include/nav.php b/include/nav.php index 2de1a1560..60b8cb66c 100644 --- a/include/nav.php +++ b/include/nav.php @@ -193,7 +193,7 @@ function nav_info(App $a) $nav['settings'] = array('settings', t('Settings'), '', t('Account settings')); - if (Features::isEnabled(local_user(), 'multi_profiles')) { + if (Feature::isEnabled(local_user(), 'multi_profiles')) { $nav['profiles'] = array('profiles', t('Profiles'), '', t('Manage/Edit Profiles')); } diff --git a/include/tags.php b/include/tags.php index 145f10968..55168b624 100644 --- a/include/tags.php +++ b/include/tags.php @@ -305,7 +305,7 @@ function tagcloud_wall_widget($limit = 50) { return ""; } - if(Features::isEnabled($a->profile['profile_uid'], 'tagadelic')) { + if(Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) { $owner_id = Contact::getIdForURL($a->profile['url']); if(!$owner_id) { diff --git a/include/text.php b/include/text.php index b3f75370e..f5a47c9a9 100644 --- a/include/text.php +++ b/include/text.php @@ -1049,7 +1049,7 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = '$action_url' => $url, '$search_label' => t('Search'), '$save_label' => t('Save'), - '$savedsearch' => Features::isEnabled(local_user(),'savedsearch'), + '$savedsearch' => Feature::isEnabled(local_user(),'savedsearch'), '$search_hint' => t('@name, !forum, #tags, content'), ); diff --git a/mod/admin.php b/mod/admin.php index 16cc31c7b..2e5ba8ba7 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -2291,7 +2291,7 @@ function admin_page_features_post(App $a) logger('postvars: ' . print_r($_POST, true), LOGGER_DATA); $arr = array(); - $features = Features::get(false); + $features = Feature::get(false); foreach ($features as $fname => $fdata) { foreach (array_slice($fdata, 1) as $f) { @@ -2336,7 +2336,7 @@ function admin_page_features(App $a) { if ((argc() > 1) && (argv(1) === 'features')) { $arr = array(); - $features = Features::get(false); + $features = Feature::get(false); foreach ($features as $fname => $fdata) { $arr[$fname] = array(); diff --git a/mod/cal.php b/mod/cal.php index 4ee2efd58..633fe5408 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -301,7 +301,7 @@ function cal_content(App $a) { // Test permissions // Respect the export feature setting for all other /cal pages if it's not the own profile - if( ((local_user() !== intval($owner_uid))) && ! Features::isEnabled($owner_uid, "export_calendar")) { + if( ((local_user() !== intval($owner_uid))) && ! Feature::isEnabled($owner_uid, "export_calendar")) { notice( t('Permission denied.') . EOL); goaway('cal/' . $nick); } diff --git a/mod/editpost.php b/mod/editpost.php index 9285a4604..a2e58239a 100644 --- a/mod/editpost.php +++ b/mod/editpost.php @@ -134,7 +134,7 @@ function editpost_content(App $a) { '$title' => htmlspecialchars($itm[0]['title']), '$placeholdertitle' => t('Set title'), '$category' => file_tag_file_to_list($itm[0]['file'], 'category'), - '$placeholdercategory' => (Features::isEnabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''), + '$placeholdercategory' => (Feature::isEnabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''), '$emtitle' => t('Example: bob@example.com, mary@example.com'), '$lockstate' => $lockstate, '$acl' => '', // populate_acl((($group) ? $group_acl : $a->user)), diff --git a/mod/network.php b/mod/network.php index c0a3c29b1..a320fafd3 100644 --- a/mod/network.php +++ b/mod/network.php @@ -157,8 +157,8 @@ function network_init(App $a) { $a->page['aside'] = ''; } - $a->page['aside'] .= (Features::isEnabled(local_user(),'groups') ? group_side('network/0','network','standard',$group_id) : ''); - $a->page['aside'] .= (Features::isEnabled(local_user(), 'forumlist_widget') ? ForumManager::widget(local_user(), $cid) : ''); + $a->page['aside'] .= (Feature::isEnabled(local_user(),'groups') ? group_side('network/0','network','standard',$group_id) : ''); + $a->page['aside'] .= (Feature::isEnabled(local_user(), 'forumlist_widget') ? ForumManager::widget(local_user(), $cid) : ''); $a->page['aside'] .= posted_date_widget('network',local_user(),false); $a->page['aside'] .= networks_widget('network',(x($_GET, 'nets') ? $_GET['nets'] : '')); $a->page['aside'] .= saved_searches($search); @@ -167,7 +167,7 @@ function network_init(App $a) { function saved_searches($search) { - if (!Features::isEnabled(local_user(),'savedsearch')) { + if (!Feature::isEnabled(local_user(),'savedsearch')) { return ''; } @@ -919,7 +919,7 @@ function network_tabs(App $a) ), ); - if (Features::isEnabled(local_user(),'personal_tab')) { + if (Feature::isEnabled(local_user(),'personal_tab')) { $tabs[] = array( 'label' => t('Personal'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1', @@ -930,7 +930,7 @@ function network_tabs(App $a) ); } - if (Features::isEnabled(local_user(),'new_tab')) { + if (Feature::isEnabled(local_user(),'new_tab')) { $tabs[] = array( 'label' => t('New'), 'url' => 'network/new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''), @@ -941,7 +941,7 @@ function network_tabs(App $a) ); } - if (Features::isEnabled(local_user(),'link_tab')) { + if (Feature::isEnabled(local_user(),'link_tab')) { $tabs[] = array( 'label' => t('Shared Links'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1', @@ -952,7 +952,7 @@ function network_tabs(App $a) ); } - if (Features::isEnabled(local_user(),'star_posts')) { + if (Feature::isEnabled(local_user(),'star_posts')) { $tabs[] = array( 'label' => t('Starred'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1', diff --git a/mod/photos.php b/mod/photos.php index a9ba835cf..47227a1ce 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -896,7 +896,7 @@ function photos_post(App $a) { /// @TODO merge these 2 if() into one? if ($exif && $exif['GPS']) { - if (Features::isEnabled($channel_id,'photo_location')) { + if (Feature::isEnabled($channel_id,'photo_location')) { $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']); $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']); } @@ -1585,7 +1585,7 @@ function photos_content(App $a) { $likebuttons = replace_macros($like_tpl, array( '$id' => $link_item['id'], '$likethis' => t("I like this \x28toggle\x29"), - '$nolike' => (Features::isEnabled(local_user(), 'dislike') ? t("I don't like this \x28toggle\x29") : ''), + '$nolike' => (Feature::isEnabled(local_user(), 'dislike') ? t("I don't like this \x28toggle\x29") : ''), '$wait' => t('Please wait'), '$return_path' => $a->query_string, )); @@ -1736,7 +1736,7 @@ function photos_content(App $a) { $response_verbs = array('like'); - if (Features::isEnabled($owner_uid, 'dislike')) { + if (Feature::isEnabled($owner_uid, 'dislike')) { $response_verbs[] = 'dislike'; } $responses = get_responses($conv_responses,$response_verbs, '', $link_item); diff --git a/mod/ping.php b/mod/ping.php index 4bb1ffe00..3a5959c52 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -150,7 +150,7 @@ function ping_init(App $a) } if ($network_count) { - if (intval(Features::isEnabled(local_user(), 'groups'))) { + if (intval(Feature::isEnabled(local_user(), 'groups'))) { // Find out how unseen network posts are spread across groups $group_counts = groups_count_unseen(); if (DBM::is_result($group_counts)) { @@ -162,7 +162,7 @@ function ping_init(App $a) } } - if (intval(Features::isEnabled(local_user(), 'forumlist_widget'))) { + if (intval(Feature::isEnabled(local_user(), 'forumlist_widget'))) { $forum_counts = ForumManager::countUnseenItems(); if (DBM::is_result($forums_counts)) { foreach ($forums_counts as $forum_count) { diff --git a/mod/profiles.php b/mod/profiles.php index eb17f34db..7d8d0c3d1 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -674,10 +674,10 @@ function profiles_content(App $a) { array(t('No'), t('Yes')) //Off - On strings ), - '$multi_profiles' => Features::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_photo' => get_form_security_token("profile_photo"), - '$profile_clone_link' => ((Features::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=' . get_form_security_token("profile_clone") : ""), '$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t=' . get_form_security_token("profile_drop"), '$profile_action' => t('Profile Actions'), @@ -755,7 +755,7 @@ function profiles_content(App $a) { return $o; } else { // If we don't support multi profiles, don't display this list. - if (!Features::isEnabled(local_user(), 'multi_profiles')) { + if (!Feature::isEnabled(local_user(), 'multi_profiles')) { $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`=1", local_user() ); diff --git a/mod/search.php b/mod/search.php index 3d9236055..900b9cba5 100644 --- a/mod/search.php +++ b/mod/search.php @@ -17,7 +17,7 @@ function search_saved_searches() { $o = ''; - if (! Features::isEnabled(local_user(),'savedsearch')) + if (! Feature::isEnabled(local_user(),'savedsearch')) return $o; $r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", diff --git a/mod/settings.php b/mod/settings.php index f81c76bdc..1fde749d8 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -53,7 +53,7 @@ function settings_init(App $a) { ), ); - if (Features::get()) { + if (Feature::get()) { $tabs[] = array( 'label' => t('Additional features'), 'url' => 'settings/features', @@ -785,12 +785,12 @@ function settings_content(App $a) { if (($a->argc > 1) && ($a->argv[1] === 'features')) { $arr = array(); - $features = Features::get(); + $features = Feature::get(); foreach ($features as $fname => $fdata) { $arr[$fname] = array(); $arr[$fname][0] = $fdata[0]; foreach (array_slice($fdata,1) as $f) { - $arr[$fname][1][] = array('feature_' .$f[0], $f[1],((intval(Features::isEnabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On'))); + $arr[$fname][1][] = array('feature_' .$f[0], $f[1],((intval(Feature::isEnabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On'))); } } diff --git a/src/Content/Features.php b/src/Content/Feature.php similarity index 96% rename from src/Content/Features.php rename to src/Content/Feature.php index 91216c91d..12515387b 100644 --- a/src/Content/Features.php +++ b/src/Content/Feature.php @@ -1,6 +1,6 @@ $dropping, - 'pagedrop' => ((Features::isEnabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''), + 'pagedrop' => ((Feature::isEnabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''), 'select' => t('Select'), 'delete' => t('Delete'), ); @@ -280,7 +280,7 @@ class Item extends BaseObject } $tagger = ''; - if (Features::isEnabled($conv->getProfileOwner(), 'commtag')) { + if (Feature::isEnabled($conv->getProfileOwner(), 'commtag')) { $tagger = array( 'add' => t("add tag"), 'class' => "", @@ -294,7 +294,7 @@ class Item extends BaseObject if ($conv->isWritable()) { $buttons = array( 'like' => array( t("I like this \x28toggle\x29"), t("like")), - 'dislike' => ((Features::isEnabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''), + 'dislike' => ((Feature::isEnabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''), ); if ($shareable) { $buttons['share'] = array( t('Share this'), t('share')); @@ -379,12 +379,12 @@ class Item extends BaseObject 'owner_photo' => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)), 'owner_name' => htmlentities($owner_name_e), 'plink' => get_plink($item), - 'edpost' => ((Features::isEnabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''), + 'edpost' => ((Feature::isEnabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''), 'isstarred' => $isstarred, - 'star' => ((Features::isEnabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''), - 'ignore' => ((Features::isEnabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''), + 'star' => ((Feature::isEnabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''), + 'ignore' => ((Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''), 'tagger' => $tagger, - 'filer' => ((Features::isEnabled($conv->getProfileOwner(), 'filing')) ? $filer : ''), + 'filer' => ((Feature::isEnabled($conv->getProfileOwner(), 'filing')) ? $filer : ''), 'drop' => $drop, 'vote' => $buttons, 'like' => $responses['like']['output'], @@ -792,7 +792,7 @@ class Item extends BaseObject '$edimg' => t('Image'), '$edurl' => t('Link'), '$edvideo' => t('Video'), - '$preview' => ((Features::isEnabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''), + '$preview' => ((Feature::isEnabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''), '$indent' => $indent, '$sourceapp' => t($a->sourcename), '$ww' => (($conv->getMode() === 'network') ? $ww : ''), From b1d16fbdf7db1ec67179ad3f3869af4d16e0a38d Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 09:04:36 -0500 Subject: [PATCH 7/9] Update use statements update use statements for rename to singular. --- include/acl_selectors.php | 2 +- include/api.php | 2 +- include/contact_widgets.php | 2 +- include/conversation.php | 2 +- include/event.php | 2 +- include/identity.php | 2 +- include/items.php | 2 +- include/nav.php | 2 +- include/tags.php | 2 +- include/text.php | 2 +- mod/admin.php | 2 +- mod/cal.php | 2 +- mod/editpost.php | 2 +- mod/network.php | 2 +- mod/photos.php | 2 +- mod/ping.php | 2 +- mod/profiles.php | 2 +- mod/search.php | 2 +- mod/settings.php | 2 +- src/Content/ForumManager.php | 2 +- src/Object/Item.php | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 7d7c3e1ae..f971d462b 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -3,7 +3,7 @@ * @file include/acl_selectors.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; diff --git a/include/api.php b/include/api.php index 320a00d50..ea804b18b 100644 --- a/include/api.php +++ b/include/api.php @@ -6,7 +6,7 @@ * @todo Automatically detect if incoming data is HTML or BBCode */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\NotificationsManager; diff --git a/include/contact_widgets.php b/include/contact_widgets.php index 0c5244579..31e57ea83 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -2,7 +2,7 @@ /** * @file include/contact_widgets.php */ -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\PConfig; diff --git a/include/conversation.php b/include/conversation.php index 1fea1219e..4b9459a3f 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -3,7 +3,7 @@ * @file include/conversation.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; diff --git a/include/event.php b/include/event.php index ce974bd50..4795867b1 100644 --- a/include/event.php +++ b/include/event.php @@ -5,7 +5,7 @@ */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; diff --git a/include/identity.php b/include/identity.php index 68b6b4be1..a3a007cc1 100644 --- a/include/identity.php +++ b/include/identity.php @@ -4,7 +4,7 @@ */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Content\ForumManager; use Friendica\Core\Cache; use Friendica\Core\Config; diff --git a/include/items.php b/include/items.php index 3e502aac5..cbc7af565 100644 --- a/include/items.php +++ b/include/items.php @@ -4,7 +4,7 @@ */ use Friendica\App; use Friendica\ParseUrl; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\Worker; diff --git a/include/nav.php b/include/nav.php index 60b8cb66c..f2bf161f9 100644 --- a/include/nav.php +++ b/include/nav.php @@ -3,7 +3,7 @@ * @file include/nav.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Database\DBM; diff --git a/include/tags.php b/include/tags.php index 55168b624..45a17f9c9 100644 --- a/include/tags.php +++ b/include/tags.php @@ -3,7 +3,7 @@ * @file include/tags.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Database\DBM; use Friendica\Object\Contact; diff --git a/include/text.php b/include/text.php index f5a47c9a9..b2e0ac30d 100644 --- a/include/text.php +++ b/include/text.php @@ -3,7 +3,7 @@ * @file include/text.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Content\Smilies; use Friendica\Core\Config; use Friendica\Core\PConfig; diff --git a/mod/admin.php b/mod/admin.php index 2e5ba8ba7..29e10bda8 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -5,7 +5,7 @@ * @brief Friendica admin */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\Worker; diff --git a/mod/cal.php b/mod/cal.php index 633fe5408..7eb31905b 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -6,7 +6,7 @@ * of the profile owner */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; diff --git a/mod/editpost.php b/mod/editpost.php index a2e58239a..a9cdfe9bb 100644 --- a/mod/editpost.php +++ b/mod/editpost.php @@ -3,7 +3,7 @@ * @file mod/editpost.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Database\DBM; diff --git a/mod/network.php b/mod/network.php index a320fafd3..7e61d083f 100644 --- a/mod/network.php +++ b/mod/network.php @@ -3,7 +3,7 @@ * @file mod/network.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Content\ForumManager; use Friendica\Core\System; use Friendica\Core\Config; diff --git a/mod/photos.php b/mod/photos.php index 47227a1ce..3e2c44e3c 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -3,7 +3,7 @@ * @file mod/photos.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Core\Worker; diff --git a/mod/ping.php b/mod/ping.php index 3a5959c52..0f2a9584b 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -3,7 +3,7 @@ * @file include/ping.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Content\ForumManager; use Friendica\Core\Cache; use Friendica\Core\System; diff --git a/mod/profiles.php b/mod/profiles.php index 7d8d0c3d1..eca13bf10 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -3,7 +3,7 @@ * @file mod/profiles.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; diff --git a/mod/search.php b/mod/search.php index 900b9cba5..c17b11c5d 100644 --- a/mod/search.php +++ b/mod/search.php @@ -3,7 +3,7 @@ * @file mod/search.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Database\DBM; diff --git a/mod/settings.php b/mod/settings.php index 1fde749d8..778a1d8a7 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -3,7 +3,7 @@ * @file mod/settings.php */ use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Core\Config; diff --git a/src/Content/ForumManager.php b/src/Content/ForumManager.php index fb64aed6f..d619db42b 100644 --- a/src/Content/ForumManager.php +++ b/src/Content/ForumManager.php @@ -6,7 +6,7 @@ namespace Friendica\Content; use Friendica\App; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\System; use Friendica\Database\DBM; use dba; diff --git a/src/Object/Item.php b/src/Object/Item.php index 597982165..1533908ae 100644 --- a/src/Object/Item.php +++ b/src/Object/Item.php @@ -5,7 +5,7 @@ namespace Friendica\Object; use Friendica\BaseObject; -use Friendica\Content\Features; +use Friendica\Content\Feature; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Database\DBM; From 4af9616b178aabbb7383bc150c41f6ec36afbaf2 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 09:16:15 -0500 Subject: [PATCH 8/9] Standards Standards clean up. --- src/Content/Feature.php | 53 ++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/Content/Feature.php b/src/Content/Feature.php index 12515387b..864c07a0d 100644 --- a/src/Content/Feature.php +++ b/src/Content/Feature.php @@ -15,6 +15,8 @@ class Feature /** * @brief check if feature is enabled * + * @param integer $uid user id + * @param string $feature feature * @return boolean */ public static function isEnabled($uid, $feature) @@ -32,14 +34,14 @@ class Feature } $arr = array('uid' => $uid, 'feature' => $feature, 'enabled' => $x); - call_hooks('isEnabled',$arr); + call_hooks('isEnabled', $arr); return($arr['enabled']); } /** * @brief check if feature is enabled or disabled by default * - * @param string $feature + * @param string $feature feature * @return boolean */ private static function getDefault($feature) @@ -47,8 +49,9 @@ class Feature $f = self::get(); foreach ($f as $cat) { foreach ($cat as $feat) { - if (is_array($feat) && $feat[0] === $feature) + if (is_array($feat) && $feat[0] === $feature) { return $feat[3]; + } } } return false; @@ -73,53 +76,53 @@ class Feature 'general' => array( t('General Features'), //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')), - array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock','multi_profiles', false)), - array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock','photo_location', false)), - array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock','export_calendar', false)), + array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock', 'multi_profiles', false)), + array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock', 'photo_location', false)), + array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock', 'export_calendar', false)), ), // Post composition 'composition' => array( t('Post Composition Features'), - array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock','preview', false)), - array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock','aclautomention', false)), + array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock', 'preview', false)), + array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock', 'aclautomention', false)), ), // Network sidebar widgets 'widgets' => array( t('Network Sidebar Widgets'), - array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock','archives', false)), - array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock','forumlist_widget', false)), - array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock','groups', false)), - array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock','networks', false)), - array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock','savedsearch', false)), + array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock', 'archives', false)), + array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock', 'forumlist_widget', false)), + array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock', 'groups', false)), + array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock', 'networks', false)), + array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock', 'savedsearch', false)), ), // Network tabs 'net_tabs' => array( t('Network Tabs'), - array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock','personal_tab', false)), - array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock','new_tab', false)), - array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock','link_tab', false)), + array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock', 'personal_tab', false)), + array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock', 'new_tab', false)), + array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock', 'link_tab', false)), ), // Item tools 'tools' => array( t('Post/Comment Tools'), - array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock','multi_delete', false)), - array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock','edit_posts', false)), - array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock','commtag', false)), - array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock','categories', false)), - array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock','filing', false)), - array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock','dislike', false)), - array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock','star_posts', false)), - array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock','ignore_posts', false)), + array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock', 'multi_delete', false)), + array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock', 'edit_posts', false)), + array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock', 'commtag', false)), + array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock', 'categories', false)), + array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock', 'filing', false)), + array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock', 'dislike', false)), + array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock', 'star_posts', false)), + array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock', 'ignore_posts', false)), ), // Advanced Profile Settings 'advanced_profile' => array( t('Advanced Profile Settings'), - array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile', false)), + array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock', 'forumlist_profile', false)), array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic', false)), ), ); From 4a96f7b45892da9f2a972d05ecfb3a421644d6ec Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 13:12:22 -0500 Subject: [PATCH 9/9] Pidfile to src Move pidfile to Friendica\Util namespace --- include/pidfile.php | 40 ------------------------ src/Util/Pidfile.php | 72 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 40 deletions(-) delete mode 100644 include/pidfile.php create mode 100644 src/Util/Pidfile.php diff --git a/include/pidfile.php b/include/pidfile.php deleted file mode 100644 index 7157a6e59..000000000 --- a/include/pidfile.php +++ /dev/null @@ -1,40 +0,0 @@ -_file = "$dir/$name.pid"; - - if (file_exists($this->_file)) { - $pid = trim(@file_get_contents($this->_file)); - if (($pid != "") && posix_kill($pid, 0)) { - $this->_running = true; - } - } - - if (! $this->_running) { - $pid = getmypid(); - file_put_contents($this->_file, $pid); - } - } - - public function __destruct() { - if ((! $this->_running) && file_exists($this->_file)) { - @unlink($this->_file); - } - } - - public function is_already_running() { - return $this->_running; - } - - public function running_time() { - return(time() - @filectime($this->_file)); - } - - public function kill() { - if (file_exists($this->_file)) - return(posix_kill(file_get_contents($this->_file), SIGTERM)); - } -} diff --git a/src/Util/Pidfile.php b/src/Util/Pidfile.php new file mode 100644 index 000000000..a5d1171e7 --- /dev/null +++ b/src/Util/Pidfile.php @@ -0,0 +1,72 @@ +_file = "$dir/$name.pid"; + + if (file_exists($this->_file)) { + $pid = trim(@file_get_contents($this->file)); + if (($pid != "") && posix_kill($pid, 0)) { + $this->running = true; + } + } + + if (! $this->running) { + $pid = getmypid(); + file_put_contents($this->file, $pid); + } + } + + /** + * @return void + */ + public function __destruct() + { + if ((! $this->running) && file_exists($this->file)) { + @unlink($this->file); + } + } + + /** + * @return boolean + */ + public static function isRunning() + { + return self::$running; + } + + /** + * @return object + */ + public static function runningTime() + { + return time() - @filectime(self::$file); + } + + /** + * @return boolean + */ + public static function kill() + { + if (file_exists(self::$file)) { + return posix_kill(file_get_contents(self::$file), SIGTERM); + } + } +}