247 lines
5.8 KiB
PHP
247 lines
5.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2024 Sascha Nitsch (grumpydeveloper) https://contentnation.net/@grumpydevelop
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* @author Author: Sascha Nitsch (grumpydeveloper)
|
|
**/
|
|
|
|
namespace Federator;
|
|
|
|
/**
|
|
* Base class for Api and related classes
|
|
* @author Sascha Nitsch
|
|
*/
|
|
class Main
|
|
{
|
|
/**
|
|
* cache instance
|
|
*
|
|
* @var Cache\Cache $cache
|
|
*/
|
|
protected $cache;
|
|
/**
|
|
* current config
|
|
*
|
|
* @var array<string,mixed> $config
|
|
*/
|
|
protected $config;
|
|
/**
|
|
* remote connector
|
|
*
|
|
* @var Connector\Connector $connector
|
|
*/
|
|
protected $connector = null;
|
|
/**
|
|
* response content type
|
|
*
|
|
* @var string $contentType
|
|
*/
|
|
protected $contentType = "text/html";
|
|
/**
|
|
* database instance
|
|
*
|
|
* @var \Mysqli $dbh
|
|
*/
|
|
protected $dbh;
|
|
/**
|
|
* extra headers
|
|
*
|
|
* @var array<string,string> $headers
|
|
*/
|
|
protected $headers = [];
|
|
/**
|
|
* languange instance
|
|
*
|
|
* @var Language $lang
|
|
*/
|
|
protected $lang = null;
|
|
/**
|
|
* redirect URL
|
|
*
|
|
* @var ?string $redirect
|
|
*/
|
|
protected $redirect = null;
|
|
/**
|
|
* response code
|
|
*
|
|
* @var int $responseCode
|
|
*/
|
|
protected $responseCode = 200;
|
|
/**
|
|
* smarty instance
|
|
*
|
|
* @var \Smarty\Smarty|null $smarty
|
|
*/
|
|
protected $smarty;
|
|
|
|
/**
|
|
* constructor
|
|
*
|
|
* @param string $rootDir root directory
|
|
*/
|
|
public function __construct($rootDir = '../')
|
|
{
|
|
$this->responseCode = 200;
|
|
$config = parse_ini_file($rootDir . 'config.ini', true);
|
|
if ($config !== false) {
|
|
$this->config = $config;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* do a remote call and return results
|
|
* @param string $remoteURL remote URL
|
|
* @param string[]|null $headers optional headers to send
|
|
* @return array{string, mixed} response and status information
|
|
*/
|
|
public static function getFromRemote(string $remoteURL, $headers)
|
|
{
|
|
$ch = curl_init();
|
|
if ($ch === false) {
|
|
return ['', null];
|
|
}
|
|
curl_setopt($ch, CURLOPT_URL, $remoteURL);
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
if ($headers !== null) {
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
}
|
|
curl_setopt($ch, CURLOPT_VERBOSE, true);
|
|
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
|
|
$ret = curl_exec($ch);
|
|
$info = curl_getinfo($ch);
|
|
curl_close($ch);
|
|
return [$ret, $info];
|
|
}
|
|
|
|
/**
|
|
* get config
|
|
* @return Array<String, Mixed>
|
|
*/
|
|
public function getConfig()
|
|
{
|
|
return $this->config;
|
|
}
|
|
|
|
/**
|
|
* get database handle
|
|
*
|
|
* @return \mysqli|false database handle
|
|
*/
|
|
public function getDatabase()
|
|
{
|
|
return $this->dbh;
|
|
}
|
|
|
|
/**
|
|
* load plugins
|
|
*/
|
|
public function loadPlugins() : void
|
|
{
|
|
if (array_key_exists('plugins', $this->config)) {
|
|
$plugins = $this->config['plugins'];
|
|
foreach ($plugins as $name => $file) {
|
|
require_once($file);
|
|
$fktn = 'Federator\\' . $name . '_load';
|
|
if (function_exists($fktn)) {
|
|
$fktn($this);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* open database
|
|
*
|
|
* @param string|null $usernameOverride optional username override
|
|
* @param string|null $passwordOverride optional password override
|
|
* @return void
|
|
*/
|
|
public function openDatabase($usernameOverride = null, $passwordOverride = null)
|
|
{
|
|
$dbconf = $this->config["database"];
|
|
$this->dbh = new \mysqli(
|
|
$dbconf['host'],
|
|
$usernameOverride ?? (string)$dbconf['username'],
|
|
$passwordOverride ?? (string)$dbconf['password'],
|
|
$dbconf['database']
|
|
);
|
|
if ($this->dbh->connect_error !== null) {
|
|
http_response_code(500);
|
|
die('Database Connect Error');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* set cache
|
|
*/
|
|
public function setCache(Cache\Cache $cache) : void
|
|
{
|
|
$this->cache = $cache;
|
|
}
|
|
|
|
/**
|
|
* set connector
|
|
*/
|
|
public function setConnector(Connector\Connector $connector) : void
|
|
{
|
|
$this->connector = $connector;
|
|
}
|
|
|
|
/**
|
|
* set response code
|
|
*
|
|
* @param int $code
|
|
* new response code
|
|
*/
|
|
public function setResponseCode(int $code) : void
|
|
{
|
|
$this->responseCode = $code;
|
|
}
|
|
|
|
/**
|
|
* translate given group and key using given language
|
|
*
|
|
* @param ?string $lang
|
|
* language to use
|
|
* @param string $group
|
|
* language group to use
|
|
* @param string $key
|
|
* language key to use
|
|
* @param mixed[] $parameters
|
|
* optional parameters
|
|
* @return string translation
|
|
*/
|
|
public function translate(?string $lang, string $group, string $key, array $parameters = array()) : string
|
|
{
|
|
if ($this->lang === null) {
|
|
$this->validLanguage($lang);
|
|
}
|
|
if ($this->lang !== null) {
|
|
if ($this->lang->getLang() !== $lang) {
|
|
$l = new Language($lang);
|
|
return $l->printlang($group, $key, $parameters);
|
|
}
|
|
return $this->lang->printlang($group, $key, $parameters);
|
|
} else {
|
|
return $key;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* check if language is valid by loading it
|
|
*
|
|
* @param ?string $lang
|
|
*/
|
|
public function validLanguage(?string $lang) : bool
|
|
{
|
|
$language = new Language($lang);
|
|
if ($language->getLang() === $lang) {
|
|
$this->lang = $language;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|