Skip to content

Commit

Permalink
Merging of OAuth + Connections (#3460)
Browse files Browse the repository at this point in the history
* Beginning merging of OAuth2 + Connections

* Add Google Integration

* Remove oauth language terms

* Move OAuth settings to Integration settings

* Make OAuth optional for register/login

* Beginning merging of OAuth2 + Connections

Add Google Integration

Remove oauth language terms

Move OAuth settings to Integration settings

Make OAuth optional for register/login

* Fixes

---------

Co-authored-by: Sam <samerton@users.noreply.github.com>
  • Loading branch information
partydragen and samerton committed Mar 9, 2024
1 parent 639d989 commit 95d4a44
Show file tree
Hide file tree
Showing 15 changed files with 339 additions and 472 deletions.
92 changes: 7 additions & 85 deletions core/classes/Misc/NamelessOAuth.php
Expand Up @@ -46,19 +46,18 @@ public function getProviders(): array
}

/**
* Determine if OAuth is available if at least one provider is setup.
* Get or create an instance of a specific provider.
*
* @return bool If any provider is setup
* @param string $provider The provider name
* @return null|array An array of registered OAuth provider.
*/
public function isAvailable(): bool
public function getProvider(string $provider): ?array
{
foreach (array_keys($this->_providers) as $provider) {
if ($this->isSetup($provider)) {
return true;
}
if (array_key_exists($provider, $this->_providers)) {
return $this->_providers[$provider];
}

return false;
return null;
}

/**
Expand Down Expand Up @@ -177,10 +176,6 @@ public function setEnabled(string $provider, int $enabled): void
*/
public function isSetup(string $provider): bool
{
if (!$this->isEnabled($provider)) {
return false;
}

[$client_id, $client_secret] = $this->getCredentials($provider);

return $client_id !== '' && $client_secret !== '';
Expand Down Expand Up @@ -233,79 +228,6 @@ public function setCredentials(string $provider, string $client_id, string $clie
);
}

/**
* Check if a NamelessMC user has already connected their account to a specific provider.
*
* @param string $provider The provider name
* @param string $provider_id The provider user ID
* @return bool Whether the user is already linked to the provider
*/
public function userExistsByProviderId(string $provider, string $provider_id): bool
{
return $this->_db->query(
'SELECT user_id FROM nl2_oauth_users WHERE provider = ? AND provider_id = ?',
[$provider, $provider_id]
)->count() > 0;
}

/**
* Get the NamelessMC user ID for a specific provider user ID.
*
* @param string $provider The provider name
* @param string $provider_id The provider user ID for lookup
* @return int The NamelessMC user ID of the user linked to the provider
*/
public function getUserIdFromProviderId(string $provider, string $provider_id): int
{
return $this->_db->query(
'SELECT user_id FROM nl2_oauth_users WHERE provider = ? AND provider_id = ?',
[$provider, $provider_id]
)->first()->user_id;
}

/**
* Save a new user linked to a specific provider.
*
* @param string $user_id The NamelessMC user ID
* @param string $provider The provider name
* @param string $provider_id The provider user ID
*/
public function saveUserProvider(string $user_id, string $provider, string $provider_id): void
{
$this->_db->query(
'INSERT INTO nl2_oauth_users (user_id, provider, provider_id) VALUES (?, ?, ?)',
[$user_id, $provider, $provider_id]
);
}

/**
* Get an array of provider names and provider user IDs for a specific user.
*
* @param int $user_id The NamelessMC user ID
* @return array The array
*/
public function getAllProvidersForUser(int $user_id): array
{
return $this->_db->query(
'SELECT * FROM nl2_oauth_users WHERE user_id = ?',
[$user_id]
)->results();
}

/**
* Delete a user's provider data.
*
* @param int $user_id The provider name
* @param string $provider The provider user ID
*/
public function unlinkProviderForUser(int $user_id, string $provider): void
{
$this->_db->query(
'DELETE FROM nl2_oauth_users WHERE user_id = ? AND provider = ?',
[$user_id, $provider]
);
}

/**
* Format an array of CSS rules into a string, appending `!important` to each rule.
*
Expand Down
1 change: 0 additions & 1 deletion core/init.php
Expand Up @@ -389,7 +389,6 @@
$cc_nav->add('cc_messaging', $language->get('user', 'messaging'), URL::build('/user/messaging'));
$cc_nav->add('cc_connections', $language->get('user', 'connections'), URL::build('/user/connections'));
$cc_nav->add('cc_settings', $language->get('user', 'profile_settings'), URL::build('/user/settings'));
$cc_nav->add('cc_oauth', $language->get('admin', 'oauth'), URL::build('/user/oauth'));

// Placeholders enabled?
if (Settings::get('placeholders') === '1') {
Expand Down
64 changes: 64 additions & 0 deletions custom/panel_templates/Default/core/integrations_edit.tpl
Expand Up @@ -88,6 +88,70 @@
</div>
{/if}

{if isset($OAUTH)}
<form action="" method="post">
<div class="row">
<div class="col">
<div class="card shadow mb-4">
<div class="card-body">

<h5>{$OAUTH} {if $OAUTH_PROVIDER_DATA['logo_url']}
<img src="{$OAUTH_PROVIDER_DATA['logo_url']}" alt="{$OAUTH_PROVIDER_DATA['name']|ucfirst} Logo" style="width: 16px; height: auto;">
{elseif $OAUTH_PROVIDER_DATA['icon']}
<i class="{$OAUTH_PROVIDER_DATA['icon']}"></i>
{/if}</h5>
<hr />
<div class="card shadow border-left-primary">
<div class="card-body">
<h5><i class="icon fa fa-info-circle"></i> {$INFO}</h5>
{$OAUTH_INFO}
</div>
</div>

<br />

<div class="form-group custom-control custom-switch">
<input id="enable" name="enable"
type="checkbox" class="custom-control-input" {if $OAUTH_PROVIDER_DATA['enabled']
&& $OAUTH_PROVIDER_DATA['setup']} checked{/if} />
<label for="enable" id="enable"
class="custom-control-label">
{$REGISTER_LOGIN_WITH_OAUTH}
</label>
</div>

<div class="form-group">
<label for="client-id">{$CLIENT_ID}</label>
<input type="text" name="client-id" class="form-control"
id="client-id" placeholder="{$CLIENT_ID}"
value="{$OAUTH_PROVIDER_DATA['client_id']}">
</div>

<div class="form-group">
<label for="client-secret">{$CLIENT_SECRET}</label>
<input type="password" name="client-secret"
class="form-control" id="client-secret"
placeholder="{$CLIENT_SECRET}" value="{$OAUTH_PROVIDER_DATA['client_secret']}">
</div>

<div class="form-group">
<label for="client-url">{$REDIRECT_URL}</label>
<input type="text" class="form-control" id="client-url"
readonly value="{$OAUTH_PROVIDER_DATA['client_url']}">
</div>
</div>
</div>
</div>
</div>

<div class="form-group">
<input type="hidden" name="action" value="oauth">
<input type="hidden" name="token" value="{$TOKEN}">
<input type="submit" class="btn btn-primary" value="{$SUBMIT}">
</div>
</form>
{/if}

<!-- Spacing -->
<div style="height:1rem;"></div>

Expand Down
61 changes: 0 additions & 61 deletions custom/panel_templates/Default/core/registration.tpl
Expand Up @@ -139,67 +139,6 @@
</div>
</div>

<h5>{$OAUTH}</h5>
<div class="card shadow border-left-primary">
<div class="card-body">
<h5><i class="icon fa fa-info-circle"></i> {$INFO}</h5>
{$OAUTH_INFO}
</div>
</div>
<br />
<form action="" method="post">
<div class="row">
{foreach from=$OAUTH_PROVIDER_DATA key="provider_name" item="provider_data"}
<div class="col">
<div class="card shadow mb-4">
<div class="card-body">
<div class="form-group custom-control custom-switch text-center">
<input id="enable-{$provider_name}" name="enable-{$provider_name}"
type="checkbox" class="custom-control-input" {if $provider_data['enabled']
&& $provider_data['setup']} checked{/if} />
<label for="enable-{$provider_name}" id="enable-{$provider_name}"
class="custom-control-label">
{$provider_name|ucfirst}
{if $provider_data['logo_url']}
<img src="{$provider_data['logo_url']}" alt="{$provider_name|ucfirst} Logo" style="width: 16px; height: auto;">
{elseif $provider_data['icon']}
<i class="{$provider_data['icon']}"></i>
{/if}
</label>
</div>

<div class="form-group">
<label for="client-id-{$provider_name}">{$CLIENT_ID}</label>
<input type="text" name="client-id-{$provider_name}" class="form-control"
id="client-id-{$provider_name}" placeholder="Client ID"
value="{$provider_data['client_id']}">
</div>

<div class="form-group">
<label for="client-secret-{$provider_name}">{$CLIENT_SECRET}</label>
<input type="password" name="client-secret-{$provider_name}"
class="form-control" id="client-secret-{$provider_name}"
placeholder="Client Secret" value="{$provider_data['client_secret']}">
</div>

<div class="form-group">
<label for="client-url-{$provider_name}">{$REDIRECT_URL}</label>
<input type="text" class="form-control" id="client-url-{$provider_name}"
readonly value="{$OAUTH_URL|replace:'{{provider}}':$provider_name}">
</div>
</div>
</div>
</div>
{/foreach}
</div>

<div class="form-group">
<input type="hidden" name="action" value="oauth">
<input type="hidden" name="token" value="{$TOKEN}">
<input type="submit" class="btn btn-primary" value="{$SUBMIT}">
</div>
</form>

<!-- Spacing -->
<div style="height:1rem;"></div>

Expand Down

0 comments on commit 95d4a44

Please sign in to comment.