From a15a41a0b27154f826f047064383a335537febeb Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 12 May 2026 14:12:41 +0530 Subject: [PATCH 01/11] twitter oauth --- apps/meteor/package.json | 2 + apps/meteor/server/lib/oauth/oauthConfigs.ts | 5 ++ yarn.lock | 56 ++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 3abc853835ce3..90443761c5408 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -268,6 +268,7 @@ "passport-facebook2": "^1.0.3", "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", + "passport-twitter": "^1.0.4", "path": "^0.12.7", "path-to-regexp": "^6.3.0", "pino": "10.3.1", @@ -398,6 +399,7 @@ "@types/passport-facebook": "^3.0.4", "@types/passport-github2": "^1.2.9", "@types/passport-google-oauth20": "^2", + "@types/passport-twitter": "^1", "@types/prometheus-gc-stats": "^0.6.4", "@types/proxy-from-env": "^1.0.4", "@types/proxyquire": "^1.3.31", diff --git a/apps/meteor/server/lib/oauth/oauthConfigs.ts b/apps/meteor/server/lib/oauth/oauthConfigs.ts index 55b2c607cbdcd..4054f71476f55 100644 --- a/apps/meteor/server/lib/oauth/oauthConfigs.ts +++ b/apps/meteor/server/lib/oauth/oauthConfigs.ts @@ -2,6 +2,7 @@ import type { Strategy } from 'passport'; import { Strategy as FacebookStrategy } from 'passport-facebook'; import { Strategy as GitHubStrategy } from 'passport-github2'; import { Strategy as GoogleStrategy } from 'passport-google-oauth20'; +import { Strategy as TwitterStrategy } from 'passport-twitter'; export type OAuthConfig = { strategy: new (...args: any[]) => Strategy; @@ -21,6 +22,10 @@ export const OAuthConfigs: Record = { strategy: GoogleStrategy, scope: ['email', 'profile'], }, + twitter: { + strategy: TwitterStrategy, + scope: ['email', 'profile'], + }, } as const; export type Provider = keyof typeof OAuthConfigs; diff --git a/yarn.lock b/yarn.lock index 352c7303a7302..938b35d91bf28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9766,6 +9766,7 @@ __metadata: "@types/passport-facebook": "npm:^3.0.4" "@types/passport-github2": "npm:^1.2.9" "@types/passport-google-oauth20": "npm:^2" + "@types/passport-twitter": "npm:^1" "@types/prometheus-gc-stats": "npm:^0.6.4" "@types/proxy-from-env": "npm:^1.0.4" "@types/proxyquire": "npm:^1.3.31" @@ -9911,6 +9912,7 @@ __metadata: passport-facebook2: "npm:^1.0.3" passport-github2: "npm:^0.1.12" passport-google-oauth20: "npm:^2.0.0" + passport-twitter: "npm:^1.0.4" path: "npm:^0.12.7" path-to-regexp: "npm:^6.3.0" pino: "npm:10.3.1" @@ -14700,6 +14702,16 @@ __metadata: languageName: node linkType: hard +"@types/passport-twitter@npm:^1": + version: 1.0.40 + resolution: "@types/passport-twitter@npm:1.0.40" + dependencies: + "@types/express": "npm:*" + "@types/passport": "npm:*" + checksum: 10/cf97db9469acff4dffff11ecf4e12ac016fc55d478e2fbd881c7961fe36f26ba232a55f74fdd0bd0216ea49d3a9dcd4e18afac852b6bb10450f43413e4a464b7 + languageName: node + linkType: hard + "@types/passport@npm:*, @types/passport@npm:^1.0.17": version: 1.0.17 resolution: "@types/passport@npm:1.0.17" @@ -29239,6 +29251,13 @@ __metadata: languageName: node linkType: hard +"oauth@npm:0.9.x": + version: 0.9.15 + resolution: "oauth@npm:0.9.15" + checksum: 10/6b0b10be19a461da417a37ea2821a773ef74dd667563291e1e83b2024b88e6571b0323a0a6887f2390fbaf28cc6ce5bfe0484fc22162b975305b1e19b76f5597 + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -29949,6 +29968,17 @@ __metadata: languageName: node linkType: hard +"passport-oauth1@npm:1.x.x": + version: 1.3.0 + resolution: "passport-oauth1@npm:1.3.0" + dependencies: + oauth: "npm:0.9.x" + passport-strategy: "npm:1.x.x" + utils-merge: "npm:1.x.x" + checksum: 10/56f725cf3e3358ccb72212a6342e237ae9366172b94fdb9ac8ab380456da07dc1bb776bcdcddc9964e8e9056922fbf31c2f142d0421fd8a5b0140132d0cd9671 + languageName: node + linkType: hard + "passport-oauth2@npm:1.x.x": version: 1.8.0 resolution: "passport-oauth2@npm:1.8.0" @@ -29969,6 +29999,16 @@ __metadata: languageName: node linkType: hard +"passport-twitter@npm:^1.0.4": + version: 1.0.4 + resolution: "passport-twitter@npm:1.0.4" + dependencies: + passport-oauth1: "npm:1.x.x" + xtraverse: "npm:0.1.x" + checksum: 10/46c2efcbd8893c2de329770f16703b027531e2becfc8865dd288290635dcc9a678bbcec82a66ad52e49742bccd77ff4fc49f576fef2d711f49363e1b75ac1e80 + languageName: node + linkType: hard + "passport@npm:^0.7.0": version: 0.7.0 resolution: "passport@npm:0.7.0" @@ -37778,6 +37818,13 @@ __metadata: languageName: node linkType: hard +"xmldom@npm:0.1.x": + version: 0.1.31 + resolution: "xmldom@npm:0.1.31" + checksum: 10/eddc09391c928be61c504a355d5b7c42cbec526e94cc1e2d092d006ed5bc1525b869fb922cbcf3f6f7aac946a6b25ec4243dc2630afb5cbec61b723829211792 + languageName: node + linkType: hard + "xorshift@npm:^1.1.1": version: 1.2.0 resolution: "xorshift@npm:1.2.0" @@ -37813,6 +37860,15 @@ __metadata: languageName: node linkType: hard +"xtraverse@npm:0.1.x": + version: 0.1.0 + resolution: "xtraverse@npm:0.1.0" + dependencies: + xmldom: "npm:0.1.x" + checksum: 10/86e837a626ef363c01efa55a3e20b1d85b49d87f3de504955af119b451cb1f2c63e887bff6061335314c1d49005d851f4bc1d0cf2603dce18271aceb3e673d8a + languageName: node + linkType: hard + "xxhashjs@npm:~0.2.2": version: 0.2.2 resolution: "xxhashjs@npm:0.2.2" From a1396b53029bae91172fede8e35356c70cbcc17c Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Sat, 16 May 2026 00:41:52 +0530 Subject: [PATCH 02/11] fix twitter consumer key and secret --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index 1629879e0a7e6..e31b258236016 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -22,6 +22,8 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], { clientID: config.clientId, clientSecret: config.clientSecret, + consumerKey: config.clientId, + consumerSecret: config.clientSecret, callbackURL: `${siteUrl}/oauth/${config.provider}/callback`, state: true, pkce: true, From 92a69a6c29b00426ce0a7855e1c189f8e10ccb61 Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Sat, 16 May 2026 01:36:19 +0530 Subject: [PATCH 03/11] add logs --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index ed1005d999a1e..c0291afda83a5 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -38,6 +38,8 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], const profileWithRaw = profile as Profile & { _json?: Record; _raw?: string }; const { _json, _raw, ...restProfile } = profileWithRaw; + console.log('profile - ', profile); + // eslint-disable-next-line @typescript-eslint/await-thenable const user = await Accounts.updateOrCreateUserFromExternalService( config.provider, From 6fabc2feb83a024c061d7ec1cd5f8ded4843095a Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Mon, 18 May 2026 19:20:04 +0530 Subject: [PATCH 04/11] cleanup --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 3 --- apps/meteor/server/lib/oauth/oauthConfigs.ts | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index c0291afda83a5..2f7544e10b8d9 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -38,9 +38,6 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], const profileWithRaw = profile as Profile & { _json?: Record; _raw?: string }; const { _json, _raw, ...restProfile } = profileWithRaw; - console.log('profile - ', profile); - - // eslint-disable-next-line @typescript-eslint/await-thenable const user = await Accounts.updateOrCreateUserFromExternalService( config.provider, { diff --git a/apps/meteor/server/lib/oauth/oauthConfigs.ts b/apps/meteor/server/lib/oauth/oauthConfigs.ts index 4054f71476f55..f9e8596a5152f 100644 --- a/apps/meteor/server/lib/oauth/oauthConfigs.ts +++ b/apps/meteor/server/lib/oauth/oauthConfigs.ts @@ -7,6 +7,7 @@ import { Strategy as TwitterStrategy } from 'passport-twitter'; export type OAuthConfig = { strategy: new (...args: any[]) => Strategy; scope: string[]; + includeEmail?: boolean; }; export const OAuthConfigs: Record = { @@ -25,6 +26,7 @@ export const OAuthConfigs: Record = { twitter: { strategy: TwitterStrategy, scope: ['email', 'profile'], + includeEmail: true, }, } as const; From 0e5dc869f62c2cd8d36ea4ef411f11e1990b292c Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Mon, 18 May 2026 20:38:59 +0530 Subject: [PATCH 05/11] remove twitter scopes --- apps/meteor/server/lib/oauth/oauthConfigs.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/meteor/server/lib/oauth/oauthConfigs.ts b/apps/meteor/server/lib/oauth/oauthConfigs.ts index f9e8596a5152f..c9f63ca3a9fa0 100644 --- a/apps/meteor/server/lib/oauth/oauthConfigs.ts +++ b/apps/meteor/server/lib/oauth/oauthConfigs.ts @@ -6,7 +6,7 @@ import { Strategy as TwitterStrategy } from 'passport-twitter'; export type OAuthConfig = { strategy: new (...args: any[]) => Strategy; - scope: string[]; + scope?: string[]; includeEmail?: boolean; }; @@ -25,7 +25,6 @@ export const OAuthConfigs: Record = { }, twitter: { strategy: TwitterStrategy, - scope: ['email', 'profile'], includeEmail: true, }, } as const; From 2fa3f419e30bc89b6f7fb604528b4699544e96b5 Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Mon, 18 May 2026 21:22:53 +0530 Subject: [PATCH 06/11] fix TS --- apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts index 723f1db7a665b..c493631a8e0d3 100644 --- a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts +++ b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts @@ -9,7 +9,7 @@ export type OAuthServiceConfig = { strategy: new (...args: any[]) => Strategy; clientId: string; clientSecret: string; - scope: string[]; + scope?: string[]; }; export const createOAuthServiceConfig = (settings: ICachedSettings, services: string[]): OAuthServiceConfig[] => { @@ -19,7 +19,7 @@ export const createOAuthServiceConfig = (settings: ICachedSettings, services: st strategy: OAuthConfigs[service].strategy, clientId: settings.get(`Accounts_OAuth_${capitalize(service)}_id`), clientSecret: settings.get(`Accounts_OAuth_${capitalize(service)}_secret`), - scope: OAuthConfigs[service].scope, + scope: OAuthConfigs[service]?.scope, }; }); }; From 83fcccf17c695014c3b5fc2ecb10b34c97e62223 Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 19 May 2026 03:26:35 +0530 Subject: [PATCH 07/11] refactor --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 1 + apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index 2f7544e10b8d9..ec6d0f167c890 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -24,6 +24,7 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], config.provider, new Strategy( { + ...config, clientID: config.clientId, clientSecret: config.clientSecret, consumerKey: config.clientId, diff --git a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts index c493631a8e0d3..e71d94c943dc9 100644 --- a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts +++ b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts @@ -16,10 +16,10 @@ export const createOAuthServiceConfig = (settings: ICachedSettings, services: st return services.map((service) => { return { provider: service, - strategy: OAuthConfigs[service].strategy, clientId: settings.get(`Accounts_OAuth_${capitalize(service)}_id`), clientSecret: settings.get(`Accounts_OAuth_${capitalize(service)}_secret`), scope: OAuthConfigs[service]?.scope, + ...OAuthConfigs[service], }; }); }; From e7418dcaa88519197f67a10a930334534d390ea8 Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 19 May 2026 17:56:47 +0530 Subject: [PATCH 08/11] add logs --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index ec6d0f167c890..bd484d6c9641c 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -19,7 +19,7 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], const siteUrl = settings.get('Site_Url'); passport.unuse(config.provider); - + console.log('CONFIG - ', config); passport.use( config.provider, new Strategy( @@ -36,6 +36,8 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], profileFields: ['id', 'displayName', 'emails'], }, async (accessToken: string, refreshToken: string, profile: Profile, done: DoneCallback) => { + console.log('twitterOAuth - ', { accessToken, refreshToken, profile }); + console.log('PROFILE - ', profile); const profileWithRaw = profile as Profile & { _json?: Record; _raw?: string }; const { _json, _raw, ...restProfile } = profileWithRaw; From 107f3619922e7b6da7ea303e2f6145c51d3f87ea Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 19 May 2026 17:58:54 +0530 Subject: [PATCH 09/11] improvement --- .../lib/oauth/createOAuthServiceConfig.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts index e71d94c943dc9..a7b587aad3968 100644 --- a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts +++ b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts @@ -1,4 +1,5 @@ import { capitalize } from '@rocket.chat/string-helpers'; +import { isTruthy } from '@rocket.chat/tools'; import type { Strategy } from 'passport'; import { OAuthConfigs } from './oauthConfigs'; @@ -13,13 +14,17 @@ export type OAuthServiceConfig = { }; export const createOAuthServiceConfig = (settings: ICachedSettings, services: string[]): OAuthServiceConfig[] => { - return services.map((service) => { - return { - provider: service, - clientId: settings.get(`Accounts_OAuth_${capitalize(service)}_id`), - clientSecret: settings.get(`Accounts_OAuth_${capitalize(service)}_secret`), - scope: OAuthConfigs[service]?.scope, - ...OAuthConfigs[service], - }; - }); + return services + .map((service) => { + if (!OAuthConfigs[service]) { + return; + } + return { + provider: service, + clientId: settings.get(`Accounts_OAuth_${capitalize(service)}_id`), + clientSecret: settings.get(`Accounts_OAuth_${capitalize(service)}_secret`), + ...OAuthConfigs[service], + }; + }) + .filter(isTruthy); }; From d035f9c0333701cce41138eb4a389dfa12a191f0 Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 19 May 2026 18:53:10 +0530 Subject: [PATCH 10/11] merge --- .../server/lib/oauth/createOAuthServiceConfig.ts | 14 ++++++++++++++ apps/meteor/server/lib/oauth/oauthConfigs.ts | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts index a7b587aad3968..31e2f7d2cedcf 100644 --- a/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts +++ b/apps/meteor/server/lib/oauth/createOAuthServiceConfig.ts @@ -19,6 +19,20 @@ export const createOAuthServiceConfig = (settings: ICachedSettings, services: st if (!OAuthConfigs[service]) { return; } + + if (service === 'github_enterprise') { + return { + provider: service, + clientId: settings.get('Accounts_OAuth_GitHub_Enterprise_id'), + clientSecret: settings.get('Accounts_OAuth_GitHub_Enterprise_secret'), + authorizationURL: `${settings.get('API_GitHub_Enterprise_URL')}/login/oauth/authorize`, + tokenURL: `${settings.get('API_GitHub_Enterprise_URL')}/login/oauth/access_token`, + userProfileURL: `${settings.get('API_GitHub_Enterprise_URL')}/api/v3/user`, + strategy: OAuthConfigs.github_enterprise.strategy, + scope: OAuthConfigs.github_enterprise.scope, + }; + } + return { provider: service, clientId: settings.get(`Accounts_OAuth_${capitalize(service)}_id`), diff --git a/apps/meteor/server/lib/oauth/oauthConfigs.ts b/apps/meteor/server/lib/oauth/oauthConfigs.ts index c9f63ca3a9fa0..b4c8fe6604fa5 100644 --- a/apps/meteor/server/lib/oauth/oauthConfigs.ts +++ b/apps/meteor/server/lib/oauth/oauthConfigs.ts @@ -27,6 +27,10 @@ export const OAuthConfigs: Record = { strategy: TwitterStrategy, includeEmail: true, }, + github_enterprise: { + strategy: GitHubStrategy, + scope: ['user:email'], + }, } as const; export type Provider = keyof typeof OAuthConfigs; From 30904bec322b0ea3a54ce0b55871189c56be4a6d Mon Sep 17 00:00:00 2001 From: yash-rajpal Date: Tue, 19 May 2026 20:30:13 +0530 Subject: [PATCH 11/11] remove logs --- apps/meteor/server/lib/oauth/configureOAuthServices.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/meteor/server/lib/oauth/configureOAuthServices.ts b/apps/meteor/server/lib/oauth/configureOAuthServices.ts index 0b8cf917c6229..7d73291720119 100644 --- a/apps/meteor/server/lib/oauth/configureOAuthServices.ts +++ b/apps/meteor/server/lib/oauth/configureOAuthServices.ts @@ -15,7 +15,7 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], const siteUrl = settings.get('Site_Url'); passport.unuse(config.provider); - console.log('CONFIG - ', config); + passport.use( config.provider, new Strategy( @@ -32,8 +32,6 @@ export const configureOAuthServices = (oauthServiceConfig: OAuthServiceConfig[], profileFields: ['id', 'displayName', 'emails'], }, async (accessToken: string, refreshToken: string, profile: Profile, done: DoneCallback) => { - console.log('twitterOAuth - ', { accessToken, refreshToken, profile }); - console.log('PROFILE - ', profile); const profileWithRaw = profile as Profile & { _json?: Record; _raw?: string }; const { _json, _raw, ...restProfile } = profileWithRaw;