From dc31807c71cc2111ae137c25495622cfa60d296e Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 7 May 2025 21:28:33 +0200 Subject: [PATCH 1/5] Remove outdated Twitter driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This appears to no longer work following the rebranding of Twitter to X and various other API changes — all the URLs in the driver are incorrect for authenticating against the X service. --- src/drivers/twitter.ts | 150 ----------------------------------------- 1 file changed, 150 deletions(-) delete mode 100644 src/drivers/twitter.ts diff --git a/src/drivers/twitter.ts b/src/drivers/twitter.ts deleted file mode 100644 index ab83fb3..0000000 --- a/src/drivers/twitter.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* - * @adonisjs/ally - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import type { HttpContext } from '@adonisjs/core/http' -import { - TwitterToken, - AllyUserContract, - ApiRequestContract, - TwitterDriverConfig, -} from '../types.js' -import { Oauth1Driver } from '../abstract_drivers/oauth1.js' - -/** - * Twitter driver to login user via twitter - */ -export class TwitterDriver extends Oauth1Driver { - protected requestTokenUrl = 'https://api.twitter.com/oauth/request_token' - protected authorizeUrl = 'https://api.twitter.com/oauth/authenticate' - protected accessTokenUrl = 'https://api.twitter.com/oauth/access_token' - protected userInfoUrl = 'https://api.twitter.com/1.1/account/verify_credentials.json' - - /** - * The query string param name for the error. - */ - protected errorParamName = 'error' - - /** - * The query string param name for the "oauth_verifier". Used - * for both the post redirect value access and during the - * time of generating the access token - */ - protected oauthTokenVerifierName = 'oauth_verifier' - - /** - * Cookie name for storing the oauth_token. The cookie - * name for storing oauth_token_secret is derived - * from this property - */ - protected oauthTokenCookieName = 'twitter_oauth_token' - - /** - * Param name for defined the "oauth_token" pre redirect - * and also used post redirect for reading the "oauth_token" - * value - */ - protected oauthTokenParamName = 'oauth_token' - - /** - * Twitter doesn't support scopes - */ - protected scopeParamName = '' - protected scopesSeparator = ' ' - - constructor( - protected ctx: HttpContext, - public config: TwitterDriverConfig - ) { - super(ctx, config) - - /** - * Extremely important to call the following method to clear the - * state set by the redirect request - */ - this.loadState() - } - - /** - * Returns user info - */ - protected async getUserInfo( - token: string, - secret: string, - callback?: (request: ApiRequestContract) => void - ) { - const requestToken = { token, secret } - const userInfoUrl = this.config.userInfoUrl || this.userInfoUrl - - const user = await this.makeSignedRequest(userInfoUrl, 'get', requestToken, (request) => { - /** - * Include email - */ - request.param('include_email', true) - - /** - * Parse response as JSON - */ - request['parseAs']('json') - - /** - * Invoke user callback - */ - if (typeof callback === 'function') { - callback(request) - } - }) - - return { - id: user.id_str, - nickName: user.screen_name, - name: user.name || user.screen_name, - email: user.email, - emailVerificationState: 'unsupported' as const, - avatarUrl: user.profile_image_url_https.replace('_normal.jpg', '_400x400.jpg'), - original: user, - } - } - - /** - * Returns details for the authorized user - */ - async user(callback?: (request: ApiRequestContract) => void) { - const token = await this.accessToken() - const userInfo = await this.getUserInfo(token.token, token.secret, callback) - - return { - ...userInfo, - token, - } - } - - /** - * Finds the user info from the "oauth_token" and "oauth_token_secret" - * access from the access token. - */ - async userFromTokenAndSecret( - token: string, - secret: string, - callback?: (request: ApiRequestContract) => void - ): Promise> { - const userInfo = await this.getUserInfo(token, secret, callback) - - return { - ...userInfo, - token: { token, secret }, - } - } - - /** - * Find if the current error code is for access denied - */ - accessDenied(): boolean { - return this.ctx.request.input('denied') - } -} From 1e2072f546822c46df9d5f97a8bf793295e008ce Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 7 May 2025 21:32:32 +0200 Subject: [PATCH 2/5] Update define_config.ts to remove twitter driver --- src/define_config.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/define_config.ts b/src/define_config.ts index d895ca1..0c3b1dc 100644 --- a/src/define_config.ts +++ b/src/define_config.ts @@ -14,7 +14,6 @@ import type { ConfigProvider } from '@adonisjs/core/types' import type { GoogleDriver } from './drivers/google.js' import type { GithubDriver } from './drivers/github.js' import type { SpotifyDriver } from './drivers/spotify.js' -import type { TwitterDriver } from './drivers/twitter.js' import type { DiscordDriver } from './drivers/discord.js' import type { FacebookDriver } from './drivers/facebook.js' import type { LinkedInDriver } from './drivers/linked_in.js' @@ -24,7 +23,6 @@ import type { GithubDriverConfig, SpotifyDriverConfig, DiscordDriverConfig, - TwitterDriverConfig, LinkedInDriverConfig, LinkedInOpenidConnectDriverConfig, FacebookDriverConfig, @@ -85,7 +83,6 @@ export const services: { config: LinkedInOpenidConnectDriverConfig ) => ConfigProvider<(ctx: HttpContext) => LinkedInOpenidConnectDriver> spotify: (config: SpotifyDriverConfig) => ConfigProvider<(ctx: HttpContext) => SpotifyDriver> - twitter: (config: TwitterDriverConfig) => ConfigProvider<(ctx: HttpContext) => TwitterDriver> } = { discord(config) { return configProvider.create(async () => { @@ -129,10 +126,4 @@ export const services: { return (ctx) => new SpotifyDriver(ctx, config) }) }, - twitter(config) { - return configProvider.create(async () => { - const { TwitterDriver } = await import('./drivers/twitter.js') - return (ctx) => new TwitterDriver(ctx, config) - }) - }, } From dd88ecb69d2716a5ed589e730ec66a6329badec0 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 7 May 2025 21:33:24 +0200 Subject: [PATCH 3/5] Update types.ts to remove twitter driver --- src/types.ts | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/types.ts b/src/types.ts index 2d3b8ea..dc2c48d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -288,29 +288,6 @@ export type GithubDriverConfig = Oauth2ClientConfig & { userEmailUrl?: string } -/** - * ---------------------------------------- - * Twitter driver - * ---------------------------------------- - */ - -/** - * Shape of the twitter token - */ -export type TwitterToken = { - token: string - secret: string - userId: string - screenName: string -} - -/** - * Extra options available for twitter - */ -export type TwitterDriverConfig = Oauth1ClientConfig & { - userInfoUrl?: string -} - /** * ---------------------------------------- * Google driver From b4c3b6369ded148b99cb845be0b8b3b901f2072d Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 7 May 2025 21:34:33 +0200 Subject: [PATCH 4/5] Update define_config.spec.ts --- tests/define_config.spec.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tests/define_config.spec.ts b/tests/define_config.spec.ts index 74fd7e4..cb326d3 100644 --- a/tests/define_config.spec.ts +++ b/tests/define_config.spec.ts @@ -20,7 +20,6 @@ import { DiscordDriver } from '../src/drivers/discord.js' import { FacebookDriver } from '../src/drivers/facebook.js' import { LinkedInDriver } from '../src/drivers/linked_in.js' import { SpotifyDriver } from '../src/drivers/spotify.js' -import { TwitterDriver } from '../src/drivers/twitter.js' import { LinkedInOpenidConnectDriver } from '../src/drivers/linked_in_openid_connect.js' const BASE_URL = new URL('./', import.meta.url) @@ -180,22 +179,4 @@ test.group('Config services', () => { expectTypeOf(ally.use).parameters.toEqualTypeOf<['spotify']>() expectTypeOf(ally.use('spotify')).toMatchTypeOf() }) - - test('configure twitter driver', async ({ assert, expectTypeOf }) => { - const managerConfig = await defineConfig({ - twitter: services.twitter({ - clientId: '', - clientSecret: '', - callbackUrl: '', - }), - }).resolver(app) - - const ctx = new HttpContextFactory().create() - const ally = new AllyManager(managerConfig, ctx) - - assert.instanceOf(ally.use('twitter'), TwitterDriver) - assert.strictEqual(ally.use('twitter'), ally.use('twitter')) - expectTypeOf(ally.use).parameters.toEqualTypeOf<['twitter']>() - expectTypeOf(ally.use('twitter')).toMatchTypeOf() - }) }) From c0b305cf56b69f5e89b0bb7921ab4e6fe9c45a0b Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 7 May 2025 21:35:22 +0200 Subject: [PATCH 5/5] Update configure.ts to remove twitter driver --- configure.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/configure.ts b/configure.ts index e780b10..c332f64 100644 --- a/configure.ts +++ b/configure.ts @@ -21,7 +21,6 @@ const AVAILABLE_PROVIDERS = [ 'linkedin', 'linkedinOpenidConnect', 'spotify', - 'twitter', ] /**