feat: replace exploded base_* with public_url
Fixes #1574 BREAKING CHANGE: The `general` section in the config schema has changed: the `general.base_*`, `general.protocol` and `general.force_ssl` configuration fields have been replaced with a single `general.public_url` field. Be sure to use a valid url with the new configuration field.
This commit is contained in:
parent
d020fbd983
commit
751d430bcc
|
@ -11,10 +11,8 @@ def config_filepath(tmp_path: Path):
|
||||||
filepath.write_text(
|
filepath.write_text(
|
||||||
"""
|
"""
|
||||||
[general]
|
[general]
|
||||||
|
public_url = http://localhost/test
|
||||||
api_key = TEST_KEY
|
api_key = TEST_KEY
|
||||||
base_dir = /test
|
|
||||||
base_port = 80
|
|
||||||
base_url = localhost
|
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
return filepath
|
return filepath
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
os.environ.setdefault("LIBRETIME_DEBUG", "true")
|
os.environ.setdefault("LIBRETIME_DEBUG", "true")
|
||||||
|
os.environ.setdefault("LIBRETIME_GENERAL_PUBLIC_URL", "http://localhost")
|
||||||
os.environ.setdefault("LIBRETIME_GENERAL_API_KEY", "testing")
|
os.environ.setdefault("LIBRETIME_GENERAL_API_KEY", "testing")
|
||||||
|
|
||||||
# pylint: disable=wrong-import-position,unused-import
|
# pylint: disable=wrong-import-position,unused-import
|
||||||
|
|
|
@ -11,21 +11,11 @@ The `general` section configure anything related to the legacy and API services.
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
[general]
|
[general]
|
||||||
# The internal API authentication key, this field is required
|
# The public url. This field is REQUIRED
|
||||||
|
public_url = https://example.com
|
||||||
|
# The internal API authentication key, this field is REQUIRED
|
||||||
api_key = some_random_generated_secret!
|
api_key = some_random_generated_secret!
|
||||||
|
|
||||||
# The public url scheme
|
|
||||||
# Mutually exclusive with force_ssl
|
|
||||||
protocol =
|
|
||||||
# The public url hostname, default is localhost
|
|
||||||
base_url = localhost
|
|
||||||
# The public url port
|
|
||||||
base_port =
|
|
||||||
# The public url base path, default is /
|
|
||||||
base_dir = /
|
|
||||||
# Force https for generated urls, default is false
|
|
||||||
force_ssl = false
|
|
||||||
|
|
||||||
# How many hours ahead Playout should cache scheduled media files, default is 1
|
# How many hours ahead Playout should cache scheduled media files, default is 1
|
||||||
cache_ahead_hours = 1
|
cache_ahead_hours = 1
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,14 @@ sudo apt purge \
|
||||||
uwsgi-plugin-python3
|
uwsgi-plugin-python3
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### New configuration schema
|
||||||
|
|
||||||
|
The configuration schema was updated.
|
||||||
|
|
||||||
|
The `general` section has been changed:
|
||||||
|
|
||||||
|
- the `general.protocol`, `general.base_url`, `general.base_port`, `general.base_dir` and `general.force_ssl` entries were replaced with a single `general.public_url` entry, be sure to use a valid url with the new configuration entry.
|
||||||
|
|
||||||
## :warning: Known issues
|
## :warning: Known issues
|
||||||
|
|
||||||
The following issues may need a workaround for the time being. Please search the [issues](https://github.com/libretime/libretime/issues) before reporting problems not listed below.
|
The following issues may need a workaround for the time being. Please search the [issues](https://github.com/libretime/libretime/issues) before reporting problems not listed below.
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use League\Uri\Uri;
|
||||||
|
|
||||||
class Application_Common_HTTPHelper
|
class Application_Common_HTTPHelper
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -30,11 +32,16 @@ class Application_Common_HTTPHelper
|
||||||
public static function getStationUrl($secured = true)
|
public static function getStationUrl($secured = true)
|
||||||
{
|
{
|
||||||
$CC_CONFIG = Config::getConfig();
|
$CC_CONFIG = Config::getConfig();
|
||||||
$baseUrl = $CC_CONFIG['baseUrl'];
|
|
||||||
$baseDir = $CC_CONFIG['baseDir'];
|
$url = Uri::createFromComponents(
|
||||||
$basePort = $CC_CONFIG['basePort'];
|
[
|
||||||
$forceSSL = $CC_CONFIG['forceSSL'];
|
'scheme' => $CC_CONFIG['protocol'],
|
||||||
$configProtocol = $CC_CONFIG['protocol'];
|
'host' => $CC_CONFIG['baseUrl'],
|
||||||
|
'port' => $CC_CONFIG['basePort'],
|
||||||
|
'path' => $CC_CONFIG['baseDir'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
if (empty($baseDir)) {
|
if (empty($baseDir)) {
|
||||||
$baseDir = '/';
|
$baseDir = '/';
|
||||||
}
|
}
|
||||||
|
@ -45,26 +52,7 @@ class Application_Common_HTTPHelper
|
||||||
$baseDir = $baseDir . '/';
|
$baseDir = $baseDir . '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set in reverse order of preference. ForceSSL configuration takes absolute preference, then
|
return rtrim($url, '/') . '/';
|
||||||
// the protocol set in config. If neither are set, the port is used to determine the scheme
|
|
||||||
$scheme = 'http';
|
|
||||||
if ($secured && $basePort == '443') {
|
|
||||||
$scheme = 'https';
|
|
||||||
}
|
|
||||||
if (!empty($configProtocol)) {
|
|
||||||
$scheme = $configProtocol;
|
|
||||||
}
|
|
||||||
if ($forceSSL) {
|
|
||||||
$scheme = 'https';
|
|
||||||
}
|
|
||||||
|
|
||||||
$portStr = '';
|
|
||||||
if (($scheme == 'http' && $basePort !== '80')
|
|
||||||
|| ($scheme == 'https' && $basePort !== '443')) {
|
|
||||||
$portStr = ":{$basePort}";
|
|
||||||
}
|
|
||||||
|
|
||||||
return "{$scheme}://{$baseUrl}{$portStr}{$baseDir}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -114,7 +102,7 @@ class ZendActionHttpException extends Exception
|
||||||
Exception $previous = null
|
Exception $previous = null
|
||||||
) {
|
) {
|
||||||
Logging::error('Error in action ' . $action->getRequest()->getActionName()
|
Logging::error('Error in action ' . $action->getRequest()->getActionName()
|
||||||
. " with status code {$statusCode}: {$message}");
|
. " with status code {$statusCode}: {$message}");
|
||||||
$action->getResponse()
|
$action->getResponse()
|
||||||
->setHttpResponseCode($statusCode)
|
->setHttpResponseCode($statusCode)
|
||||||
->appendBody($message);
|
->appendBody($message);
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
// THIS FILE IS NOT MEANT FOR CUSTOMIZING.
|
// THIS FILE IS NOT MEANT FOR CUSTOMIZING.
|
||||||
|
use League\Uri\Contracts\UriException;
|
||||||
|
use League\Uri\Uri;
|
||||||
|
|
||||||
class Config
|
class Config
|
||||||
{
|
{
|
||||||
|
@ -17,12 +19,24 @@ class Config
|
||||||
// //////////////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////////////
|
||||||
$CC_CONFIG['apiKey'] = [$values['general']['api_key']];
|
$CC_CONFIG['apiKey'] = [$values['general']['api_key']];
|
||||||
|
|
||||||
// Base URL
|
// Explode public_url into multiple component with possible defaults for required fields
|
||||||
$CC_CONFIG['protocol'] = $values['general']['protocol'] ?? '';
|
try {
|
||||||
$CC_CONFIG['baseDir'] = $values['general']['base_dir'];
|
$public_url = Uri::createFromString($values['general']['public_url']);
|
||||||
$CC_CONFIG['baseUrl'] = $values['general']['base_url'];
|
} catch (UriException $e) {
|
||||||
$CC_CONFIG['basePort'] = $values['general']['base_port'];
|
echo 'could not parse configuration field general.public_url: ' . $e->getMessage();
|
||||||
$CC_CONFIG['forceSSL'] = Config::isYesValue($values['general']['force_ssl'] ?? false);
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scheme = $public_url->getScheme() ?? 'http';
|
||||||
|
$host = $public_url->getHost() ?? 'localhost';
|
||||||
|
$port = $public_url->getPort() ?? ($scheme == 'https' ? 443 : 80);
|
||||||
|
$path = rtrim($public_url->getPath() ?? '', '/') . '/'; // Path requires a trailing slash
|
||||||
|
|
||||||
|
$CC_CONFIG['protocol'] = $scheme;
|
||||||
|
$CC_CONFIG['baseUrl'] = $host;
|
||||||
|
$CC_CONFIG['basePort'] = $port;
|
||||||
|
$CC_CONFIG['baseDir'] = $path;
|
||||||
|
|
||||||
$CC_CONFIG['dev_env'] = $values['general']['dev_env'] ?? 'production';
|
$CC_CONFIG['dev_env'] = $values['general']['dev_env'] ?? 'production';
|
||||||
$CC_CONFIG['auth'] = $values['general']['auth'] ?? 'local';
|
$CC_CONFIG['auth'] = $values['general']['auth'] ?? 'local';
|
||||||
|
|
|
@ -3,52 +3,40 @@
|
||||||
|
|
||||||
<form action="#" role="form" id="generalSettingsForm">
|
<form action="#" role="form" id="generalSettingsForm">
|
||||||
<h3 class="form-title">General Settings</h3>
|
<h3 class="form-title">General Settings</h3>
|
||||||
<p>
|
|
||||||
These values are automatically pulled from your webserver settings, under most circumstances you will not need to change them.
|
|
||||||
</p>
|
|
||||||
<span id="helpBlock" class="help-block help-message"></span>
|
<span id="helpBlock" class="help-block help-message"></span>
|
||||||
<div id="generalFormBody">
|
<div id="generalFormBody">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label" for="generalHost">Webserver Host</label>
|
<label class="control-label" for="publicUrl">Public URL</label>
|
||||||
<input required class="form-control" type="text" name="generalHost" id="generalHost" placeholder="Host" value="<?php echo $_SERVER['SERVER_NAME']; ?>"/>
|
<input required class="form-control" type="text" name="publicUrl" id="publicUrl" placeholder="https://example.com/" />
|
||||||
<span class="glyphicon glyphicon-remove form-control-feedback"></span>
|
<span class="glyphicon glyphicon-remove form-control-feedback"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<input class="form-control" type="hidden" name="generalErr" id="generalErr" aria-describedby="helpBlock" />
|
||||||
<label class="control-label" for="generalPort">Webserver Port</label>
|
<hr />
|
||||||
<input required class="form-control" type="text" name="generalPort" id="generalPort" placeholder="Port" value="<?php echo $_SERVER['SERVER_PORT']; ?>"/>
|
<p>
|
||||||
<span class="glyphicon glyphicon-remove form-control-feedback"></span>
|
The CORS URL can be setup during install if you are accessing your LibreTime instance behind a Proxy.
|
||||||
</div>
|
|
||||||
<input class="form-control" type="hidden" name="generalErr" id="generalErr" aria-describedby="helpBlock"/>
|
|
||||||
<p>The CORS URL can be setup during install if you are accessing your LibreTime instance behind a Proxy.
|
|
||||||
This is common with docker setups. If you have a reverse proxy setup enter the URL below, otherwise you
|
This is common with docker setups. If you have a reverse proxy setup enter the URL below, otherwise you
|
||||||
can safely ignore this. Please enter one URL per line. Include the entire URL such as http://example.com
|
can safely ignore this. Please enter one URL per line. Include the entire URL such as http://example.com
|
||||||
If you are reinstalling LibreTime on an existing setup you can ignore this as well,
|
If you are reinstalling LibreTime on an existing setup you can ignore this as well,
|
||||||
the settings in your existing database will be retained unless you enter new values below.
|
the settings in your existing database will be retained unless you enter new values below.
|
||||||
</p>
|
</p>
|
||||||
<div id="corsSlideToggle">
|
|
||||||
<span><strong>CORS URL </strong></span><span id="corsCaret" class="caret"></span><hr/>
|
|
||||||
</div>
|
|
||||||
<div id="corsFormBody">
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label" for="corsUrl">CORS URLs</label>
|
<label class="control-label" for="corsUrl">CORS URLs</label>
|
||||||
<textarea name="corsUrl" class="form-control" id="corsUrl" rows="4" cols="50"></textarea>
|
<textarea name="corsUrl" class="form-control" id="corsUrl" rows="4" cols="50"></textarea>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<input type="submit" formtarget="generalSettingsForm" class="btn btn-primary btn-next" value="Next ❱"/>
|
<input type="submit" formtarget="generalSettingsForm" class="btn btn-primary btn-next" value="Next ❱" />
|
||||||
<input type="button" class="btn btn-primary btn-back" value="❰ Back"/>
|
<input type="button" class="btn btn-primary btn-back" value="❰ Back" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
$("#publicUrl").val(function() {
|
||||||
|
return window.location.href;
|
||||||
|
});
|
||||||
$("#corsUrl").text(function() {
|
$("#corsUrl").text(function() {
|
||||||
return window.location.origin;
|
return window.location.origin;
|
||||||
});
|
});
|
||||||
$("#corsSlideToggle").click(function() {
|
|
||||||
$("#corsFormBody").slideToggle(500);
|
|
||||||
$("#corsCaret").toggleClass("caret-up");
|
|
||||||
});
|
|
||||||
$("#generalSettingsForm").submit(function(e) {
|
$("#generalSettingsForm").submit(function(e) {
|
||||||
submitForm(e, "GeneralSetup");
|
submitForm(e, "GeneralSetup");
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,24 +1,14 @@
|
||||||
# This is an example configuration file.
|
# See https://libretime.org/docs/setup/configuration
|
||||||
|
#
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# G E N E R A L S E T T I N G S
|
# G E N E R A L S E T T I N G S
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
[general]
|
[general]
|
||||||
# The internal API authentication key, this field is required
|
# The public url, this field is REQUIRED
|
||||||
|
public_url =
|
||||||
|
# The internal API authentication key, this field is REQUIRED
|
||||||
api_key =
|
api_key =
|
||||||
|
|
||||||
# The public url scheme
|
|
||||||
# Mutually exclusive with force_ssl
|
|
||||||
protocol = http
|
|
||||||
# The public url hostname, default is localhost
|
|
||||||
base_url = localhost
|
|
||||||
# The public url port
|
|
||||||
base_port = 80
|
|
||||||
# The public url base path, default is /
|
|
||||||
base_dir = /
|
|
||||||
# Force https for generated urls, default is false
|
|
||||||
force_ssl = false
|
|
||||||
|
|
||||||
# How many hours ahead Playout should cache scheduled media files, default is 1
|
# How many hours ahead Playout should cache scheduled media files, default is 1
|
||||||
cache_ahead_hours = 1
|
cache_ahead_hours = 1
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
"james-heinrich/getid3": "^1.9",
|
"james-heinrich/getid3": "^1.9",
|
||||||
"jooola/celery-php": "dev-master",
|
"jooola/celery-php": "dev-master",
|
||||||
"jooola/propel1": "dev-master",
|
"jooola/propel1": "dev-master",
|
||||||
|
"league/uri": "6.4.0",
|
||||||
"php-amqplib/php-amqplib": "^3.0",
|
"php-amqplib/php-amqplib": "^3.0",
|
||||||
"simplepie/simplepie": "^1.5",
|
"simplepie/simplepie": "^1.5",
|
||||||
"zf1s/zend-acl": "^1.13",
|
"zf1s/zend-acl": "^1.13",
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6ff6e427d89556d1633e2b49764de2c4",
|
"content-hash": "a7659135ed373ebf5f68c9de86891e0b",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "composer/semver",
|
"name": "composer/semver",
|
||||||
|
@ -305,6 +305,173 @@
|
||||||
},
|
},
|
||||||
"time": "2022-01-13T02:39:05+00:00"
|
"time": "2022-01-13T02:39:05+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "league/uri",
|
||||||
|
"version": "6.4.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/thephpleague/uri.git",
|
||||||
|
"reference": "09da64118eaf4c5d52f9923a1e6a5be1da52fd9a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/thephpleague/uri/zipball/09da64118eaf4c5d52f9923a1e6a5be1da52fd9a",
|
||||||
|
"reference": "09da64118eaf4c5d52f9923a1e6a5be1da52fd9a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"league/uri-interfaces": "^2.1",
|
||||||
|
"php": ">=7.2",
|
||||||
|
"psr/http-message": "^1.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"league/uri-schemes": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"friendsofphp/php-cs-fixer": "^2.16",
|
||||||
|
"phpstan/phpstan": "^0.12",
|
||||||
|
"phpstan/phpstan-phpunit": "^0.12",
|
||||||
|
"phpstan/phpstan-strict-rules": "^0.12",
|
||||||
|
"phpunit/phpunit": "^8.0 || ^9.0",
|
||||||
|
"psr/http-factory": "^1.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-fileinfo": "Needed to create Data URI from a filepath",
|
||||||
|
"ext-intl": "Needed to improve host validation",
|
||||||
|
"league/uri-components": "Needed to easily manipulate URI objects",
|
||||||
|
"psr/http-factory": "Needed to use the URI factory"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "6.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"League\\Uri\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Ignace Nyamagana Butera",
|
||||||
|
"email": "nyamsprod@gmail.com",
|
||||||
|
"homepage": "https://nyamsprod.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "URI manipulation library",
|
||||||
|
"homepage": "http://uri.thephpleague.com",
|
||||||
|
"keywords": [
|
||||||
|
"data-uri",
|
||||||
|
"file-uri",
|
||||||
|
"ftp",
|
||||||
|
"hostname",
|
||||||
|
"http",
|
||||||
|
"https",
|
||||||
|
"middleware",
|
||||||
|
"parse_str",
|
||||||
|
"parse_url",
|
||||||
|
"psr-7",
|
||||||
|
"query-string",
|
||||||
|
"querystring",
|
||||||
|
"rfc3986",
|
||||||
|
"rfc3987",
|
||||||
|
"rfc6570",
|
||||||
|
"uri",
|
||||||
|
"uri-template",
|
||||||
|
"url",
|
||||||
|
"ws"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"docs": "https://uri.thephpleague.com",
|
||||||
|
"forum": "https://thephpleague.slack.com",
|
||||||
|
"issues": "https://github.com/thephpleague/uri/issues",
|
||||||
|
"source": "https://github.com/thephpleague/uri/tree/6.4.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/sponsors/nyamsprod",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2020-11-22T14:29:11+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "league/uri-interfaces",
|
||||||
|
"version": "2.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/thephpleague/uri-interfaces.git",
|
||||||
|
"reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
|
||||||
|
"reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"php": "^7.2 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"friendsofphp/php-cs-fixer": "^2.19",
|
||||||
|
"phpstan/phpstan": "^0.12.90",
|
||||||
|
"phpstan/phpstan-phpunit": "^0.12.19",
|
||||||
|
"phpstan/phpstan-strict-rules": "^0.12.9",
|
||||||
|
"phpunit/phpunit": "^8.5.15 || ^9.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "to use the IDNA feature",
|
||||||
|
"symfony/intl": "to use the IDNA feature via Symfony Polyfill"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"League\\Uri\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Ignace Nyamagana Butera",
|
||||||
|
"email": "nyamsprod@gmail.com",
|
||||||
|
"homepage": "https://nyamsprod.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for URI representation",
|
||||||
|
"homepage": "http://github.com/thephpleague/uri-interfaces",
|
||||||
|
"keywords": [
|
||||||
|
"rfc3986",
|
||||||
|
"rfc3987",
|
||||||
|
"uri",
|
||||||
|
"url"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/thephpleague/uri-interfaces/issues",
|
||||||
|
"source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/sponsors/nyamsprod",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2021-06-28T04:27:21+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "paragonie/constant_time_encoding",
|
"name": "paragonie/constant_time_encoding",
|
||||||
"version": "v2.5.0",
|
"version": "v2.5.0",
|
||||||
|
@ -726,6 +893,59 @@
|
||||||
],
|
],
|
||||||
"time": "2022-01-30T08:50:05+00:00"
|
"time": "2022-01-30T08:50:05+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-message",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Http\\Message\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for HTTP messages",
|
||||||
|
"homepage": "https://github.com/php-fig/http-message",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"http-message",
|
||||||
|
"psr",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/php-fig/http-message/tree/master"
|
||||||
|
},
|
||||||
|
"time": "2016-08-06T14:39:51+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "simplepie/simplepie",
|
"name": "simplepie/simplepie",
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
|
|
|
@ -17,8 +17,7 @@ class GeneralSetup extends Setup
|
||||||
protected static $_properties;
|
protected static $_properties;
|
||||||
|
|
||||||
// Constant form field names for passing errors back to the front-end
|
// Constant form field names for passing errors back to the front-end
|
||||||
public const GENERAL_PORT = 'generalPort';
|
public const PUBLIC_URL = 'publicUrl';
|
||||||
public const GENERAL_HOST = 'generalHost';
|
|
||||||
public const CORS_URL = 'corsUrl';
|
public const CORS_URL = 'corsUrl';
|
||||||
|
|
||||||
public static $cors_url;
|
public static $cors_url;
|
||||||
|
@ -31,8 +30,7 @@ class GeneralSetup extends Setup
|
||||||
{
|
{
|
||||||
self::$_properties = [
|
self::$_properties = [
|
||||||
'api_key' => $this->generateRandomString(),
|
'api_key' => $this->generateRandomString(),
|
||||||
'base_url' => $settings[self::GENERAL_HOST],
|
'public_url' => $settings[self::PUBLIC_URL],
|
||||||
'base_port' => $settings[self::GENERAL_PORT],
|
|
||||||
'cors_url' => $settings[self::CORS_URL],
|
'cors_url' => $settings[self::CORS_URL],
|
||||||
];
|
];
|
||||||
self::$cors_url = $settings[self::CORS_URL];
|
self::$cors_url = $settings[self::CORS_URL];
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
[general]
|
||||||
|
dev_env = testing
|
||||||
|
public_url = http://localhost
|
||||||
|
api_key = H2NRICX6CM8F50CU123C
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
host = localhost
|
host = localhost
|
||||||
port = 5432
|
port = 5432
|
||||||
|
@ -11,33 +16,3 @@ port = 5672
|
||||||
user = airtime_tests
|
user = airtime_tests
|
||||||
password = airtime_tests
|
password = airtime_tests
|
||||||
vhost = /airtime_tests
|
vhost = /airtime_tests
|
||||||
|
|
||||||
[general]
|
|
||||||
dev_env = testing
|
|
||||||
api_key = H2NRICX6CM8F50CU123C
|
|
||||||
airtime_dir = /usr/share/airtime
|
|
||||||
base_url = localhost
|
|
||||||
base_port = 80
|
|
||||||
base_dir = /
|
|
||||||
cache_ahead_hours = 1
|
|
||||||
station_id = teststation
|
|
||||||
|
|
||||||
[current_backend]
|
|
||||||
storage_backend=file
|
|
||||||
|
|
||||||
[monit]
|
|
||||||
monit_user = guest
|
|
||||||
monit_password = airtime
|
|
||||||
|
|
||||||
[ldap]
|
|
||||||
hostname = ldap.example.org
|
|
||||||
binddn = 'uid=libretime,cn=sysaccounts,cn=etc,dc=int,dc=example,dc=org'
|
|
||||||
password = hackme
|
|
||||||
account_domain = INT.EXAMPLE.ORG
|
|
||||||
basedn = 'cn=users,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
filter_field = uid
|
|
||||||
groupmap_guest = 'cn=guest,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
groupmap_host = 'cn=host,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
groupmap_program_manager = 'cn=program_manager,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
groupmap_admin = 'cn=admins,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
groupmap_superadmin = 'cn=superadmin,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
|
|
||||||
|
|
|
@ -3,12 +3,11 @@ from configparser import ConfigParser
|
||||||
from os import environ
|
from os import environ
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, Optional, Union
|
from typing import Any, Dict, Optional, Union
|
||||||
from urllib.parse import urlunsplit
|
|
||||||
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
# pylint: disable=no-name-in-module
|
# pylint: disable=no-name-in-module
|
||||||
from pydantic import BaseModel, ValidationError
|
from pydantic import AnyHttpUrl, BaseModel, ValidationError
|
||||||
from pydantic.fields import ModelField
|
from pydantic.fields import ModelField
|
||||||
from pydantic.utils import deep_update
|
from pydantic.utils import deep_update
|
||||||
from yaml import YAMLError, safe_load
|
from yaml import YAMLError, safe_load
|
||||||
|
@ -108,26 +107,9 @@ class BaseConfig(BaseModel):
|
||||||
|
|
||||||
# pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
class GeneralConfig(BaseModel):
|
class GeneralConfig(BaseModel):
|
||||||
|
public_url: AnyHttpUrl
|
||||||
api_key: str
|
api_key: str
|
||||||
|
|
||||||
protocol: str = "http"
|
|
||||||
base_url: str = "localhost"
|
|
||||||
base_port: Optional[int]
|
|
||||||
base_dir: str = "/"
|
|
||||||
force_ssl: bool = False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def public_url(self) -> str:
|
|
||||||
scheme = "https" if self.force_ssl else self.protocol
|
|
||||||
|
|
||||||
location = self.base_url
|
|
||||||
if self.base_port is not None:
|
|
||||||
location += f":{self.base_port}"
|
|
||||||
|
|
||||||
path = self.base_dir.rstrip("/")
|
|
||||||
|
|
||||||
return urlunsplit((scheme, location, path, None, None))
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
class DatabaseConfig(BaseModel):
|
class DatabaseConfig(BaseModel):
|
||||||
|
|
Loading…
Reference in New Issue