From 2f19481147b12e2ae503ed3d1f28621c94447ac3 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 7 Mar 2022 11:48:53 +0100 Subject: Optimize markdown renderer --- server/helpers/markdown.ts | 54 ++++++++++++++++++++++++---------------- server/tests/helpers/markdown.ts | 6 +++++ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/server/helpers/markdown.ts b/server/helpers/markdown.ts index 25685ec6d..f9291bdad 100644 --- a/server/helpers/markdown.ts +++ b/server/helpers/markdown.ts @@ -7,8 +7,13 @@ const sanitizeHtml = require('sanitize-html') const markdownItEmoji = require('markdown-it-emoji/light') const MarkdownItClass = require('markdown-it') -const markdownItWithHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: true }) -const markdownItWithoutHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: false }) +const markdownItForSafeHtml = new MarkdownItClass('default', { linkify: true, breaks: true, html: true }) + .enable(TEXT_WITH_HTML_RULES) + .use(markdownItEmoji) + +const markdownItForPlainText = new MarkdownItClass('default', { linkify: false, breaks: true, html: false }) + .use(markdownItEmoji) + .use(plainTextPlugin) const toSafeHtml = (text: string) => { if (!text) return '' @@ -17,9 +22,7 @@ const toSafeHtml = (text: string) => { const textWithLineFeed = text.replace(//g, '\r\n') // Convert possible markdown (emojis, emphasis and lists) to html - const html = markdownItWithHTML.enable(TEXT_WITH_HTML_RULES) - .use(markdownItEmoji) - .render(textWithLineFeed) + const html = markdownItForSafeHtml.render(textWithLineFeed) // Convert to safe Html return sanitizeHtml(html, defaultSanitizeOptions) @@ -28,12 +31,10 @@ const toSafeHtml = (text: string) => { const mdToOneLinePlainText = (text: string) => { if (!text) return '' - markdownItWithoutHTML.use(markdownItEmoji) - .use(plainTextPlugin) - .render(text) + markdownItForPlainText.render(text) // Convert to safe Html - return sanitizeHtml(markdownItWithoutHTML.plainText, textOnlySanitizeOptions) + return sanitizeHtml(markdownItForPlainText.plainText, textOnlySanitizeOptions) } // --------------------------------------------------------------------------- @@ -47,30 +48,39 @@ export { // Thanks: https://github.com/wavesheep/markdown-it-plain-text function plainTextPlugin (markdownIt: any) { - let lastSeparator = '' - function plainTextRule (state: any) { const text = scan(state.tokens) - markdownIt.plainText = text.replace(/\s+/g, ' ') + // markdownIt.plainText = text.replace(/\s+/g, ' ') + markdownIt.plainText = text } function scan (tokens: any[]) { + let lastSeparator = '' let text = '' - for (const token of tokens) { - if (token.children !== null) { - text += scan(token.children) - continue - } - + function buildSeparator (token: any) { if (token.type === 'list_item_close') { lastSeparator = ', ' - } else if (/[a-zA-Z]+_close/.test(token.type)) { + } + + if (token.tag === 'br' || token.type === 'paragraph_close') { lastSeparator = ' ' - } else if (token.content) { - text += lastSeparator - text += token.content + } + } + + for (const token of tokens) { + buildSeparator(token) + + if (token.type !== 'inline') continue + + for (const child of token.children) { + buildSeparator(child) + + if (!child.content) continue + + text += lastSeparator + child.content + lastSeparator = '' } } diff --git a/server/tests/helpers/markdown.ts b/server/tests/helpers/markdown.ts index 0488a1a05..8177477f6 100644 --- a/server/tests/helpers/markdown.ts +++ b/server/tests/helpers/markdown.ts @@ -30,5 +30,11 @@ describe('Markdown helpers', function () { expect(result).to.equal('Hello coucou') }) + + it('Should convert tags to plain text', function () { + const result = mdToOneLinePlainText(`#déconversion\n#newage\n#histoire`) + + expect(result).to.equal('#déconversion #newage #histoire') + }) }) }) -- cgit v1.2.3 From 41878d33971473be3f4255c335b25b1ba869428f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 7 Mar 2022 11:52:29 +0100 Subject: Remove unnecessary comment --- server/helpers/markdown.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/server/helpers/markdown.ts b/server/helpers/markdown.ts index f9291bdad..a20ac22d4 100644 --- a/server/helpers/markdown.ts +++ b/server/helpers/markdown.ts @@ -51,7 +51,6 @@ function plainTextPlugin (markdownIt: any) { function plainTextRule (state: any) { const text = scan(state.tokens) - // markdownIt.plainText = text.replace(/\s+/g, ' ') markdownIt.plainText = text } -- cgit v1.2.3 From 2c7d736bd3089503117edb101d5a7d0f8fa3ee7e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 7 Mar 2022 13:39:50 +0100 Subject: Install git in docker image Can be needed to install plugins --- support/docker/production/Dockerfile.bullseye | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/docker/production/Dockerfile.bullseye b/support/docker/production/Dockerfile.bullseye index e55da3307..c57b878ee 100644 --- a/support/docker/production/Dockerfile.bullseye +++ b/support/docker/production/Dockerfile.bullseye @@ -2,7 +2,7 @@ FROM node:14-bullseye-slim # Install dependencies RUN apt update \ - && apt install -y --no-install-recommends openssl ffmpeg python3 ca-certificates gnupg gosu build-essential curl \ + && apt install -y --no-install-recommends openssl ffmpeg python3 ca-certificates gnupg gosu build-essential curl git \ && gosu nobody true \ && rm /var/lib/apt/lists/* -fR -- cgit v1.2.3 From 0c058f256a195b92f124be10109c95d1fbe93ad8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 7 Mar 2022 17:16:54 +0100 Subject: Remove exif tags when processing images --- .../reusable-prepare-peertube-run/action.yml | 2 +- server/helpers/image-utils.ts | 11 ++++ server/tests/fixtures/exif.jpg | Bin 0 -> 10877 bytes server/tests/fixtures/exif.png | Bin 0 -> 21059 bytes server/tests/helpers/image.ts | 58 +++++++++++++++++---- support/doc/development/tests.md | 8 ++- 6 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 server/tests/fixtures/exif.jpg create mode 100644 server/tests/fixtures/exif.png diff --git a/.github/actions/reusable-prepare-peertube-run/action.yml b/.github/actions/reusable-prepare-peertube-run/action.yml index 1a6cd2cfd..aa5b897c9 100644 --- a/.github/actions/reusable-prepare-peertube-run/action.yml +++ b/.github/actions/reusable-prepare-peertube-run/action.yml @@ -8,7 +8,7 @@ runs: - name: Setup system dependencies shell: bash run: | - sudo apt-get install postgresql-client-common redis-tools parallel + sudo apt-get install postgresql-client-common redis-tools parallel libimage-exiftool-perl wget --quiet --no-check-certificate "https://download.cpy.re/ffmpeg/ffmpeg-release-4.3.1-64bit-static.tar.xz" tar xf ffmpeg-release-4.3.1-64bit-static.tar.xz mkdir -p $HOME/bin diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index b174ae436..28d8fff4c 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts @@ -80,6 +80,8 @@ async function autoResize (options: { const sourceIsPortrait = sourceImage.getWidth() < sourceImage.getHeight() const destIsPortraitOrSquare = newSize.width <= newSize.height + removeExif(sourceImage) + if (sourceIsPortrait && !destIsPortraitOrSquare) { const baseImage = sourceImage.cloneQuiet().cover(newSize.width, newSize.height) .color([ { apply: 'shade', params: [ 50 ] } ]) @@ -106,6 +108,7 @@ function skipProcessing (options: { const { sourceImage, newSize, imageBytes, inputExt, outputExt } = options const { width, height } = newSize + if (hasExif(sourceImage)) return false if (sourceImage.getWidth() > width || sourceImage.getHeight() > height) return false if (inputExt !== outputExt) return false @@ -116,3 +119,11 @@ function skipProcessing (options: { return imageBytes <= 15 * kB } + +function hasExif (image: Jimp) { + return !!(image.bitmap as any).exifBuffer +} + +function removeExif (image: Jimp) { + (image.bitmap as any).exifBuffer = null +} diff --git a/server/tests/fixtures/exif.jpg b/server/tests/fixtures/exif.jpg new file mode 100644 index 000000000..2997b38e9 Binary files /dev/null and b/server/tests/fixtures/exif.jpg differ diff --git a/server/tests/fixtures/exif.png b/server/tests/fixtures/exif.png new file mode 100644 index 000000000..a1a0113f8 Binary files /dev/null and b/server/tests/fixtures/exif.png differ diff --git a/server/tests/helpers/image.ts b/server/tests/helpers/image.ts index 64bd373cc..475ca8fb2 100644 --- a/server/tests/helpers/image.ts +++ b/server/tests/helpers/image.ts @@ -4,6 +4,7 @@ import 'mocha' import { expect } from 'chai' import { readFile, remove } from 'fs-extra' import { join } from 'path' +import { execPromise } from '@server/helpers/core-utils' import { buildAbsoluteFixturePath, root } from '@shared/core-utils' import { processImage } from '../../../server/helpers/image-utils' @@ -20,40 +21,77 @@ async function checkBuffers (path1: string, path2: string, equals: boolean) { } } +async function hasTitleExif (path: string) { + const result = JSON.parse(await execPromise(`exiftool -json ${path}`)) + + return result[0]?.Title === 'should be removed' +} + describe('Image helpers', function () { const imageDestDir = join(root(), 'test-images') - const imageDest = join(imageDestDir, 'test.jpg') + + const imageDestJPG = join(imageDestDir, 'test.jpg') + const imageDestPNG = join(imageDestDir, 'test.png') + const thumbnailSize = { width: 223, height: 122 } it('Should skip processing if the source image is okay', async function () { const input = buildAbsoluteFixturePath('thumbnail.jpg') - await processImage(input, imageDest, thumbnailSize, true) + await processImage(input, imageDestJPG, thumbnailSize, true) - await checkBuffers(input, imageDest, true) + await checkBuffers(input, imageDestJPG, true) }) it('Should not skip processing if the source image does not have the appropriate extension', async function () { const input = buildAbsoluteFixturePath('thumbnail.png') - await processImage(input, imageDest, thumbnailSize, true) + await processImage(input, imageDestJPG, thumbnailSize, true) - await checkBuffers(input, imageDest, false) + await checkBuffers(input, imageDestJPG, false) }) it('Should not skip processing if the source image does not have the appropriate size', async function () { const input = buildAbsoluteFixturePath('preview.jpg') - await processImage(input, imageDest, thumbnailSize, true) + await processImage(input, imageDestJPG, thumbnailSize, true) - await checkBuffers(input, imageDest, false) + await checkBuffers(input, imageDestJPG, false) }) it('Should not skip processing if the source image does not have the appropriate size', async function () { const input = buildAbsoluteFixturePath('thumbnail-big.jpg') - await processImage(input, imageDest, thumbnailSize, true) + await processImage(input, imageDestJPG, thumbnailSize, true) + + await checkBuffers(input, imageDestJPG, false) + }) + + it('Should strip exif for a jpg file that can not be copied', async function () { + const input = buildAbsoluteFixturePath('exif.jpg') + expect(await hasTitleExif(input)).to.be.true + + await processImage(input, imageDestJPG, { width: 100, height: 100 }, true) + await checkBuffers(input, imageDestJPG, false) + + expect(await hasTitleExif(imageDestJPG)).to.be.false + }) + + it('Should strip exif for a jpg file that could be copied', async function () { + const input = buildAbsoluteFixturePath('exif.jpg') + expect(await hasTitleExif(input)).to.be.true + + await processImage(input, imageDestJPG, thumbnailSize, true) + await checkBuffers(input, imageDestJPG, false) + + expect(await hasTitleExif(imageDestJPG)).to.be.false + }) + + it('Should strip exif for png', async function () { + const input = buildAbsoluteFixturePath('exif.png') + expect(await hasTitleExif(input)).to.be.true - await checkBuffers(input, imageDest, false) + await processImage(input, imageDestPNG, thumbnailSize, true) + expect(await hasTitleExif(imageDestPNG)).to.be.false }) after(async function () { - await remove(imageDest) + await remove(imageDestDir) }) }) diff --git a/support/doc/development/tests.md b/support/doc/development/tests.md index 02fc41147..47602156c 100644 --- a/support/doc/development/tests.md +++ b/support/doc/development/tests.md @@ -31,6 +31,12 @@ $ sudo docker run -p 9444:9000 chocobozzz/s3-ninja $ sudo docker run -p 10389:10389 chocobozzz/docker-test-openldap ``` +Ensure you also have these commands: + +``` +$ exiftool --help +``` + ### Test To run all test suites: @@ -39,7 +45,7 @@ To run all test suites: $ npm run test # See scripts/test.sh to run a particular suite ``` -Most of tests can be runned using: +Most of tests can be run using: ```bash TS_NODE_TRANSPILE_ONLY=true npm run mocha -- --timeout 30000 --exit -r ts-node/register -r tsconfig-paths/register --bail server/tests/api/videos/video-transcoder.ts -- cgit v1.2.3 From 4c6d99e5b69b29e19d53ede14414b76beef815e2 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 08:50:38 +0100 Subject: Fix channel tests --- server/tests/fixtures/banner-resized.jpg | Bin 88780 -> 59947 bytes server/tests/shared/checks.ts | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/tests/fixtures/banner-resized.jpg b/server/tests/fixtures/banner-resized.jpg index 13ea422cb..952732d61 100644 Binary files a/server/tests/fixtures/banner-resized.jpg and b/server/tests/fixtures/banner-resized.jpg differ diff --git a/server/tests/shared/checks.ts b/server/tests/shared/checks.ts index 9ecc84b5d..8c8260088 100644 --- a/server/tests/shared/checks.ts +++ b/server/tests/shared/checks.ts @@ -25,21 +25,21 @@ async function expectLogDoesNotContain (server: PeerTubeServer, str: string) { expect(content.toString()).to.not.contain(str) } -async function testImage (url: string, imageName: string, imagePath: string, extension = '.jpg') { +async function testImage (url: string, imageName: string, imageHTTPPath: string, extension = '.jpg') { const res = await makeGetRequest({ url, - path: imagePath, + path: imageHTTPPath, expectedStatus: HttpStatusCode.OK_200 }) const body = res.body const data = await readFile(join(root(), 'server', 'tests', 'fixtures', imageName + extension)) - const minLength = body.length - ((30 * body.length) / 100) - const maxLength = body.length + ((30 * body.length) / 100) + const minLength = data.length - ((30 * data.length) / 100) + const maxLength = data.length + ((30 * data.length) / 100) - expect(data.length).to.be.above(minLength, 'the generated image is way smaller than the recorded fixture') - expect(data.length).to.be.below(maxLength, 'the generated image is way larger than the recorded fixture') + expect(body.length).to.be.above(minLength, 'the generated image is way smaller than the recorded fixture') + expect(body.length).to.be.below(maxLength, 'the generated image is way larger than the recorded fixture') } async function testFileExistsOrNot (server: PeerTubeServer, directory: string, filePath: string, exist: boolean) { -- cgit v1.2.3 From c47c3bcb0a9265d2a414ec96075052f8619d3f21 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 09:18:43 +0100 Subject: Fix multiple servers tests --- server/tests/api/videos/multiple-servers.ts | 2 +- server/tests/shared/checks.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index ecdd36613..854958f80 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -207,7 +207,7 @@ describe('Test multiple servers', function () { }, { resolution: 720, - size: 788000 + size: 750000 } ], thumbnailfile: 'thumbnail', diff --git a/server/tests/shared/checks.ts b/server/tests/shared/checks.ts index 8c8260088..dcc16d7ea 100644 --- a/server/tests/shared/checks.ts +++ b/server/tests/shared/checks.ts @@ -35,8 +35,8 @@ async function testImage (url: string, imageName: string, imageHTTPPath: string, const body = res.body const data = await readFile(join(root(), 'server', 'tests', 'fixtures', imageName + extension)) - const minLength = data.length - ((30 * data.length) / 100) - const maxLength = data.length + ((30 * data.length) / 100) + const minLength = data.length - ((40 * data.length) / 100) + const maxLength = data.length + ((40 * data.length) / 100) expect(body.length).to.be.above(minLength, 'the generated image is way smaller than the recorded fixture') expect(body.length).to.be.below(maxLength, 'the generated image is way larger than the recorded fixture') -- cgit v1.2.3 From f6f48301a9ad392759d714d2cff13f1564942a50 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 09:42:22 +0100 Subject: More robust transcoding checker --- server/middlewares/validators/videos/video-transcoding.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/middlewares/validators/videos/video-transcoding.ts b/server/middlewares/validators/videos/video-transcoding.ts index 34f231d45..da6638f4d 100644 --- a/server/middlewares/validators/videos/video-transcoding.ts +++ b/server/middlewares/validators/videos/video-transcoding.ts @@ -37,7 +37,7 @@ const createTranscodingValidator = [ // Prefer using job info table instead of video state because before 4.0 failed transcoded video were stuck in "TO_TRANSCODE" state const info = await VideoJobInfoModel.load(video.id) - if (info && info.pendingTranscode !== 0) { + if (info && info.pendingTranscode > 0) { return res.fail({ status: HttpStatusCode.CONFLICT_409, message: 'This video is already being transcoded' -- cgit v1.2.3 From e55079c90b0bc8ec287e6a09b981d53f2f46d379 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 3 Mar 2022 14:30:55 +0100 Subject: Fix stuck hls player with bad redundancy --- client/package.json | 4 ++-- .../src/assets/player/peertube-player-options-builder.ts | 6 +++++- client/yarn.lock | 16 ++++++++-------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/client/package.json b/client/package.json index 721f6ea84..26ca15210 100644 --- a/client/package.json +++ b/client/package.json @@ -53,8 +53,8 @@ "@ngx-loading-bar/core": "^6.0.0", "@ngx-loading-bar/http-client": "^6.0.0", "@ngx-loading-bar/router": "^6.0.0", - "@peertube/p2p-media-loader-core": "^1.0.5", - "@peertube/p2p-media-loader-hlsjs": "^1.0.7", + "@peertube/p2p-media-loader-core": "^1.0.6", + "@peertube/p2p-media-loader-hlsjs": "^1.0.8", "@peertube/videojs-contextmenu": "^5.5.0", "@peertube/xliffmerge": "^2.0.3", "@types/chart.js": "^2.9.16", diff --git a/client/src/assets/player/peertube-player-options-builder.ts b/client/src/assets/player/peertube-player-options-builder.ts index 71be5ccff..7a82b128d 100644 --- a/client/src/assets/player/peertube-player-options-builder.ts +++ b/client/src/assets/player/peertube-player-options-builder.ts @@ -268,10 +268,14 @@ export class PeertubePlayerOptionsBuilder { return { trackerAnnounce, - segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive), rtcConfig: getRtcConfig(), + simultaneousHttpDownloads: 1, + httpFailedSegmentTimeout: 1000, + + segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive), segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1), + useP2P: this.options.common.p2pEnabled, consumeOnly, diff --git a/client/yarn.lock b/client/yarn.lock index 2c2123c36..847fe77d2 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1564,10 +1564,10 @@ tslib "^2.3.0" yargs-parser "20.0.0" -"@peertube/p2p-media-loader-core@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@peertube/p2p-media-loader-core/-/p2p-media-loader-core-1.0.5.tgz#a9332cd35854be8641b04dd99a1fb444528ddaa8" - integrity sha512-AeZELrwP0LW+VO65MKFYwsObNr3uavoYp4pTnutX/Csv+S5ICT13o99lndfq5p1IKkS7UmDt5ffY9VFlr0GZrQ== +"@peertube/p2p-media-loader-core@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@peertube/p2p-media-loader-core/-/p2p-media-loader-core-1.0.6.tgz#e5d1b02aa60fe3a8b82dd486745d9ac8cdddbac0" + integrity sha512-S3xdYU5MPIf8LtXpd2EXtJJLIPtjQxRYbS3ytnx5t83/ALnP+p8OVR5u+sq3ghq5EMsxbCXUn29pR88BHSdyQw== dependencies: bittorrent-tracker "^9.16.1" debug "^4.3.1" @@ -1575,10 +1575,10 @@ sha.js "^2.4.11" simple-peer "^9.10.0" -"@peertube/p2p-media-loader-hlsjs@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@peertube/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-1.0.7.tgz#2246f9ad8c541efa031056fbc9e1ffe38bf391b5" - integrity sha512-fK5YchZUK1zjoCak+1KYLWt9fGBeIkUOx/joVw+suHoe8y16X6QTpYoB8FGaz+lNm8G6FOcDgcX7CEYu0I4azA== +"@peertube/p2p-media-loader-hlsjs@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@peertube/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-1.0.8.tgz#fb638709fe7155aecd978f4a58c03f660c3649f8" + integrity sha512-x+NNNdwiE87chZRv3RbDfWNvhAca1MkhmbF7vYwnQnBPZndpv6053dSnTUmckihRSAfW0wNi1evbFQ80ip57dw== dependencies: events "^3.3.0" m3u8-parser "^4.6.0" -- cgit v1.2.3 From ff36d20ae0b886a746b0ed9ec1d337201bb7a56e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 09:46:59 +0100 Subject: Update changelog --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dfd9fd1c..729faca7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## v4.1.1 + +### Security + + * Strip EXIF data and processing images + +### Docker + + * Fix videos import by installing python 3 + * Install `git` package (may be needed to install some plugins) + +### Bug fixes + + * Fix error when updating a live + * Fix performance regression when rendering HTML and feeds + * Fix player stuck by HTTP request error + + ## v4.1.0 ### IMPORTANT NOTES -- cgit v1.2.3 From a0cc70a45915c89df48de6205875a577fbfcd412 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 10:35:13 +0100 Subject: Fix changelog typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 729faca7b..e5e69b3f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Security - * Strip EXIF data and processing images + * Strip EXIF data when processing images ### Docker -- cgit v1.2.3 From 70f3012acd239be4567d9d9fa0364be75485ad1c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 8 Mar 2022 10:41:59 +0100 Subject: Bumped to version v4.1.1 --- client/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/package.json b/client/package.json index 26ca15210..690e3b982 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "peertube-client", - "version": "4.1.0", + "version": "4.1.1", "private": true, "license": "AGPL-3.0", "author": { diff --git a/package.json b/package.json index d96f9675c..fd94620dd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "peertube", "description": "PeerTube, an ActivityPub-federated video streaming platform using P2P directly in your web browser.", - "version": "4.1.0", + "version": "4.1.1", "private": true, "licence": "AGPL-3.0", "engines": { -- cgit v1.2.3