Skip to content

2.1.2 beta.1 - Fixes #1884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 41 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
6978a53
Consistent start and stop message output
Lord-Grey Jun 14, 2025
b008bdb
Fix: UI - Language is not selectable (#1877)
Lord-Grey Jun 15, 2025
05df1f1
Version rollover
Lord-Grey Jun 15, 2025
0af74fe
Updating the Finish Page in the Inno Setup Installer
Paulchen-Panther Jun 17, 2025
c1a8008
Added locales to docker run
Paulchen-Panther Jun 17, 2025
99eb28e
Added locales to docker compile
Lord-Grey Jun 21, 2025
6635a59
Change "C" locale to "C.UFT-8" locale in executables
Lord-Grey Jun 21, 2025
010bb93
Removed the ability to revoke API requests which are not issued from …
Lord-Grey Jun 21, 2025
88952ba
Fix - CEC-Handler is not stopped properly
Lord-Grey Jun 22, 2025
9ab1032
Qt-Grabber (Windows) does not apply pixel ratio (#1882) - _Thanks to …
Lord-Grey Jun 23, 2025
38761f6
Add additional error handling to resolving IP adressess
Lord-Grey Jun 27, 2025
850e22e
Fiu: LED-devices are not retrying to establish connectivity, if suppo…
Lord-Grey Jun 29, 2025
cdb18f6
Fix: LED-devices are resolving IP-addresses for API and UDP two times…
Lord-Grey Jun 29, 2025
b990b28
Fix Code-QL Findings
Lord-Grey Jun 29, 2025
b64ef8a
Fix LED-Device open return code handling
Lord-Grey Jun 29, 2025
43ef07f
Fix: LED-devices are not retrying to establish connectivity, if suppo…
Lord-Grey Jun 29, 2025
28271ce
Fix mDNS Retry handling for UDPRAW & UDPDDP
Lord-Grey Jul 1, 2025
c119e38
Fixes Phillips Hue LED initialization did not return success with pro…
Lord-Grey Jul 1, 2025
e0b712d
pass context (JsonAPI) to connect() (EventHandler) to auto disconnect…
Paulchen-Panther Jul 7, 2025
18517d6
Safari improvments
Paulchen-Panther Jul 8, 2025
d6f4c9f
Memory tracker - Fix deleter for non tracking scenario
Lord-Grey Jul 27, 2025
e93b380
Windows - Log to Debug Output window
Lord-Grey Jul 27, 2025
9ad74f7
Merge branch '2.1.2-beta.1' of https://github.com/Lord-Grey/hyperion.…
Lord-Grey Jul 27, 2025
a122682
CaptureCont properly disconnect
Lord-Grey Jul 27, 2025
4bc7e15
Show Tracked memory sceanrio before executing deletes
Lord-Grey Jul 27, 2025
c64bf15
CaptureCont Move timeer to a start functiopn
Lord-Grey Jul 27, 2025
1637a7e
Destructor Logging
Lord-Grey Jul 27, 2025
b870fbe
Consolidate Memory tracker
Lord-Grey Jul 29, 2025
ed26ea6
Update LOG type enum avoiding conflict with Windows macros
Lord-Grey Jul 29, 2025
0f87463
Correct SmartPointers around Hyperion to ensure proper ownership
Lord-Grey Jul 29, 2025
5f319c1
Editorial changes
Lord-Grey Jul 29, 2025
52c75ef
Correct Logger
Lord-Grey Jul 30, 2025
1bcf974
Updates and corrections
Lord-Grey Jul 30, 2025
89543f1
Track threads
Lord-Grey Jul 31, 2025
5edc20e
Decouple Hyperion references
Lord-Grey Jul 31, 2025
6d00ae5
CodeQL finding
Lord-Grey Jul 31, 2025
129c309
CodeQL findings
Lord-Grey Jul 31, 2025
f958bbd
Fix - Disabled SmoothingUpdates
Lord-Grey Jul 31, 2025
896a41d
Clean-up
Lord-Grey Jul 31, 2025
4dbbe52
Add resilliancy, if componentRegister has been destroyed
Lord-Grey Jul 31, 2025
bfb75cd
Fix setSubscriptionsTo to Instance
Lord-Grey Jul 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/debian.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ jobs:
-v "${{ github.workspace }}:/source:rw" \
-v "/tmp/deps:/tmp/deps:rw" \
-w "/source" \
-e LANG="C.UTF-8" \
-e LC_ALL="C.UTF-8" \
ghcr.io/hyperion-project/debian:${{ env.DOCKER_TAG }} \
/bin/bash -c "cmake --preset linux-${{ env.BUILD_TYPE }} ${{ steps.dependencies.outputs.cmakeArgs }} -DPLATFORM=${{ matrix.os.platform }} ${{ env.CPACK_SYSTEM_PROCESSOR }} &&
cmake --build --preset linux-${{ env.BUILD_TYPE }} --target package &&
Expand Down
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.1.1
2.1.2-beta.1
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### 🔧 Changed

- **Fixes:**
- UI - Language is not selectable (#1877)
- CEC-Handler is not stopped properly
- Qt-Grabber (Windows) does not apply pixel ratio (#1882) - _Thanks to @SolberLight_

---

### 🗑️ Removed

- Removed the ability to revoke API requests which are not issued from the same network segment. This includes the removal of IP-address white- & blacklisting (#1880)
Rationale: Such kind of functionality is better to be dealt with via proper network management and setup, e.g. via firewalls, VLANs.

## [2.1.1](https://github.com/hyperion-project/hyperion.ng/compare/2.1.1...HEAD) - 2025-06-14

### 🔧 Changed
Expand Down
30 changes: 22 additions & 8 deletions assets/webconfig/js/content_index.js
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,28 @@ $(window.hyperion).on("cmd-config-setconfig", function (event) {

function bindUiHandlers() {

// Side menu link click activation
// Handle language selection

// Prevent dropdown from closing when selecting language
$('#btn_setlang').on('click', function (e) {
e.stopPropagation();
});

$('#language-select').on('changed.bs.select', function () {
const newLang = $(this).val();
if (newLang !== storedLang) {
setStorage("langcode", newLang);
location.reload();
}
});

//Close selector, if open (and no change in language happend)
$(document).on("click", function () {
$(".bootstrap-select.open").removeClass("open");
});
//End language selection

// Side smenu link click activation
$('#side-menu li a, #side-menu li ul li a').on("click", function () {
$('#side-menu').find('.active').removeClass('active');
$(this).addClass('active');
Expand Down Expand Up @@ -476,13 +497,6 @@ function bindUiHandlers() {
logo.style.display = window.scrollY > 65 ? "none" : "";
}, { passive: true });

// Language selector
$(".langSelect").off().on("click", function () {
const newLang = $(this).attr("id").replace("lang_", "");
setStorage("lang", newLang);
location.reload();
});

// Toggle top menu for mobile
$(".navbar-toggle").off().on("click", function () {
const target = $(this).data("target");
Expand Down
11 changes: 3 additions & 8 deletions assets/webconfig/js/content_network.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,16 +266,11 @@ $(document).ready(function () {
$("#conf_cont_tok").insertAfter("#conf_cont_network");

// Initial state check based on server config
checkApiTokenState(window.serverConfig.network.internetAccessAPI || window.serverConfig.network.localApiAuth || storedAccess === 'expert');

// Listen for changes on the Internet access API Auth toggle
$('#root_network_internetAccessAPI').on("change", function () {
checkApiTokenState($(this).is(":checked") || $('#root_network_localApiAuth').is(":checked"));
});
checkApiTokenState(window.serverConfig.network.localApiAuth || storedAccess === 'expert');

// Listen for changes on the local API Auth toggle
$('#root_network_localApiAuth').on("change", function () {
checkApiTokenState($(this).is(":checked") || $('#root_network_internetAccessAPI').is(":checked"));
checkApiTokenState($(this).is(":checked"));
});

$('#btn_create_tok').off().on('click', function () {
Expand Down Expand Up @@ -317,7 +312,7 @@ $(document).ready(function () {
}

function checkApiTokenState(state) {
if (!state) {
if (!state && storedAccess !== 'expert') {
$("#conf_cont_tok").hide();
} else {
$("#conf_cont_tok").show();
Expand Down
47 changes: 24 additions & 23 deletions assets/webconfig/js/ui_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,40 +188,41 @@
}

function initLanguageSelection() {
// Initialize language selection list with supported languages
const $select = $('#language-select');
$select.empty(); // clear existing options

for (let i = 0; i < availLang.length; i++) {
$("#language-select").append(
'<option value="' + i + '" selected="">' + availLangText[i] + '</option>'
);
$select.append('<option value="' + availLang[i] + '">' + availLangText[i] + '</option>');
}

let langLocale = storedLang;
let langText = '';
if (!langLocale) {
langLocale = navigator.language?.substring(0, 2) || 'en';
}

// Test if the language is supported by Hyperion
let langText = '';
let langIdx = availLang.indexOf(langLocale);
if (langIdx > -1) {
langText = availLangText[langIdx];
} else {
// If the language is not supported, try the fallback language

if (langIdx === -1) {
// Try fallback
langLocale = $.i18n().options.fallbackLocale.substring(0, 2);
langIdx = availLang.indexOf(langLocale);
if (langIdx > -1) {
langText = availLangText[langIdx];
} else {
// Default to English if fallback language is also unsupported
langLocale = 'en';
langIdx = availLang.indexOf(langLocale);
if (langIdx > -1) {
langText = availLangText[langIdx];
}
}
}

if (langIdx === -1) {
// Default to English
langLocale = 'en';
langIdx = availLang.indexOf(langLocale);
}

// Update the language select dropdown
$('#language-select').prop('title', langText);
$("#language-select").val(langIdx);
$("#language-select").selectpicker("refresh");
$select.val(langLocale);
$select.selectpicker({
container: 'body',
width: 'fit',
style: 'btn-transparent'
});
$select.selectpicker('refresh');
}

function updateUiOnInstance(inst) {
Expand Down
4 changes: 3 additions & 1 deletion bin/scripts/docker-compile.sh
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,9 @@ $DOCKER run --rm --platform=${PLATFORM_ARCHITECTURE} \
${ENTRYPOINT_OPTION} \
-v "${DEPLOY_PATH}:/deploy" \
-v "${CODE_PATH}/:/source:rw" \
${REGISTRY_URL}/${DISTRIBUTION}:${CODENAME} \
-e LANG="C.UTF-8" \
-e LC_ALL="C.UTF-8" \
"${REGISTRY_URL}/${DISTRIBUTION}:${CODENAME}" \
/bin/bash -c "mkdir -p /source/${BUILD_DIR} && cd /source/${BUILD_DIR} &&
cmake -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${PLATFORM} ${BUILD_ARGS} .. || exit 2 &&
cmake --build . ${PACKAGES} -- -j $(nproc) || exit 3 || : &&
Expand Down
27 changes: 27 additions & 0 deletions cmake/windows/inno/windows.iss.in
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ begin
PageDescriptionLabel.Visible := False;
PageNameLabel.Visible := False;
Bevel1.Visible := False;
RunList.Left := InnerNotebook.Left;

with WizardSmallBitmapImage do
begin
Expand All @@ -261,6 +262,32 @@ begin
Center := True;
Align := alClient;
end;

with FinishedLabel do
begin
Left := InnerNotebook.Left;
Width := InnerNotebook.Width;
end;

with FinishedHeadingLabel do
begin
Left := InnerNotebook.Left;
Width := InnerNotebook.Width;
Top := 0;
end;

with WizardBitmapImage2 do
begin
Parent := FinishedHeadingLabel;
Bitmap.AlphaFormat := afDefined;
Width := Parent.Width;
Height := Parent.Height;
AutoSize := True;
Stretch := False;
Center := True;
Align := alClient;
Bitmap := WizardSmallBitmapImage.Bitmap;
end;
end;
end;

Expand Down
1 change: 0 additions & 1 deletion include/cec/CECHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class CECHandler : public QObject
Q_OBJECT
public:
CECHandler(const QJsonDocument& config, QObject * parent = nullptr);
~CECHandler() override;

QString scan() const;

Expand Down
1 change: 1 addition & 0 deletions include/db/DBMigrationManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class DBMigrationManager : public DBManager
bool upgradeGlobalSettings_2_0_12(semver::version& currentVersion, QJsonObject& config);
bool upgradeGlobalSettings_2_0_16(semver::version& currentVersion, QJsonObject& config);
bool upgradeGlobalSettings_2_1_0(semver::version& currentVersion, QJsonObject& config);
bool upgradeGlobalSettings_2_1_2(semver::version& currentVersion, QJsonObject& config);

bool upgradeInstanceSettings(const semver::version& currentVersion, quint8 instance, QJsonObject& config);
bool upgradeInstanceSettings_alpha_9(semver::version& currentVersion, quint8 instance, QJsonObject& config);
Expand Down
8 changes: 7 additions & 1 deletion include/grabber/qt/QtGrabber.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,17 @@ class QtGrabber : public Grabber
private slots:

///
/// @brief is called whenever the current _screen changes it's geometry
/// @brief is called whenever the current screen changes it's geometry
/// @param geo The new geometry
///
void geometryChanged(const QRect &geo);

///
/// @brief is called whenever the current pixel ratio changed
/// @param dpi The new dots per inch
///
void pixelRatioChanged(qreal dpi);

private:

///
Expand Down
23 changes: 0 additions & 23 deletions include/utils/NetOrigin.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,6 @@ class NetOrigin : public QObject
NetOrigin(QObject* parent = nullptr, Logger* log = Logger::getInstance("NETWORK"));

public:
///
/// @brief Check if address is allowed to connect. The local address is the network adapter ip this connection comes from
/// @param address The peer address
/// @param local The local address of the socket (Differs based on NetworkAdapter IP or localhost)
/// @return True when allowed, else false
///
bool accessAllowed(const QHostAddress& address, const QHostAddress& local) const;

///
/// @brief Check if address is in subnet of local
/// @return True or false
Expand All @@ -36,21 +28,6 @@ class NetOrigin : public QObject
static NetOrigin *getInstance() { return instance; }
static NetOrigin *instance;

private slots:
///
/// @brief Handle settings update from SettingsManager
/// @param type settingyType from enum
/// @param config configuration object
///
void handleSettingsUpdate(settings::type type, const QJsonDocument& config);

private:
Logger* _log;
/// True when internet access is allowed
bool _isInternetAccessAllowed;
/// True when internet access is restricted by a white list
bool _isInternetAccessRestricted;
/// Whitelisted ip addresses
QList<QHostAddress> _ipWhitelist;

};
6 changes: 1 addition & 5 deletions libsrc/cec/CECHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ CECHandler::CECHandler(const QJsonDocument& config, QObject * parent)
_cecConfig.callbackParam = this;
}

CECHandler::~CECHandler()
{
Info(_logger, "CEC handler stopped");
}

void CECHandler::handleSettingsUpdate(settings::type type, const QJsonDocument& config)
{
if(type == settings::CECEVENTS)
Expand Down Expand Up @@ -124,6 +119,7 @@ void CECHandler::stop()
_cecAdapter->Close();
UnloadLibCec(_cecAdapter);
}
Info(_logger, "CEC handler stopped");
}

bool CECHandler::enable()
Expand Down
28 changes: 28 additions & 0 deletions libsrc/db/DBMigrationManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ bool DBMigrationManager::upgradeGlobalSettings(const semver::version& currentVer
upgradeGlobalSettings_2_0_16(migratedVersion, config);
//Migration step for versions < 2.0.17
upgradeGlobalSettings_2_1_0(migratedVersion, config);
//Migration step for versions < 2.1.1
upgradeGlobalSettings_2_1_2(migratedVersion, config);

// Set the daqtabase version to the current build version
QJsonObject generalConfig = config["general"].toObject();
Expand Down Expand Up @@ -436,6 +438,32 @@ bool DBMigrationManager::upgradeGlobalSettings_2_1_0(semver::version& currentVer
return migrated;
}

bool DBMigrationManager::upgradeGlobalSettings_2_1_2(semver::version& currentVersion, QJsonObject& config)
{
bool migrated = false;
const semver::version targetVersion{ "2.1.2" };

if (currentVersion < targetVersion)
{
Info(_log, "Global settings: Migrate from version [%s] to version [%s] or later", currentVersion.getVersion().c_str(), targetVersion.getVersion().c_str());
currentVersion = targetVersion;

if (config.contains("network"))
{
QJsonObject newNetworkConfig = config["network"].toObject();
newNetworkConfig.remove("internetAccessAPI");
newNetworkConfig.remove("restirctedInternetAccessAPI");
newNetworkConfig.remove("ipWhitelist");
config.insert("network", newNetworkConfig);

Debug(_log, "Network settings migrated");
migrated = true;
}
}

return migrated;
}

bool DBMigrationManager::upgradeInstanceSettings_alpha_9(semver::version& currentVersion, quint8 instance, QJsonObject& config)
{
bool migrated = false;
Expand Down
31 changes: 13 additions & 18 deletions libsrc/flatbufserver/FlatBufferServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,24 +75,19 @@ void FlatBufferServer::newConnection()
{
if(QTcpSocket* socket = _server->nextPendingConnection())
{
if(_netOrigin->accessAllowed(socket->peerAddress(), socket->localAddress()))
{
Debug(_log, "New connection from %s", QSTRING_CSTR(socket->peerAddress().toString()));
FlatBufferClient *client = new FlatBufferClient(socket, _timeout, this);

client->setPixelDecimation(_pixelDecimation);

// internal
connect(client, &FlatBufferClient::clientDisconnected, this, &FlatBufferServer::clientDisconnected);
connect(client, &FlatBufferClient::registerGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::registerGlobalInput);
connect(client, &FlatBufferClient::clearGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::clearGlobalInput);
connect(client, &FlatBufferClient::setGlobalInputImage, GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage);
connect(client, &FlatBufferClient::setGlobalInputColor, GlobalSignals::getInstance(), &GlobalSignals::setGlobalColor);
connect(client, &FlatBufferClient::setBufferImage, GlobalSignals::getInstance(), &GlobalSignals::setBufferImage);
_openConnections.append(client);
}
else
socket->close();
Debug(_log, "New connection from %s", QSTRING_CSTR(socket->peerAddress().toString()));
FlatBufferClient *client = new FlatBufferClient(socket, _timeout, this);

client->setPixelDecimation(_pixelDecimation);

// internal
connect(client, &FlatBufferClient::clientDisconnected, this, &FlatBufferServer::clientDisconnected);
connect(client, &FlatBufferClient::registerGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::registerGlobalInput);
connect(client, &FlatBufferClient::clearGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::clearGlobalInput);
connect(client, &FlatBufferClient::setGlobalInputImage, GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage);
connect(client, &FlatBufferClient::setGlobalInputColor, GlobalSignals::getInstance(), &GlobalSignals::setGlobalColor);
connect(client, &FlatBufferClient::setBufferImage, GlobalSignals::getInstance(), &GlobalSignals::setBufferImage);
_openConnections.append(client);
}
}
}
Expand Down
Loading