diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-11-07 13:14:52 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-11-07 13:14:52 +0900 |
| commit | cb6f390fb6964a032f15c6885d686d07c945ad38 (patch) | |
| tree | e1e5d1de37ec20bc8b49c523fdaeff2227814944 /src/server/api/service/twitter.ts | |
| parent | Fix (diff) | |
| download | misskey-cb6f390fb6964a032f15c6885d686d07c945ad38.tar.gz misskey-cb6f390fb6964a032f15c6885d686d07c945ad38.tar.bz2 misskey-cb6f390fb6964a032f15c6885d686d07c945ad38.zip | |
GitHub / Twitter連携の設定をDBに保存するように
Diffstat (limited to 'src/server/api/service/twitter.ts')
| -rw-r--r-- | src/server/api/service/twitter.ts | 199 |
1 files changed, 101 insertions, 98 deletions
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index 6c3cdaa138..ced3e8accd 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -7,6 +7,7 @@ import User, { pack, ILocalUser } from '../../../models/user'; import { publishMainStream } from '../../../stream'; import config from '../../../config'; import signin from '../common/signin'; +import fetchMeta from '../../../misc/fetch-meta'; function getUserToken(ctx: Koa.Context) { return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1]; @@ -55,131 +56,133 @@ router.get('/disconnect/twitter', async ctx => { })); }); -if (config.twitter == null || redis == null) { - router.get('/connect/twitter', ctx => { - ctx.body = '現在Twitterへ接続できません (このインスタンスではTwitterはサポートされていません)'; - }); - - router.get('/signin/twitter', ctx => { - ctx.body = '現在Twitterへ接続できません (このインスタンスではTwitterはサポートされていません)'; - }); -} else { - const twAuth = autwh({ - consumerKey: config.twitter.consumer_key, - consumerSecret: config.twitter.consumer_secret, - callbackUrl: `${config.url}/api/tw/cb` - }); +async function getTwAuth() { + const meta = await fetchMeta(); - router.get('/connect/twitter', async ctx => { - if (!compareOrigin(ctx)) { - ctx.throw(400, 'invalid origin'); - return; - } + if (meta.enableTwitterIntegration) { + return autwh({ + consumerKey: meta.twitterConsumerKey, + consumerSecret: meta.twitterConsumerSecret, + callbackUrl: `${config.url}/api/tw/cb` + }); + } else { + return null; + } +} - const userToken = getUserToken(ctx); - if (userToken == null) { - ctx.throw(400, 'signin required'); - return; - } +router.get('/connect/twitter', async ctx => { + if (!compareOrigin(ctx)) { + ctx.throw(400, 'invalid origin'); + return; + } - const twCtx = await twAuth.begin(); - redis.set(userToken, JSON.stringify(twCtx)); - ctx.redirect(twCtx.url); - }); + const userToken = getUserToken(ctx); + if (userToken == null) { + ctx.throw(400, 'signin required'); + return; + } - router.get('/signin/twitter', async ctx => { - const twCtx = await twAuth.begin(); + const twAuth = await getTwAuth(); + const twCtx = await twAuth.begin(); + redis.set(userToken, JSON.stringify(twCtx)); + ctx.redirect(twCtx.url); +}); - const sessid = uuid(); +router.get('/signin/twitter', async ctx => { + const twAuth = await getTwAuth(); + const twCtx = await twAuth.begin(); - redis.set(sessid, JSON.stringify(twCtx)); + const sessid = uuid(); - const expires = 1000 * 60 * 60; // 1h - ctx.cookies.set('signin_with_twitter_session_id', sessid, { - path: '/', - domain: config.host, - secure: config.url.startsWith('https'), - httpOnly: true, - expires: new Date(Date.now() + expires), - maxAge: expires - }); + redis.set(sessid, JSON.stringify(twCtx)); - ctx.redirect(twCtx.url); + const expires = 1000 * 60 * 60; // 1h + ctx.cookies.set('signin_with_twitter_session_id', sessid, { + path: '/', + domain: config.host, + secure: config.url.startsWith('https'), + httpOnly: true, + expires: new Date(Date.now() + expires), + maxAge: expires }); - router.get('/tw/cb', async ctx => { - const userToken = getUserToken(ctx); + ctx.redirect(twCtx.url); +}); - if (userToken == null) { - const sessid = ctx.cookies.get('signin_with_twitter_session_id'); +router.get('/tw/cb', async ctx => { + const userToken = getUserToken(ctx); - if (sessid == null) { - ctx.throw(400, 'invalid session'); - return; - } + const twAuth = await getTwAuth(); + + if (userToken == null) { + const sessid = ctx.cookies.get('signin_with_twitter_session_id'); + + if (sessid == null) { + ctx.throw(400, 'invalid session'); + return; + } - const get = new Promise<any>((res, rej) => { - redis.get(sessid, async (_, twCtx) => { - res(twCtx); - }); + const get = new Promise<any>((res, rej) => { + redis.get(sessid, async (_, twCtx) => { + res(twCtx); }); + }); - const twCtx = await get; + const twCtx = await get; - const result = await twAuth.done(JSON.parse(twCtx), ctx.query.oauth_verifier); + const result = await twAuth.done(JSON.parse(twCtx), ctx.query.oauth_verifier); - const user = await User.findOne({ - host: null, - 'twitter.userId': result.userId - }) as ILocalUser; + const user = await User.findOne({ + host: null, + 'twitter.userId': result.userId + }) as ILocalUser; - if (user == null) { - ctx.throw(404, `@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`); - return; - } + if (user == null) { + ctx.throw(404, `@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`); + return; + } - signin(ctx, user, true); - } else { - const verifier = ctx.query.oauth_verifier; + signin(ctx, user, true); + } else { + const verifier = ctx.query.oauth_verifier; - if (verifier == null) { - ctx.throw(400, 'invalid session'); - return; - } + if (verifier == null) { + ctx.throw(400, 'invalid session'); + return; + } - const get = new Promise<any>((res, rej) => { - redis.get(userToken, async (_, twCtx) => { - res(twCtx); - }); + const get = new Promise<any>((res, rej) => { + redis.get(userToken, async (_, twCtx) => { + res(twCtx); }); + }); - const twCtx = await get; + const twCtx = await get; - const result = await twAuth.done(JSON.parse(twCtx), verifier); + const result = await twAuth.done(JSON.parse(twCtx), verifier); - const user = await User.findOneAndUpdate({ - host: null, - token: userToken - }, { - $set: { - twitter: { - accessToken: result.accessToken, - accessTokenSecret: result.accessTokenSecret, - userId: result.userId, - screenName: result.screenName - } + const user = await User.findOneAndUpdate({ + host: null, + token: userToken + }, { + $set: { + twitter: { + accessToken: result.accessToken, + accessTokenSecret: result.accessTokenSecret, + userId: result.userId, + screenName: result.screenName } - }); + } + }); - ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; + ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; - // Publish i updated event - publishMainStream(user._id, 'meUpdated', await pack(user, user, { - detail: true, - includeSecrets: true - })); - } - }); -} + // Publish i updated event + publishMainStream(user._id, 'meUpdated', await pack(user, user, { + detail: true, + includeSecrets: true + })); + } +}); module.exports = router; |