]> git.mxchange.org Git - friendica.git/blob - src/App/Mode.php
2a6722643eb9cd9cc1b10a6e398182eb39c51fee
[friendica.git] / src / App / Mode.php
1 <?php
2
3 namespace Friendica\App;
4
5 use Friendica\Core\Config\Cache\ConfigCache;
6 use Friendica\Database\Database;
7 use Friendica\Util\BasePath;
8
9 /**
10  * Mode of the current Friendica Node
11  *
12  * @package Friendica\App
13  */
14 class Mode
15 {
16         const LOCALCONFIGPRESENT  = 1;
17         const DBAVAILABLE         = 2;
18         const DBCONFIGAVAILABLE   = 4;
19         const MAINTENANCEDISABLED = 8;
20
21         /***
22          * @var int The mode of this Application
23          *
24          */
25         private $mode;
26
27         /**
28          * @var bool True, if the call is a backend call
29          */
30         private $isBackend;
31
32         public function __construct(int $mode = 0, bool $isBackend = false)
33         {
34                 $this->mode      = $mode;
35                 $this->isBackend = $isBackend;
36         }
37
38         /**
39          * Sets the App mode
40          *
41          * - App::MODE_INSTALL    : Either the database connection can't be established or the config table doesn't exist
42          * - App::MODE_MAINTENANCE: The maintenance mode has been set
43          * - App::MODE_NORMAL     : Normal run with all features enabled
44          *
45          * @return Mode returns the determined mode
46          *
47          * @throws \Exception
48          */
49         public function determine(BasePath $basepath, Database $database, ConfigCache $configCache)
50         {
51                 $mode = 0;
52
53                 $basepathName = $basepath->getPath();
54
55                 if (!file_exists($basepathName . '/config/local.config.php')
56                     && !file_exists($basepathName . '/config/local.ini.php')
57                     && !file_exists($basepathName . '/.htconfig.php')) {
58                         return new Mode($mode);
59                 }
60
61                 $mode |= Mode::LOCALCONFIGPRESENT;
62
63                 if (!$database->connected()) {
64                         return new Mode($mode);
65                 }
66
67                 $mode |= Mode::DBAVAILABLE;
68
69                 if ($database->fetchFirst("SHOW TABLES LIKE 'config'") === false) {
70                         return new Mode($mode);
71                 }
72
73                 $mode |= Mode::DBCONFIGAVAILABLE;
74
75                 if (!empty($configCache->get('system', 'maintenance')) ||
76                     // Don't use Config or Configuration here because we're possibly BEFORE initializing the Configuration,
77                     // so this could lead to a dependency circle
78                     !empty($database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])['v'])) {
79                         return new Mode($mode);
80                 }
81
82                 $mode |= Mode::MAINTENANCEDISABLED;
83
84                 return new Mode($mode, $this->isBackend);
85         }
86
87         /**
88          * Checks if the site is called via a backend process
89          *
90          * @param Module $module The pre-loaded module (just name, not class!)
91          * @param array $server The $_SERVER variable
92          *
93          * @return Mode returns the determined mode
94          */
95         public function determineBackend(Module $module, array $server)
96         {
97                 $isBackend = basename(($server['PHP_SELF'] ?? ''), '.php') !== 'index' ||
98                              $module->isBackend();
99
100                 return new Mode($this->mode, $isBackend);
101         }
102
103         /**
104          * Checks, if the Friendica Node has the given mode
105          *
106          * @param int $mode A mode to test
107          *
108          * @return bool returns true, if the mode is set
109          */
110         public function has($mode)
111         {
112                 return ($this->mode & $mode) > 0;
113         }
114
115
116         /**
117          * Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
118          *
119          * @return bool
120          */
121         public function isInstall()
122         {
123                 return !$this->has(Mode::LOCALCONFIGPRESENT) ||
124                        !$this->has(MODE::DBCONFIGAVAILABLE);
125         }
126
127         /**
128          * Normal mode is when the local config file is set, the DB schema is installed and the maintenance mode is off.
129          *
130          * @return bool
131          */
132         public function isNormal()
133         {
134                 return $this->has(Mode::LOCALCONFIGPRESENT) &&
135                        $this->has(Mode::DBAVAILABLE) &&
136                        $this->has(Mode::DBCONFIGAVAILABLE) &&
137                        $this->has(Mode::MAINTENANCEDISABLED);
138         }
139
140         /**
141          * Returns true, if the call is from a backend node (f.e. from a worker)
142          *
143          * @return bool Is it a backend call
144          */
145         public function isBackend()
146         {
147                 return $this->isBackend;
148         }
149 }