summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-12-10 18:08:28 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-12-10 18:08:28 +0900
commit6f2fde0304f96089c9d6f05546ec3bbe5224a4b0 (patch)
treea15f43dbc640990efcbb7b0b12888b74cc57320a /src/api
parentRefactor (diff)
downloadsharkey-6f2fde0304f96089c9d6f05546ec3bbe5224a4b0.tar.gz
sharkey-6f2fde0304f96089c9d6f05546ec3bbe5224a4b0.tar.bz2
sharkey-6f2fde0304f96089c9d6f05546ec3bbe5224a4b0.zip
他のウェブサイトから直接MisskeyAPIを利用できるように
Diffstat (limited to 'src/api')
-rw-r--r--src/api/server.ts4
-rw-r--r--src/api/service/twitter.ts37
2 files changed, 35 insertions, 6 deletions
diff --git a/src/api/server.ts b/src/api/server.ts
index 463b3f0176..e89d196096 100644
--- a/src/api/server.ts
+++ b/src/api/server.ts
@@ -26,9 +26,7 @@ app.use(bodyParser.json({
}
}
}));
-app.use(cors({
- origin: true
-}));
+app.use(cors());
app.get('/', (req, res) => {
res.send('YEE HAW');
diff --git a/src/api/service/twitter.ts b/src/api/service/twitter.ts
index e03cd5accb..573895e8fe 100644
--- a/src/api/service/twitter.ts
+++ b/src/api/service/twitter.ts
@@ -12,15 +12,31 @@ import config from '../../conf';
import signin from '../common/signin';
module.exports = (app: express.Application) => {
- function getUserToken(req) {
+ function getUserToken(req: express.Request) {
// req.headers['cookie'] は常に string ですが、型定義の都合上
// string | string[] になっているので string を明示しています
return ((req.headers['cookie'] as string || '').match(/i=(!\w+)/) || [null, null])[1];
}
+ function compareOrigin(req: express.Request) {
+ function normalizeUrl(url: string) {
+ return url[url.length - 1] === '/' ? url.substr(0, url.length - 1) : url;
+ }
+
+ // req.headers['cookie'] は常に string ですが、型定義の都合上
+ // string | string[] になっているので string を明示しています
+ const referer = req.headers['referer'] as string;
+
+ return (normalizeUrl(referer) == normalizeUrl(config.url));
+ }
+
app.get('/disconnect/twitter', async (req, res): Promise<any> => {
- const userToken = getUserToken(req);
+ if (!compareOrigin(req)) {
+ res.status(400).send('invalid origin');
+ return;
+ }
+ const userToken = getUserToken(req);
if (userToken == null) return res.send('plz signin');
const user = await User.findOneAndUpdate({
@@ -59,8 +75,14 @@ module.exports = (app: express.Application) => {
});
app.get('/connect/twitter', async (req, res): Promise<any> => {
+ if (!compareOrigin(req)) {
+ res.status(400).send('invalid origin');
+ return;
+ }
+
const userToken = getUserToken(req);
if (userToken == null) return res.send('plz signin');
+
const ctx = await twAuth.begin();
redis.set(userToken, JSON.stringify(ctx));
res.redirect(ctx.url);
@@ -98,6 +120,7 @@ module.exports = (app: express.Application) => {
if (sessid == undefined) {
res.status(400).send('invalid session');
+ return;
}
redis.get(sessid, async (_, ctx) => {
@@ -109,13 +132,21 @@ module.exports = (app: express.Application) => {
if (user == null) {
res.status(404).send(`@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`);
+ return;
}
signin(res, user, true);
});
} else {
+ const verifier = req.query.oauth_verifier;
+
+ if (verifier == null) {
+ res.status(400).send('invalid session');
+ return;
+ }
+
redis.get(userToken, async (_, ctx) => {
- const result = await twAuth.done(JSON.parse(ctx), req.query.oauth_verifier);
+ const result = await twAuth.done(JSON.parse(ctx), verifier);
const user = await User.findOneAndUpdate({
token: userToken