summaryrefslogtreecommitdiff
path: root/src/server/api/service/twitter.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-11-07 13:14:52 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-11-07 13:14:52 +0900
commitcb6f390fb6964a032f15c6885d686d07c945ad38 (patch)
treee1e5d1de37ec20bc8b49c523fdaeff2227814944 /src/server/api/service/twitter.ts
parentFix (diff)
downloadmisskey-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.ts199
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;