Remove expiry params from attachment URL
This commit is contained in:
		
							parent
							
								
									1d99b91ef7
								
							
						
					
					
						commit
						6c1ae6aba1
					
				
					 2 changed files with 39 additions and 6 deletions
				
			
		| 
						 | 
					@ -13,6 +13,13 @@ const IMAGE_SIZE = 1024
 | 
				
			||||||
/** @type {Map<string, Promise<string>>} */
 | 
					/** @type {Map<string, Promise<string>>} */
 | 
				
			||||||
const inflight = new Map()
 | 
					const inflight = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param {string} url
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function _removeExpiryParams(url) {
 | 
				
			||||||
 | 
						return url.replace(/\?(?:(?:ex|is|sg|hm)=[a-f0-9]+&?)*$/, "")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {string} path
 | 
					 * @param {string} path
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -26,14 +33,17 @@ async function uploadDiscordFileToMxc(path) {
 | 
				
			||||||
		url = DISCORD_IMAGES_BASE + path
 | 
							url = DISCORD_IMAGES_BASE + path
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Discord attachment content is always the same no matter what their ?ex parameter is.
 | 
				
			||||||
 | 
						const urlNoExpiry = _removeExpiryParams(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Are we uploading this file RIGHT NOW? Return the same inflight promise with the same resolution
 | 
						// Are we uploading this file RIGHT NOW? Return the same inflight promise with the same resolution
 | 
				
			||||||
	const existingInflight = inflight.get(url)
 | 
						const existingInflight = inflight.get(urlNoExpiry)
 | 
				
			||||||
	if (existingInflight) {
 | 
						if (existingInflight) {
 | 
				
			||||||
		return existingInflight
 | 
							return existingInflight
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Has this file already been uploaded in the past? Grab the existing copy from the database.
 | 
						// Has this file already been uploaded in the past? Grab the existing copy from the database.
 | 
				
			||||||
	const existingFromDb = select("file", "mxc_url", "WHERE discord_url = ?").pluck().get(url)
 | 
						const existingFromDb = select("file", "mxc_url", "WHERE discord_url = ?").pluck().get(urlNoExpiry)
 | 
				
			||||||
	if (typeof existingFromDb === "string") {
 | 
						if (typeof existingFromDb === "string") {
 | 
				
			||||||
		return existingFromDb
 | 
							return existingFromDb
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -41,15 +51,15 @@ async function uploadDiscordFileToMxc(path) {
 | 
				
			||||||
	// Download from Discord
 | 
						// Download from Discord
 | 
				
			||||||
	const promise = fetch(url, {}).then(/** @param {import("node-fetch").Response} res */ async res => {
 | 
						const promise = fetch(url, {}).then(/** @param {import("node-fetch").Response} res */ async res => {
 | 
				
			||||||
		// Upload to Matrix
 | 
							// Upload to Matrix
 | 
				
			||||||
		const root = await module.exports._actuallyUploadDiscordFileToMxc(url, res)
 | 
							const root = await module.exports._actuallyUploadDiscordFileToMxc(urlNoExpiry, res)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Store relationship in database
 | 
							// Store relationship in database
 | 
				
			||||||
		db.prepare("INSERT INTO file (discord_url, mxc_url) VALUES (?, ?)").run(url, root.content_uri)
 | 
							db.prepare("INSERT INTO file (discord_url, mxc_url) VALUES (?, ?)").run(urlNoExpiry, root.content_uri)
 | 
				
			||||||
		inflight.delete(url)
 | 
							inflight.delete(urlNoExpiry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return root.content_uri
 | 
							return root.content_uri
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	inflight.set(url, promise)
 | 
						inflight.set(urlNoExpiry, promise)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return promise
 | 
						return promise
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -108,3 +118,4 @@ module.exports.stickerFormat = stickerFormat
 | 
				
			||||||
module.exports.sticker = sticker
 | 
					module.exports.sticker = sticker
 | 
				
			||||||
module.exports.uploadDiscordFileToMxc = uploadDiscordFileToMxc
 | 
					module.exports.uploadDiscordFileToMxc = uploadDiscordFileToMxc
 | 
				
			||||||
module.exports._actuallyUploadDiscordFileToMxc = _actuallyUploadDiscordFileToMxc
 | 
					module.exports._actuallyUploadDiscordFileToMxc = _actuallyUploadDiscordFileToMxc
 | 
				
			||||||
 | 
					module.exports._removeExpiryParams = _removeExpiryParams
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								matrix/file.test.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								matrix/file.test.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					// @ts-check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const {test} = require("supertape")
 | 
				
			||||||
 | 
					const file = require("./file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("removeExpiryParams: url without params is unchanged", t => {
 | 
				
			||||||
 | 
						const url = "https://cdn.discordapp.com/attachments/1154455830591176734/1157034603496882267/59ce542f-bf66-4d9a-83b7-ad6d05a69bac.jpg"
 | 
				
			||||||
 | 
						const result = file._removeExpiryParams(url)
 | 
				
			||||||
 | 
						t.equal(result, url)
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("removeExpiryParams: params are removed", t => {
 | 
				
			||||||
 | 
						const url = "https://cdn.discordapp.com/attachments/112760669178241024/1157363960518029322/image.png?ex=651856ae&is=6517052e&hm=88353defb15cbd833e6977817e8f72f4ff28f4edfd26b8ad5f267a4f2b946e69&"
 | 
				
			||||||
 | 
						const result = file._removeExpiryParams(url)
 | 
				
			||||||
 | 
						t.equal(result, "https://cdn.discordapp.com/attachments/112760669178241024/1157363960518029322/image.png")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("removeExpiryParams: rearranged params are removed", t => {
 | 
				
			||||||
 | 
						const url = "https://cdn.discordapp.com/attachments/112760669178241024/1157363960518029322/image.png?hm=88353defb15cbd833e6977817e8f72f4ff28f4edfd26b8ad5f267a4f2b946e69&ex=651856ae&is=6517052e"
 | 
				
			||||||
 | 
						const result = file._removeExpiryParams(url)
 | 
				
			||||||
 | 
						t.equal(result, "https://cdn.discordapp.com/attachments/112760669178241024/1157363960518029322/image.png")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue