]> git.mxchange.org Git - friendica.git/commitdiff
Move mod/nodeinfo to src/Module/Nodeinfo
authorPhilipp Holzer <admin@philipp.info>
Mon, 22 Apr 2019 12:00:17 +0000 (14:00 +0200)
committerPhilipp Holzer <admin@philipp.info>
Mon, 22 Apr 2019 12:00:17 +0000 (14:00 +0200)
mod/_well_known.php
mod/nodeinfo.php [deleted file]
src/Model/Nodeinfo.php [new file with mode: 0644]
src/Model/User.php
src/Module/Nodeinfo.php [new file with mode: 0644]
src/Worker/CronJobs.php

index f6a351bb2369802f5b16bc015594b43387b0233a..a5e167de2ff75b40a8f6c0ffd3afbe18c0fc633c 100644 (file)
@@ -3,6 +3,7 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\System;
+use Friendica\Module\Nodeinfo;
 
 require_once 'mod/hostxrd.php';
 require_once 'mod/nodeinfo.php';
@@ -19,7 +20,7 @@ function _well_known_init(App $a)
                                wk_social_relay();
                                break;
                        case "nodeinfo":
-                               nodeinfo_wellknown($a);
+                               Nodeinfo::printWellKnown($a);
                                break;
                        case "webfinger":
                                xrd_init($a);
diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php
deleted file mode 100644 (file)
index da9dbb8..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-<?php
-/**
- * @file mod/nodeinfo.php
- *
- * Documentation: http://nodeinfo.diaspora.software/schema.html
-*/
-
-use Friendica\App;
-use Friendica\Core\Addon;
-use Friendica\Core\Config;
-use Friendica\Core\Logger;
-use Friendica\Core\System;
-use Friendica\Database\DBA;
-use Friendica\Util\Network;
-
-function nodeinfo_wellknown(App $a) {
-       if (!Config::get('system', 'nodeinfo')) {
-               System::httpExit(404);
-       }
-
-       $nodeinfo = ['links' => [['rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0',
-                                       'href' => System::baseUrl().'/nodeinfo/1.0']]];
-
-       header('Content-type: application/json; charset=utf-8');
-       echo json_encode($nodeinfo, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
-       exit;
-}
-
-function nodeinfo_init(App $a) {
-       if (!Config::get('system', 'nodeinfo')) {
-               System::httpExit(404);
-       }
-
-       if (($a->argc != 2) || ($a->argv[1] != '1.0')) {
-               System::httpExit(404);
-       }
-
-       $smtp = (function_exists('imap_open') && !Config::get('system', 'imap_disabled') && !Config::get('system', 'dfrn_only'));
-
-       $nodeinfo = [];
-       $nodeinfo['version'] = '1.0';
-       $nodeinfo['software'] = ['name' => 'friendica', 'version' => FRIENDICA_VERSION.'-'.DB_UPDATE_VERSION];
-
-       $nodeinfo['protocols'] = [];
-       $nodeinfo['protocols']['inbound'] = [];
-       $nodeinfo['protocols']['outbound'] = [];
-
-       if (Config::get('system', 'diaspora_enabled')) {
-               $nodeinfo['protocols']['inbound'][] = 'diaspora';
-               $nodeinfo['protocols']['outbound'][] = 'diaspora';
-       }
-
-       $nodeinfo['protocols']['inbound'][] = 'friendica';
-       $nodeinfo['protocols']['outbound'][] = 'friendica';
-
-       if (!Config::get('system', 'ostatus_disabled')) {
-               $nodeinfo['protocols']['inbound'][] = 'gnusocial';
-               $nodeinfo['protocols']['outbound'][] = 'gnusocial';
-       }
-
-       $nodeinfo['services'] = [];
-       $nodeinfo['services']['inbound'] = [];
-       $nodeinfo['services']['outbound'] = [];
-
-       $nodeinfo['usage'] = [];
-
-       $nodeinfo['openRegistrations'] = intval(Config::get('config', 'register_policy')) !== \Friendica\Module\Register::CLOSED;
-
-       $nodeinfo['metadata'] = ['nodeName' => Config::get('config', 'sitename')];
-
-       if (Config::get('system', 'nodeinfo')) {
-
-               $nodeinfo['usage']['users'] = ['total' => (int)Config::get('nodeinfo', 'total_users'),
-                                       'activeHalfyear' => (int)Config::get('nodeinfo', 'active_users_halfyear'),
-                                       'activeMonth' => (int)Config::get('nodeinfo', 'active_users_monthly')];
-               $nodeinfo['usage']['localPosts'] = (int)Config::get('nodeinfo', 'local_posts');
-               $nodeinfo['usage']['localComments'] = (int)Config::get('nodeinfo', 'local_comments');
-
-               if (Addon::isEnabled('blogger')) {
-                       $nodeinfo['services']['outbound'][] = 'blogger';
-               }
-               if (Addon::isEnabled('dwpost')) {
-                       $nodeinfo['services']['outbound'][] = 'dreamwidth';
-               }
-               if (Addon::isEnabled('statusnet')) {
-                       $nodeinfo['services']['inbound'][] = 'gnusocial';
-                       $nodeinfo['services']['outbound'][] = 'gnusocial';
-               }
-               if (Addon::isEnabled('ijpost')) {
-                       $nodeinfo['services']['outbound'][] = 'insanejournal';
-               }
-               if (Addon::isEnabled('libertree')) {
-                       $nodeinfo['services']['outbound'][] = 'libertree';
-               }
-               if (Addon::isEnabled('buffer')) {
-                       $nodeinfo['services']['outbound'][] = 'linkedin';
-               }
-               if (Addon::isEnabled('ljpost')) {
-                       $nodeinfo['services']['outbound'][] = 'livejournal';
-               }
-               if (Addon::isEnabled('buffer')) {
-                       $nodeinfo['services']['outbound'][] = 'pinterest';
-               }
-               if (Addon::isEnabled('posterous')) {
-                       $nodeinfo['services']['outbound'][] = 'posterous';
-               }
-               if (Addon::isEnabled('pumpio')) {
-                       $nodeinfo['services']['inbound'][] = 'pumpio';
-                       $nodeinfo['services']['outbound'][] = 'pumpio';
-               }
-
-               if ($smtp) {
-                       $nodeinfo['services']['outbound'][] = 'smtp';
-               }
-               if (Addon::isEnabled('tumblr')) {
-                       $nodeinfo['services']['outbound'][] = 'tumblr';
-               }
-               if (Addon::isEnabled('twitter') || Addon::isEnabled('buffer')) {
-                       $nodeinfo['services']['outbound'][] = 'twitter';
-               }
-               if (Addon::isEnabled('wppost')) {
-                       $nodeinfo['services']['outbound'][] = 'wordpress';
-               }
-               $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols'];
-               $nodeinfo['metadata']['protocols']['outbound'][] = 'atom1.0';
-               $nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0';
-               $nodeinfo['metadata']['protocols']['inbound'][] = 'rss2.0';
-
-               $nodeinfo['metadata']['services'] = $nodeinfo['services'];
-
-               if (Addon::isEnabled('twitter')) {
-                       $nodeinfo['metadata']['services']['inbound'][] = 'twitter';
-               }
-
-               $nodeinfo['metadata']['explicitContent'] = Config::get('system', 'explicit_content', false) == true;
-       }
-
-       header('Content-type: application/json; charset=utf-8');
-       echo json_encode($nodeinfo, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
-       exit;
-}
-
-
-
-function nodeinfo_cron() {
-
-       $a = \get_app();
-
-       // If the addon 'statistics_json' is enabled then disable it and activate nodeinfo.
-       if (Addon::isEnabled('statistics_json')) {
-               Config::set('system', 'nodeinfo', true);
-
-               $addon = 'statistics_json';
-               $addons = Config::get('system', 'addon');
-
-               if ($addons) {
-                       $addons_arr = explode(',',str_replace(' ', '',$addons));
-
-                       $idx = array_search($addon, $addons_arr);
-                       if ($idx !== false) {
-                               unset($addons_arr[$idx]);
-                               Addon::uninstall($addon);
-                               Config::set('system', 'addon', implode(', ',$addons_arr));
-                       }
-               }
-       }
-
-       if (!Config::get('system', 'nodeinfo')) {
-               return;
-       }
-
-       Logger::log('cron_start');
-
-       $users = q("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item`
-                       FROM `user`
-                       INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid` AND `profile`.`is-default`
-                       INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
-                       WHERE (`profile`.`publish` OR `profile`.`net-publish`) AND `user`.`verified`
-                               AND NOT `user`.`blocked` AND NOT `user`.`account_removed`
-                               AND NOT `user`.`account_expired`");
-       if (is_array($users)) {
-               $total_users = count($users);
-               $active_users_halfyear = 0;
-               $active_users_monthly = 0;
-
-               $halfyear = time() - (180 * 24 * 60 * 60);
-               $month = time() - (30 * 24 * 60 * 60);
-
-               foreach ($users AS $user) {
-                       if ((strtotime($user['login_date']) > $halfyear) ||
-                               (strtotime($user['last-item']) > $halfyear)) {
-                               ++$active_users_halfyear;
-                       }
-                       if ((strtotime($user['login_date']) > $month) ||
-                               (strtotime($user['last-item']) > $month)) {
-                               ++$active_users_monthly;
-                       }
-               }
-               Config::set('nodeinfo', 'total_users', $total_users);
-               Config::set('nodeinfo', 'active_users_halfyear', $active_users_halfyear);
-               Config::set('nodeinfo', 'active_users_monthly', $active_users_monthly);
-
-               Logger::log('total_users: ' . $total_users . '/' . $active_users_halfyear. '/' . $active_users_monthly, Logger::DEBUG);
-       }
-
-       $local_posts = DBA::count('thread', ["`wall` AND NOT `deleted` AND `uid` != 0"]);
-       Config::set('nodeinfo', 'local_posts', $local_posts);
-       Logger::log('local_posts: ' . $local_posts, Logger::DEBUG);
-
-       $local_comments = DBA::count('item', ["`origin` AND `id` != `parent` AND NOT `deleted` AND `uid` != 0"]);
-       Config::set('nodeinfo', 'local_comments', $local_comments);
-       Logger::log('local_comments: ' . $local_comments, Logger::DEBUG);
-
-       // Now trying to register
-       $url = 'http://the-federation.info/register/'.$a->getHostName();
-       Logger::log('registering url: '.$url, Logger::DEBUG);
-       $ret = Network::fetchUrl($url);
-       Logger::log('registering answer: '.$ret, Logger::DEBUG);
-
-       Logger::log('cron_end');
-}
diff --git a/src/Model/Nodeinfo.php b/src/Model/Nodeinfo.php
new file mode 100644 (file)
index 0000000..560629b
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+namespace Friendica\Model;
+
+use Friendica\BaseObject;
+use Friendica\Core\Addon;
+use Friendica\Database\DBA;
+use Friendica\Util\Network;
+
+/**
+ * Model interaction for the nodeinfo
+ */
+class Nodeinfo extends BaseObject
+{
+       /**
+        * Updates the info about the current node
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public static function update()
+       {
+               $app = self::getApp();
+               $config = $app->getConfig();
+               $logger = $app->getLogger();
+
+               // If the addon 'statistics_json' is enabled then disable it and activate nodeinfo.
+               if (Addon::isEnabled('statistics_json')) {
+                       $config->set('system', 'nodeinfo', true);
+
+                       $addon = 'statistics_json';
+                       $addons = $config->get('system', 'addon');
+
+                       if ($addons) {
+                               $addons_arr = explode(',', str_replace(' ', '', $addons));
+
+                               $idx = array_search($addon, $addons_arr);
+                               if ($idx !== false) {
+                                       unset($addons_arr[$idx]);
+                                       Addon::uninstall($addon);
+                                       $config->set('system', 'addon', implode(', ', $addons_arr));
+                               }
+                       }
+               }
+
+               if (empty($config->get('system', 'nodeinfo'))) {
+                       return;
+               }
+
+               $logger->info('cron_start');
+
+               $userStats = User::getStatistics();
+
+               $config->set('nodeinfo', 'total_users', $userStats['total_users']);
+               $config->set('nodeinfo', 'active_users_halfyear', $userStats['active_users_halfyear']);
+               $config->set('nodeinfo', 'active_users_monthly', $userStats['active_users_monthly']);
+
+               $logger->debug('user statistics', $userStats);
+
+               $local_posts = DBA::count('thread', ["`wall` AND NOT `deleted` AND `uid` != 0"]);
+               $config->set('nodeinfo', 'local_posts', $local_posts);
+               $logger->debug('thread statistics', ['local_posts' => $local_posts]);
+
+               $local_comments = DBA::count('item', ["`origin` AND `id` != `parent` AND NOT `deleted` AND `uid` != 0"]);
+               $config->set('nodeinfo', 'local_comments', $local_comments);
+               $logger->debug('item statistics', ['local_comments' => $local_comments]);
+
+               // Now trying to register
+               $url = 'http://the-federation.info/register/' . $app->getHostName();
+               $logger->debug('Check registering url', ['url' => $url]);
+               $ret = Network::fetchUrl($url);
+               $logger->debug('Check registering answer', ['answer' => $ret]);
+
+               $logger->info('cron_end');
+       }
+}
index 472ed09247846ea8cf39a0131ca8c68969fcb68b..4b3823f040d0e1db8f1f7dca070274bee68667fa 100644 (file)
@@ -967,4 +967,51 @@ class User
 
                return $identities;
        }
+
+       /**
+        * Returns statistical information about the current users of this node
+        *
+        * @return array
+        *
+        * @throws Exception
+        */
+       public static function getStatistics()
+       {
+               $statistics = [
+                       'total_users'           => 0,
+                       'active_users_halfyear' => 0,
+                       'active_users_monthly'  => 0,
+               ];
+
+               $userStmt = DBA::p("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item`
+                       FROM `user`
+                       INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid` AND `profile`.`is-default`
+                       INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
+                       WHERE (`profile`.`publish` OR `profile`.`net-publish`) AND `user`.`verified`
+                               AND NOT `user`.`blocked` AND NOT `user`.`account_removed`
+                               AND NOT `user`.`account_expired`");
+
+               if (!DBA::isResult($userStmt)) {
+                       return $statistics;
+               }
+
+               $halfyear = time() - (180 * 24 * 60 * 60);
+               $month = time() - (30 * 24 * 60 * 60);
+
+               while ($user = DBA::fetch($userStmt)) {
+                       $statistics['total_users']++;
+
+                       if ((strtotime($user['login_date']) > $halfyear) ||
+                               (strtotime($user['last-item']) > $halfyear)) {
+                               $statistics['active_users_halfyear']++;
+                       }
+
+                       if ((strtotime($user['login_date']) > $month) ||
+                               (strtotime($user['last-item']) > $month)) {
+                               $statistics['active_users_monthly']++;
+                       }
+               }
+
+               return $statistics;
+       }
 }
diff --git a/src/Module/Nodeinfo.php b/src/Module/Nodeinfo.php
new file mode 100644 (file)
index 0000000..18f2c72
--- /dev/null
@@ -0,0 +1,169 @@
+<?php
+
+namespace Friendica\Module;
+
+use Friendica\App;
+use Friendica\BaseModule;
+use Friendica\Core\Addon;
+use Friendica\Core\System;
+
+/**
+ * Prints infos about the current node
+ */
+class Nodeinfo extends BaseModule
+{
+       /**
+        * Prints the Nodeinfo for a well-known request
+        *
+        * @param App $app
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public static function printWellKnown(App $app)
+       {
+               $config = $app->getConfig();
+
+               if (!$config->get('system', 'nodeinfo')) {
+                       System::httpExit(404);
+               }
+
+               $nodeinfo = [
+                       'links' => [[
+                               'rel'  => 'http://nodeinfo.diaspora.software/ns/schema/1.0',
+                               'href' => $app->getBaseURL() . '/nodeinfo/1.0']]
+               ];
+
+               header('Content-type: application/json; charset=utf-8');
+               echo json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+               exit;
+       }
+
+       public static function init()
+       {
+               $app = self::getApp();
+               $config = $app->getConfig();
+
+               if (!$config->get('system', 'nodeinfo')) {
+                       System::httpExit(404);
+               }
+
+               if (($app->argc != 2) || ($app->argv[1] != '1.0')) {
+                       System::httpExit(404);
+               }
+       }
+
+       public static function rawContent()
+       {
+               $config = self::getApp()->getConfig();
+
+               $smtp = (function_exists('imap_open') && !$config->get('system', 'imap_disabled') && !$config->get('system', 'dfrn_only'));
+
+               $nodeinfo = [
+                       'version'           => 1.0,
+                       'software'          => [
+                               'name'    => 'friendica',
+                               'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION,
+                       ],
+                       'protocols'         => [
+                               'inbound'  => [
+                                       'friendica',
+                               ],
+                               'outbound' => [
+                                       'friendica',
+                               ],
+                       ],
+                       'services'          => [
+                               'inbound'  => [],
+                               'outbound' => [],
+                       ],
+                       'usage'             => [],
+                       'openRegistrations' => intval($config->get('config', 'register_policy')) !== Register::CLOSED,
+                       'metadata'          => [
+                               'nodeName' => $config->get('config', 'sitename'),
+                       ],
+               ];
+
+               if (!empty($config->get('system', 'diaspora_enabled'))) {
+                       $nodeinfo['protocols']['inbound'][] = 'diaspora';
+                       $nodeinfo['protocols']['outbound'][] = 'diaspora';
+               }
+
+               if (empty($config->get('system', 'ostatus_disabled'))) {
+                       $nodeinfo['protocols']['inbound'][] = 'gnusocial';
+                       $nodeinfo['protocols']['outbound'][] = 'gnusocial';
+               }
+
+               if (!empty($config->get('system', 'nodeinfo'))) {
+
+                       $nodeinfo['usage']['users'] = [
+                               'total'          => intval($config->get('nodeinfo', 'total_users')),
+                               'activeHalfyear' => intval($config->get('nodeinfo', 'active_users_halfyear')),
+                               'activeMonth'    => intval($config->get('nodeinfo', 'active_users_monthly'))
+                       ];
+                       $nodeinfo['usage']['localPosts'] = intval($config->get('nodeinfo', 'local_posts'));
+                       $nodeinfo['usage']['localComments'] = intval($config->get('nodeinfo', 'local_comments'));
+
+                       if (Addon::isEnabled('blogger')) {
+                               $nodeinfo['services']['outbound'][] = 'blogger';
+                       }
+                       if (Addon::isEnabled('dwpost')) {
+                               $nodeinfo['services']['outbound'][] = 'dreamwidth';
+                       }
+                       if (Addon::isEnabled('statusnet')) {
+                               $nodeinfo['services']['inbound'][] = 'gnusocial';
+                               $nodeinfo['services']['outbound'][] = 'gnusocial';
+                       }
+                       if (Addon::isEnabled('ijpost')) {
+                               $nodeinfo['services']['outbound'][] = 'insanejournal';
+                       }
+                       if (Addon::isEnabled('libertree')) {
+                               $nodeinfo['services']['outbound'][] = 'libertree';
+                       }
+                       if (Addon::isEnabled('buffer')) {
+                               $nodeinfo['services']['outbound'][] = 'linkedin';
+                       }
+                       if (Addon::isEnabled('ljpost')) {
+                               $nodeinfo['services']['outbound'][] = 'livejournal';
+                       }
+                       if (Addon::isEnabled('buffer')) {
+                               $nodeinfo['services']['outbound'][] = 'pinterest';
+                       }
+                       if (Addon::isEnabled('posterous')) {
+                               $nodeinfo['services']['outbound'][] = 'posterous';
+                       }
+                       if (Addon::isEnabled('pumpio')) {
+                               $nodeinfo['services']['inbound'][] = 'pumpio';
+                               $nodeinfo['services']['outbound'][] = 'pumpio';
+                       }
+
+                       if ($smtp) {
+                               $nodeinfo['services']['outbound'][] = 'smtp';
+                       }
+                       if (Addon::isEnabled('tumblr')) {
+                               $nodeinfo['services']['outbound'][] = 'tumblr';
+                       }
+                       if (Addon::isEnabled('twitter') || Addon::isEnabled('buffer')) {
+                               $nodeinfo['services']['outbound'][] = 'twitter';
+                       }
+                       if (Addon::isEnabled('wppost')) {
+                               $nodeinfo['services']['outbound'][] = 'wordpress';
+                       }
+                       $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols'];
+                       $nodeinfo['metadata']['protocols']['outbound'][] = 'atom1.0';
+                       $nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0';
+                       $nodeinfo['metadata']['protocols']['inbound'][] = 'rss2.0';
+
+                       $nodeinfo['metadata']['services'] = $nodeinfo['services'];
+
+                       if (Addon::isEnabled('twitter')) {
+                               $nodeinfo['metadata']['services']['inbound'][] = 'twitter';
+                       }
+
+                       $nodeinfo['metadata']['explicitContent'] = $config->get('system', 'explicit_content', false) == true;
+               }
+
+               header('Content-type: application/json; charset=utf-8');
+               echo json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+               exit;
+       }
+}
index d0f417f4ffd0c530f561f61f63c89c0df9231e07..2618541ddbda0d757f1dc270e2dc4f2f1273c62d 100644 (file)
@@ -16,6 +16,7 @@ use Friendica\Database\DBA;
 use Friendica\Database\PostUpdate;
 use Friendica\Model\Contact;
 use Friendica\Model\GContact;
+use Friendica\Model\Nodeinfo;
 use Friendica\Model\Photo;
 use Friendica\Model\User;
 use Friendica\Network\Probe;
@@ -43,7 +44,7 @@ class CronJobs
                                break;
 
                        case 'nodeinfo':
-                               nodeinfo_cron();
+                               Nodeinfo::update();
                                break;
 
                        case 'expire_and_remove_users':