Skip to content

Commit

Permalink
Beginning merging of OAuth2 + Connections
Browse files Browse the repository at this point in the history
Add Google Integration

Remove oauth language terms

Move OAuth settings to Integration settings

Make OAuth optional for register/login
  • Loading branch information
partydragen authored and tadhgboyle committed Dec 18, 2023
1 parent d8e1c88 commit 70f746d
Show file tree
Hide file tree
Showing 15 changed files with 339 additions and 466 deletions.
88 changes: 8 additions & 80 deletions core/classes/Misc/NamelessOAuth.php
Expand Up @@ -43,17 +43,17 @@ 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 {
foreach (array_keys($this->_providers) as $provider) {
if ($this->isSetup($provider)) {
return true;
}
public function getProvider(string $provider): ?array {
if (array_key_exists($provider, $this->_providers)) {
return $this->_providers[$provider];
}
return false;

return null;
}

/**
Expand Down Expand Up @@ -166,10 +166,6 @@ public function setEnabled(string $provider, int $enabled): void {
* @return bool If the provider is setup
*/
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 @@ -218,74 +214,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 @@ -388,7 +388,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
9 changes: 2 additions & 7 deletions custom/languages/en_UK.json
Expand Up @@ -416,7 +416,8 @@
"admin/not_set": "Not set",
"admin/notice_log": "Notice log",
"admin/oauth": "OAuth",
"admin/oauth_info": "Configure OAuth providers to allow users to login with their social network accounts. {{docLinkStart}}Check out our documentation for help{{docLinkEnd}}.",
"admin/oauth_info": "Configure OAuth provider to allow users to link and login with their social network accounts. {{docLinkStart}}Check out our documentation for help{{docLinkEnd}}.",
"admin/register_login_with_oauth": "Allow user to register and login using this integration?",
"admin/og_image_reset_successfully": "OG image reset successfully.",
"admin/og_image_updated_successfully": "OG image updated successfully.",
"admin/fallback_og_image_x": "Fallback OG image: {{imageName}}",
Expand Down Expand Up @@ -1230,19 +1231,13 @@
"user/no_messages_full": "You do not have any messages.",
"user/no_placeholders": "No Placeholders",
"user/no_profile_posts": "No profile posts.",
"user/no_providers": "No OAuth providers are set up.",
"user/no_providers_admin": "No OAuth providers have been configured by site administrators yet.",
"user/no_replies_yet": "No replies yet",
"user/no_user_found_with_provider": "No user found with that {{provider}} account.",
"user/no_wall_posts": "There are no wall posts here yet.",
"user/not_connected": "Not Connected",
"user/overview": "Overview",
"user/oauth_already_linked": "Another NamelessMC user is already linked to that {{provider}} account.",
"user/oauth_link_confirm": "You will be taken to the {{provider}} website to link your account.",
"user/oauth_link_success": "Successfully linked your account with {{provider}}!",
"user/oauth_login_success": "You have logged in with your {{provider}} account.",
"user/oauth_unlink_confirm": "Are you sure you want to unlink your account from {{provider}}? You will not be able to login with this account anymore.",
"user/oauth_unlinked": "Successfully unlinked your account from that provider.",
"user/one_or_more_users_blocked": "You cannot send private messages to at least one member of the conversation.",
"user/participants": "Participants",
"user/password": "Password",
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 70f746d

Please sign in to comment.