Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
33 changes: 13 additions & 20 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ jobs:
build-essential \
cmake \
ninja-build \
pandoc \
libasound2-dev \
libjack-jackd2-dev \
ladspa-sdk \
Expand Down Expand Up @@ -91,7 +90,7 @@ jobs:
- name: Install dependencies (macOS)
if: runner.os == 'macOS'
run: |
brew install cmake ninja pandoc
brew install cmake ninja

- name: Setup Boost (macOS)
if: runner.os == 'macOS'
Expand All @@ -102,26 +101,24 @@ jobs:
platform_version: 11
toolset: clang

- name: Cache Chocolatey (Windows)
if: runner.os == 'Windows'
uses: actions/cache@v4
with:
path: ~\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}-choco-${{ hashFiles('.github/workflows/build.yml') }}
restore-keys: |
${{ runner.os }}-choco-

- name: Install dependencies (Windows)
- name: Install Boost headers (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
choco install cmake ninja pandoc boost-msvc-14.3 -y

$boost_ver = "1.83.0"
$boost_dir = "boost_$($boost_ver -replace '\.','_')"
$url = "https://archives.boost.io/release/$boost_ver/source/${boost_dir}.zip"
Invoke-WebRequest -Uri $url -OutFile boost.zip
New-Item -ItemType Directory -Force -Path C:\local
Expand-Archive -Path boost.zip -DestinationPath C:\local
echo "BOOST_ROOT=C:\local\$boost_dir" >> $env:GITHUB_ENV

- name: Setup MSVC environment (Windows)
if: runner.os == 'Windows'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: amd64

- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
Expand All @@ -137,11 +134,7 @@ jobs:
-DCMAKE_BUILD_TYPE=Release `
-DELEMENT_ENABLE_ASIO=ON `
-DELEMENT_ENABLE_UPDATER=ON `
-DELEMENT_BUILD_PLUGINS=ON `
-DBoost_INCLUDE_DIR="C:/local/boost_1_87_0" `
-DBoost_LIBRARY_DIRS="C:/local/boost_1_87_0/lib64-msvc-14.3"
env:
BOOST_ROOT: C:/local/boost_1_87_0
-DELEMENT_BUILD_PLUGINS=ON

- name: Configure CMake (Unix)
if: runner.os != 'Windows'
Expand Down
37 changes: 20 additions & 17 deletions src/auth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
#include <CommonCrypto/CommonDigest.h>
#endif

#define AUTH_LOG(o)
// #define AUTH_LOG(o) Logger::writeToLog(o)

namespace element::auth {
using namespace juce;

Expand Down Expand Up @@ -327,17 +330,17 @@ String fetchSignedAppcastUrl (const String& accessToken)
std::unique_ptr<InputStream> stream (url.createInputStream (options));
if (statusCode != 200 || stream == nullptr)
{
Logger::writeToLog ("Auth: appcast-url request failed (HTTP " + String (statusCode) + ")");
AUTH_LOG ("Auth: appcast-url request failed (HTTP " + String (statusCode) + ")");
return {};
}

const auto body = stream->readEntireStreamAsString();
auto json = JSON::parse (body);
const auto appcastUrl = json["url"].toString();
if (appcastUrl.isNotEmpty())
Logger::writeToLog ("Auth: fetched signed appcast URL");
AUTH_LOG ("Auth: fetched signed appcast URL");
else
Logger::writeToLog ("Auth: appcast-url response missing 'url' field");
AUTH_LOG ("Auth: appcast-url response missing 'url' field");

return appcastUrl;
}
Expand All @@ -363,9 +366,9 @@ void revokeRefreshToken (const String& refreshToken)

std::unique_ptr<InputStream> stream (url.createInputStream (options));
if (statusCode >= 200 && statusCode < 300)
Logger::writeToLog ("Auth: refresh token revoked successfully");
AUTH_LOG ("Auth: refresh token revoked successfully");
else
Logger::writeToLog ("Auth: revoke request failed (HTTP " + String (statusCode) + ")");
AUTH_LOG ("Auth: revoke request failed (HTTP " + String (statusCode) + ")");
}

bool isAppcastUrlExpired (const String& cachedUrl)
Expand All @@ -389,16 +392,16 @@ void maybeRefreshOnStartup (element::Settings& settings)

if (storedRefreshToken.isEmpty())
{
Logger::writeToLog ("Auth: no stored refresh token, skipping startup refresh");
AUTH_LOG ("Auth: no stored refresh token, skipping startup refresh");
return;
}

Logger::writeToLog ("Auth: attempting token refresh on startup");
AUTH_LOG ("Auth: attempting token refresh on startup");
const auto response = refreshAccessToken (storedRefreshToken);

if (! response.success)
{
Logger::writeToLog ("Auth: startup refresh failed: " + response.error);
AUTH_LOG ("Auth: startup refresh failed: " + response.error);
// Clear stale credentials so the UI reflects signed-out state.
settings.setUpdateKey ({});
settings.setUpdateKeyUser ({});
Expand All @@ -414,7 +417,7 @@ void maybeRefreshOnStartup (element::Settings& settings)
}

persistTokens (settings, response);
Logger::writeToLog ("Auth: startup token refresh succeeded");
AUTH_LOG ("Auth: startup token refresh succeeded");
}

void handleCallback (const String& urlString, element::Settings& settings)
Expand All @@ -428,7 +431,7 @@ void handleCallback (const String& urlString, element::Settings& settings)
const auto authError = parameters["error"];
if (authError.isNotEmpty())
{
Logger::writeToLog ("Auth callback error: " + authError);
AUTH_LOG ("Auth callback error: " + authError);
return;
}

Expand All @@ -439,26 +442,26 @@ void handleCallback (const String& urlString, element::Settings& settings)
String expectedState, codeVerifier;
if (! consumePendingPKCE (settings, expectedState, codeVerifier))
{
Logger::writeToLog ("Auth: missing PKCE session — restart sign-in");
AUTH_LOG ("Auth: missing PKCE session — restart sign-in");
return;
}

const auto callbackState = parameters["state"].trim();
if (callbackState.isEmpty() || callbackState != expectedState)
{
Logger::writeToLog ("Auth: callback rejected — invalid state");
AUTH_LOG ("Auth: callback rejected — invalid state");
return;
}

const auto response = exchangeAuthorizationCode (authCode, codeVerifier);
if (! response.success)
{
Logger::writeToLog ("Auth: token exchange failed: " + response.error);
AUTH_LOG ("Auth: token exchange failed: " + response.error);
return;
}

persistTokens (settings, response);
Logger::writeToLog ("Auth: token exchange completed successfully");
AUTH_LOG ("Auth: token exchange completed successfully");
}

String beginAuthorizationFlow (element::Settings& settings)
Expand All @@ -467,17 +470,17 @@ String beginAuthorizationFlow (element::Settings& settings)
const auto codeVerifier = generateCodeVerifier();
if (! storePendingPKCE (settings, state, codeVerifier))
{
Logger::writeToLog ("Auth: failed to store PKCE state");
AUTH_LOG ("Auth: failed to store PKCE state");
return {};
}

Logger::writeToLog ("Auth: authorization flow started (PKCE)");
AUTH_LOG ("Auth: authorization flow started (PKCE)");
return buildAuthorizationURL (state, codeVerifier);
}

void signOut (element::Settings& settings)
{
Logger::writeToLog ("Auth: signing out");
AUTH_LOG ("Auth: signing out");

const auto refreshToken = [&]() -> String {
if (auto* props = settings.getUserSettings())
Expand Down
Loading