From 4cfb360d44c5c6a963a37319c3570cbe85836d32 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 21 Apr 2018 19:02:12 +0900 Subject: Fix #1529 --- src/server/web/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/web') diff --git a/src/server/web/index.ts b/src/server/web/index.ts index eba0c372b0..db8d089d64 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -61,7 +61,7 @@ router.get('/manifest.json', async ctx => { router.use('/docs', docs.routes()); // URL preview endpoint -router.get('url', require('./url-preview')); +router.get('/url', require('./url-preview')); // Render base html for all requests router.get('*', async ctx => { -- cgit v1.2.3-freya From ed9e7520f19daf872907f32784c98324915714a4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 4 May 2018 17:59:51 +0900 Subject: Fix bug --- src/server/file/send-drive-file.ts | 8 +++++--- src/server/web/index.ts | 14 +++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) (limited to 'src/server/web') diff --git a/src/server/file/send-drive-file.ts b/src/server/file/send-drive-file.ts index 123f5440e2..dd682fe4d7 100644 --- a/src/server/file/send-drive-file.ts +++ b/src/server/file/send-drive-file.ts @@ -6,6 +6,8 @@ import * as mongodb from 'mongodb'; import DriveFile, { getDriveFileBucket } from '../../models/drive-file'; import DriveFileThumbnail, { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail'; +const assets = `${__dirname}/../../server/file/assets/`; + const commonReadableHandlerGenerator = (ctx: Koa.Context) => (e: Error): void => { console.error(e); ctx.status = 500; @@ -25,16 +27,16 @@ export default async function(ctx: Koa.Context) { if (file == null) { ctx.status = 404; - await send(ctx, `${__dirname}/assets/dummy.png`); + await send(ctx, `${__dirname}/assets/dummy.png`, { root: assets }); return; } if (file.metadata.deletedAt) { ctx.status = 410; if (file.metadata.isExpired) { - await send(ctx, `${__dirname}/assets/cache-expired.png`); + await send(ctx, `${__dirname}/assets/cache-expired.png`, { root: assets }); } else { - await send(ctx, `${__dirname}/assets/tombstone.png`); + await send(ctx, `${__dirname}/assets/tombstone.png`, { root: assets }); } return; } diff --git a/src/server/web/index.ts b/src/server/web/index.ts index db8d089d64..13751835be 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -42,17 +42,21 @@ router.get('/assets/*', async ctx => { // Apple touch icon router.get('/apple-touch-icon.png', async ctx => { - await send(ctx, `${client}/assets/apple-touch-icon.png`); + await send(ctx, '/assets/apple-touch-icon.png', { + root: client + }); }); // ServiceWroker -router.get(/^\/sw\.(.+?)\.js$/, async ctx => { - await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`); -}); +//router.get(/^\/sw\.(.+?)\.js$/, async ctx => { +// await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`); +//}); // Manifest router.get('/manifest.json', async ctx => { - await send(ctx, `${client}/assets/manifest.json`); + await send(ctx, '/assets/manifest.json', { + root: client + }); }); //#endregion -- cgit v1.2.3-freya From 440cf139bb7d5998523ae29c0c5e6394f570bc6c Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 6 May 2018 01:34:48 +0900 Subject: メタ情報をレンダリングするように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gulpfile.ts | 8 ++++++- package.json | 2 ++ src/client/app/base.pug | 12 +++++++++- src/renderers/get-note-summary.ts | 2 +- src/server/web/index.ts | 50 +++++++++++++++++++++++++++++++++++++++ src/server/web/views/note.pug | 20 ++++++++++++++++ src/server/web/views/user.pug | 19 +++++++++++++++ 7 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/server/web/views/note.pug create mode 100644 src/server/web/views/user.pug (limited to 'src/server/web') diff --git a/gulpfile.ts b/gulpfile.ts index df355e33e7..a9ccbbdb5e 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -59,9 +59,15 @@ gulp.task('build:ts', () => { .pipe(gulp.dest('./built/')); }); -gulp.task('build:copy', () => +gulp.task('build:copy:views', () => + gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views')) +); + +gulp.task('build:copy', ['build:copy:views'], () => gulp.src([ './build/Release/crypto_key.node', + './src/const.json', + './src/server/web/views/**/*', './src/**/assets/**/*', '!./src/client/app/**/assets/**/*' ]).pipe(gulp.dest('./built/')) diff --git a/package.json b/package.json index 73369b26f3..d4776a778c 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@types/koa-multer": "1.0.0", "@types/koa-router": "7.0.28", "@types/koa-send": "4.1.1", + "@types/koa-views": "^2.0.3", "@types/koa__cors": "2.2.2", "@types/kue": "0.11.8", "@types/license-checker": "15.0.0", @@ -146,6 +147,7 @@ "koa-router": "7.4.0", "koa-send": "4.1.3", "koa-slow": "2.1.0", + "koa-views": "^6.1.4", "kue": "0.11.6", "license-checker": "18.0.0", "loader-utils": "1.1.0", diff --git a/src/client/app/base.pug b/src/client/app/base.pug index 32a95a6c99..c182fd6f64 100644 --- a/src/client/app/base.pug +++ b/src/client/app/base.pug @@ -1,3 +1,5 @@ +block vars + doctype html != '\n\n' @@ -9,9 +11,17 @@ html meta(name='application-name' content='Misskey') meta(name='theme-color' content=themeColor) meta(name='referrer' content='origin') + meta(property='og:site_name' content='Misskey') link(rel='manifest' href='/manifest.json') - title Misskey + title + block title + | Misskey + + block desc + meta(name='description' content='A SNS') + + block meta style include ./../../../built/client/assets/init.css diff --git a/src/renderers/get-note-summary.ts b/src/renderers/get-note-summary.ts index dfc05ebfd6..0844c0b184 100644 --- a/src/renderers/get-note-summary.ts +++ b/src/renderers/get-note-summary.ts @@ -1,6 +1,6 @@ /** * 投稿を表す文字列を取得します。 - * @param {*} note 投稿 + * @param {*} note (packされた)投稿 */ const summarize = (note: any): string => { if (note.isHidden) { diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 13751835be..7d4f76665d 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -7,14 +7,32 @@ import * as Koa from 'koa'; import * as Router from 'koa-router'; import * as send from 'koa-send'; import * as favicon from 'koa-favicon'; +import * as views from 'koa-views'; import docs from './docs'; +import User from '../../models/user'; +import parseAcct from '../../acct/parse'; +import { fa } from '../../build/fa'; +import config from '../../config'; +import Note, { pack as packNote } from '../../models/note'; +import getNoteSummary from '../../renderers/get-note-summary'; +const consts = require('../../const.json'); const client = `${__dirname}/../../client/`; // Init app const app = new Koa(); +// Init renderer +app.use(views(__dirname + '/views', { + extension: 'pug', + options: { + config, + themeColor: consts.themeColor, + facss: fa.dom.css() + } +})); + // Serve favicon app.use(favicon(`${client}/assets/favicon.ico`)); @@ -67,6 +85,38 @@ router.use('/docs', docs.routes()); // URL preview endpoint router.get('/url', require('./url-preview')); +//#region for crawlers +// User +router.get('/@:user', async ctx => { + const { username, host } = parseAcct(ctx.params.user); + const user = await User.findOne({ + usernameLower: username.toLowerCase(), + host + }); + + if (user != null) { + await ctx.render('user', { user }); + } else { + ctx.status = 404; + } +}); + +// Note +router.get('/notes/:note', async ctx => { + const note = await Note.findOne({ _id: ctx.params.note }); + + if (note != null) { + const _note = await packNote(note); + await ctx.render('note', { + note: _note, + summary: getNoteSummary(_note) + }); + } else { + ctx.status = 404; + } +}); +//#endregion + // Render base html for all requests router.get('*', async ctx => { await send(ctx, `app/base.html`, { diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug new file mode 100644 index 0000000000..3107c0329c --- /dev/null +++ b/src/server/web/views/note.pug @@ -0,0 +1,20 @@ +extends ../../../../src/client/app/base + +block vars + - const user = note.user; + - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; + - const url = `${config.url}/notes/${note.id}`; + - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; + +block title + = `${title} | Misskey` + +block desc + meta(name='description' content= summary) + +block meta + meta(name='twitter:card' content='summary') + meta(property='og:title' content= title) + meta(property='og:description' content= summary) + meta(property='og:url' content= url) + meta(property='og:image' content= img) diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug new file mode 100644 index 0000000000..cdfacb32b4 --- /dev/null +++ b/src/server/web/views/user.pug @@ -0,0 +1,19 @@ +extends ../../../../src/client/app/base + +block vars + - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; + - const url = config.url + '/@' + (user.host ? `${user.username}@${user.host}` : user.username); + - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; + +block title + = `${title} | Misskey` + +block desc + meta(name='description' content= user.description) + +block meta + meta(name='twitter:card' content='summary') + meta(property='og:title' content= title) + meta(property='og:description' content= user.description) + meta(property='og:url' content= url) + meta(property='og:image' content= img) -- cgit v1.2.3-freya From 11716fa9d3abe67edf1e878a020cbb2cee71aa40 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 6 May 2018 01:37:32 +0900 Subject: Provide og:type --- src/server/web/views/note.pug | 1 + src/server/web/views/user.pug | 1 + 2 files changed, 2 insertions(+) (limited to 'src/server/web') diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index 3107c0329c..faf0e5d730 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -14,6 +14,7 @@ block desc block meta meta(name='twitter:card' content='summary') + meta(property='og:type' content='article') meta(property='og:title' content= title) meta(property='og:description' content= summary) meta(property='og:url' content= url) diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug index cdfacb32b4..b5ea2f6eb4 100644 --- a/src/server/web/views/user.pug +++ b/src/server/web/views/user.pug @@ -13,6 +13,7 @@ block desc block meta meta(name='twitter:card' content='summary') + meta(property='og:type' content='blog') meta(property='og:title' content= title) meta(property='og:description' content= user.description) meta(property='og:url' content= url) -- cgit v1.2.3-freya From 29ad7ab0cf1fc5d87d5ee3912356e6f330d43467 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 6 May 2018 01:43:53 +0900 Subject: Provide prev and next note link --- src/server/web/views/note.pug | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/server/web') diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index faf0e5d730..8cb1d954da 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -19,3 +19,8 @@ block meta meta(property='og:description' content= summary) meta(property='og:url' content= url) meta(property='og:image' content= img) + + if note.prev + link(rel='prev' href=`${config.url}/notes/${note.prev.id}`) + if note.next + link(rel='next' href=`${config.url}/notes/${note.next.id}`) -- cgit v1.2.3-freya From c32c3c137028e32695a5464b7a7fc9faa3f13d96 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 6 May 2018 01:46:35 +0900 Subject: Fix bug --- src/models/note.ts | 4 ++-- src/server/web/views/note.pug | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/server/web') diff --git a/src/models/note.ts b/src/models/note.ts index 3256a8c153..b2b93453e6 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -286,7 +286,7 @@ export const pack = async ( _id: -1 } }); - return prev ? prev._id : null; + return prev ? prev._id.toHexString() : null; })(); // Get next note info @@ -304,7 +304,7 @@ export const pack = async ( _id: 1 } }); - return next ? next._id : null; + return next ? next._id.toHexString() : null; })(); if (_note.replyId) { diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index 8cb1d954da..bc8dcdab8f 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -21,6 +21,6 @@ block meta meta(property='og:image' content= img) if note.prev - link(rel='prev' href=`${config.url}/notes/${note.prev.id}`) + link(rel='prev' href=`${config.url}/notes/${note.prev}`) if note.next - link(rel='next' href=`${config.url}/notes/${note.next.id}`) + link(rel='next' href=`${config.url}/notes/${note.next}`) -- cgit v1.2.3-freya From 650f79d0fdd63650cdab99debdb648d7cc49b5c9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 6 May 2018 02:08:27 +0900 Subject: Fix bugs --- src/server/web/url-preview.ts | 4 +++- src/server/web/views/note.pug | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/server/web') diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts index d5464d0cd4..8a5e934b1d 100644 --- a/src/server/web/url-preview.ts +++ b/src/server/web/url-preview.ts @@ -14,6 +14,8 @@ module.exports = async (ctx: Koa.Context) => { function wrap(url: string): string { return url != null - ? `https://images.weserv.nl/?url=${url.replace(/^https?:\/\//, '')}` + ? url.startsWith('https://') + ? url + : `https://images.weserv.nl/?url=${url.replace(/^http:\/\//, '')}` : null; } diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index bc8dcdab8f..22f1834059 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -4,7 +4,6 @@ block vars - const user = note.user; - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; - const url = `${config.url}/notes/${note.id}`; - - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; block title = `${title} | Misskey` @@ -18,7 +17,7 @@ block meta meta(property='og:title' content= title) meta(property='og:description' content= summary) meta(property='og:url' content= url) - meta(property='og:image' content= img) + meta(property='og:image' content= user.avatarUrl) if note.prev link(rel='prev' href=`${config.url}/notes/${note.prev}`) -- cgit v1.2.3-freya From d261fdbbc0a35dc4ad88af0278d28db8baccec0e Mon Sep 17 00:00:00 2001 From: mei23 Date: Wed, 9 May 2018 20:14:34 +0900 Subject: Fix can't preview some url --- src/client/app/common/views/components/url-preview.vue | 2 +- src/server/web/url-preview.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/web') diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index c2dc07b411..3bae6e5078 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -45,7 +45,7 @@ export default Vue.extend({ } else if (url.hostname == 'youtu.be') { this.youtubeId = url.pathname; } else { - fetch('/url?url=' + this.url).then(res => { + fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { res.json().then(info => { this.title = info.title; this.description = info.description; diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts index 8a5e934b1d..041c475a45 100644 --- a/src/server/web/url-preview.ts +++ b/src/server/web/url-preview.ts @@ -16,6 +16,6 @@ function wrap(url: string): string { return url != null ? url.startsWith('https://') ? url - : `https://images.weserv.nl/?url=${url.replace(/^http:\/\//, '')}` + : `https://images.weserv.nl/?url=${encodeURIComponent(url.replace(/^http:\/\//, ''))}` : null; } -- cgit v1.2.3-freya From f40e1ff0cc793e60ae72bdc430c24e372cd86015 Mon Sep 17 00:00:00 2001 From: mei23 Date: Thu, 10 May 2018 01:08:33 +0900 Subject: Fix cause error in case preview has data URI --- src/server/web/url-preview.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/web') diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts index 041c475a45..cd53837a25 100644 --- a/src/server/web/url-preview.ts +++ b/src/server/web/url-preview.ts @@ -14,7 +14,7 @@ module.exports = async (ctx: Koa.Context) => { function wrap(url: string): string { return url != null - ? url.startsWith('https://') + ? url.startsWith('https://') || url.startsWith('data:') ? url : `https://images.weserv.nl/?url=${encodeURIComponent(url.replace(/^http:\/\//, ''))}` : null; -- cgit v1.2.3-freya From d4b696d03af3eb86c7ac11c222d40b1006452ed5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 13 May 2018 17:00:34 +0900 Subject: Fix bug --- src/server/web/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/server/web') diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 7d4f76665d..6ceef17c1c 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -87,7 +87,7 @@ router.get('/url', require('./url-preview')); //#region for crawlers // User -router.get('/@:user', async ctx => { +router.get('/@:user', async (ctx, next) => { const { username, host } = parseAcct(ctx.params.user); const user = await User.findOne({ usernameLower: username.toLowerCase(), @@ -97,7 +97,8 @@ router.get('/@:user', async ctx => { if (user != null) { await ctx.render('user', { user }); } else { - ctx.status = 404; + // リモートユーザーなので + await next(); } }); -- cgit v1.2.3-freya