Procházet zdrojové kódy

Don't add the same OGP metadata multiple times

JC Brand před 4 roky
rodič
revize
9bac86fe1a

+ 76 - 47
package-lock.json

@@ -2757,8 +2757,7 @@
 			"dependencies": {
 				"filesize": {
 					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz",
-					"integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg=="
+					"resolved": false
 				},
 				"fs-extra": {
 					"version": "8.1.0",
@@ -2814,22 +2813,20 @@
 				},
 				"localforage": {
 					"version": "1.7.3",
-					"resolved": "https://registry.npmjs.org/localforage/-/localforage-1.7.3.tgz",
-					"integrity": "sha512-1TulyYfc4udS7ECSBT2vwJksWbkwwTX8BzeUIiq8Y07Riy7bDAAnxDaPU/tWyOVmQAcWJIEIFP9lPfBGqVoPgQ==",
+					"resolved": false,
 					"requires": {
 						"lie": "3.1.1"
 					}
 				},
 				"pluggable.js": {
 					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/pluggable.js/-/pluggable.js-2.0.1.tgz",
-					"integrity": "sha512-SBt6v6Tbp20Jf8hU0cpcc/+HBHGMY8/Q+yA6Ih0tBQE8tfdZ6U4PRG0iNvUUjLx/hVyOP53n0UfGBymlfaaXCg==",
+					"resolved": false,
 					"requires": {
 						"lodash": "^4.17.11"
 					}
 				},
 				"skeletor.js": {
-					"version": "github:skeletorjs/skeletor#bf6d9c86f9fcf224fa9d9af5a25380b77aa4b561",
+					"version": "0.0.1",
 					"from": "github:skeletorjs/skeletor#bf6d9c86f9fcf224fa9d9af5a25380b77aa4b561",
 					"requires": {
 						"lodash": "^4.17.14"
@@ -2837,11 +2834,7 @@
 				},
 				"strophe.js": {
 					"version": "github:strophe/strophejs#c4a94e59877c06dc2395f4ccbd26f3fee67a4c9f",
-					"from": "strophe.js@github:strophe/strophejs#c4a94e59877c06dc2395f4ccbd26f3fee67a4c9f",
-					"requires": {
-						"abab": "^2.0.3",
-						"xmldom": "^0.1.27"
-					}
+					"from": "strophe.js@github:strophe/strophejs#c4a94e59877c06dc2395f4ccbd26f3fee67a4c9f"
 				},
 				"twemoji": {
 					"version": "12.1.5",
@@ -4482,9 +4475,9 @@
 			}
 		},
 		"@octokit/openapi-types": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-4.0.1.tgz",
-			"integrity": "sha512-k2hRcfcLRyPJjtYfJLzg404n7HZ6sUpAWAR/uNI8tf96NgatWOpw1ocdF+WFfx/trO1ivBh7ckynO1rn+xAw/Q==",
+			"version": "5.2.1",
+			"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.2.1.tgz",
+			"integrity": "sha512-Bf7MBvQ1nMpv15ANaQtRBsC7YnwQFPM0eUztp3luQs9L6sBEiQ6ArM1Wx5CG+N7tXETtd0oE0DMcU4wbLlCZIw==",
 			"dev": true
 		},
 		"@octokit/plugin-enterprise-rest": {
@@ -4628,13 +4621,12 @@
 			}
 		},
 		"@octokit/types": {
-			"version": "6.8.2",
-			"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.8.2.tgz",
-			"integrity": "sha512-RpG0NJd7OKSkWptiFhy1xCLkThs5YoDIKM21lEtDmUvSpbaIEfrxzckWLUGDFfF8RydSyngo44gDv8m2hHruUg==",
+			"version": "6.11.1",
+			"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz",
+			"integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==",
 			"dev": true,
 			"requires": {
-				"@octokit/openapi-types": "^4.0.0",
-				"@types/node": ">= 8"
+				"@octokit/openapi-types": "^5.2.1"
 			}
 		},
 		"@sinonjs/commons": {
@@ -7169,16 +7161,16 @@
 			}
 		},
 		"conventional-commits-parser": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz",
-			"integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz",
+			"integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==",
 			"dev": true,
 			"requires": {
 				"JSONStream": "^1.0.4",
 				"is-text-path": "^1.0.1",
 				"lodash": "^4.17.15",
 				"meow": "^8.0.0",
-				"split2": "^2.0.0",
+				"split2": "^3.0.0",
 				"through2": "^4.0.0",
 				"trim-off-newlines": "^1.0.0"
 			},
@@ -11132,6 +11124,15 @@
 						"strip-indent": "^2.0.0"
 					}
 				},
+				"split2": {
+					"version": "2.2.0",
+					"resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
+					"integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+					"dev": true,
+					"requires": {
+						"through2": "^2.0.2"
+					}
+				},
 				"strip-indent": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
@@ -13407,9 +13408,9 @@
 			"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
 		},
 		"lodash-es": {
-			"version": "4.17.20",
-			"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.20.tgz",
-			"integrity": "sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA=="
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+			"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
 		},
 		"lodash._reinterpolate": {
 			"version": "3.0.0",
@@ -13885,12 +13886,12 @@
 					}
 				},
 				"resolve": {
-					"version": "1.19.0",
-					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
-					"integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+					"version": "1.20.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
 					"dev": true,
 					"requires": {
-						"is-core-module": "^2.1.0",
+						"is-core-module": "^2.2.0",
 						"path-parse": "^1.0.6"
 					}
 				},
@@ -13916,9 +13917,9 @@
 					"dev": true
 				},
 				"yargs-parser": {
-					"version": "20.2.4",
-					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
-					"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+					"version": "20.2.6",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.6.tgz",
+					"integrity": "sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==",
 					"dev": true
 				}
 			}
@@ -19077,9 +19078,9 @@
 					"dev": true
 				},
 				"query-string": {
-					"version": "6.14.0",
-					"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.0.tgz",
-					"integrity": "sha512-In3o+lUxlgejoVJgwEdYtdxrmlL0cQWJXj0+kkI7RWVo7hg5AhFtybeKlC9Dpgbr8eOC4ydpEh8017WwyfzqVQ==",
+					"version": "6.14.1",
+					"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz",
+					"integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==",
 					"dev": true,
 					"requires": {
 						"decode-uri-component": "^0.2.0",
@@ -20927,9 +20928,9 @@
 			}
 		},
 		"rxjs": {
-			"version": "6.6.3",
-			"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
-			"integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
+			"version": "6.6.6",
+			"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz",
+			"integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==",
 			"dev": true,
 			"requires": {
 				"tslib": "^1.9.0"
@@ -21388,9 +21389,9 @@
 			}
 		},
 		"sizzle": {
-			"version": "2.3.5",
-			"resolved": "https://registry.npmjs.org/sizzle/-/sizzle-2.3.5.tgz",
-			"integrity": "sha512-mncpQHS12IwzOpuMReKd2matojaS5M5Ofms96LUKOOg8S1M7jIh90OQyd2I6sBoHpxg/HoduOJNDTvRCmnm0YA=="
+			"version": "2.3.6",
+			"resolved": "https://registry.npmjs.org/sizzle/-/sizzle-2.3.6.tgz",
+			"integrity": "sha512-abtd95IkbcMAaYk1Lux4k9Xz6wnQqyLy2aco9HGJ8jVaCDEcc+ug0hW8RdV6aIre3ycWXxPdcX0u7QL/1UaSoA=="
 		},
 		"slash": {
 			"version": "2.0.0",
@@ -21978,12 +21979,40 @@
 			}
 		},
 		"split2": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
-			"integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+			"integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
 			"dev": true,
 			"requires": {
-				"through2": "^2.0.2"
+				"readable-stream": "^3.0.0"
+			},
+			"dependencies": {
+				"readable-stream": {
+					"version": "3.6.0",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+					"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+					"dev": true,
+					"requires": {
+						"inherits": "^2.0.3",
+						"string_decoder": "^1.1.1",
+						"util-deprecate": "^1.0.1"
+					}
+				},
+				"safe-buffer": {
+					"version": "5.2.1",
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+					"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+					"dev": true
+				},
+				"string_decoder": {
+					"version": "1.3.0",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+					"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+					"dev": true,
+					"requires": {
+						"safe-buffer": "~5.2.0"
+					}
+				}
 			}
 		},
 		"sprintf-js": {

+ 41 - 0
spec/unfurls.js

@@ -218,4 +218,45 @@ describe("A Groupchat Message", function () {
         expect(view.querySelector('converse-message-unfurl')).toBe(null);
         done();
     }));
+
+    it("will only render a single unfurl when receiving the same OGP data multiple times",
+            mock.initConverse(['chatBoxesFetched'], {}, async function (done, _converse) {
+        const nick = 'romeo';
+        const muc_jid = 'lounge@montague.lit';
+        await mock.openAndEnterChatRoom(_converse, muc_jid, nick);
+        const view = _converse.api.chatviews.get(muc_jid);
+
+        const message_stanza = u.toStanza(`
+            <message xmlns="jabber:client" type="groupchat" from="${muc_jid}/arzu" xml:lang="en" to="${_converse.jid}" id="eda6c790-b4f3-4c07-b5e2-13fff99e6c04">
+                <body>https://www.youtube.com/watch?v=dQw4w9WgXcQ</body>
+                <active xmlns="http://jabber.org/protocol/chatstates"/>
+                <origin-id xmlns="urn:xmpp:sid:0" id="eda6c790-b4f3-4c07-b5e2-13fff99e6c04"/>
+                <stanza-id xmlns="urn:xmpp:sid:0" by="${muc_jid}" id="8f7613cc-27d4-40ca-9488-da25c4baf92a"/>
+                <markable xmlns="urn:xmpp:chat-markers:0"/>
+            </message>`);
+        _converse.connection._dataRecv(mock.createRequest(message_stanza));
+        const el = await u.waitUntil(() => view.querySelector('.chat-msg__text'));
+        expect(el.textContent).toBe('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
+
+        spyOn(view.model, 'handleMetadataFastening').and.callThrough();
+
+        const metadata_stanza = u.toStanza(`
+            <message xmlns="jabber:client" from="${muc_jid}" to="${_converse.jid}" type="groupchat">
+                <apply-to xmlns="urn:xmpp:fasten:0" id="eda6c790-b4f3-4c07-b5e2-13fff99e6c04">
+                    <meta xmlns="http://www.w3.org/1999/xhtml" property="og:site_name" content="YouTube" />
+                    <meta xmlns="http://www.w3.org/1999/xhtml" property="og:url" content="https://www.youtube.com/watch?v=dQw4w9WgXcQ" />
+                    <meta xmlns="http://www.w3.org/1999/xhtml" property="og:title" content="Rick Astley - Never Gonna Give You Up (Video)" />
+                    <meta xmlns="http://www.w3.org/1999/xhtml" property="og:image" content="https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg" />
+                    <meta xmlns="http://www.w3.org/1999/xhtml" property="og:description" content="Rick Astley&amp;#39;s official music video for &quot;Never Gonna Give You Up&quot; Listen to Rick Astley: https://RickAstley.lnk.to/_listenYD Subscribe to the official Rick Ast..." />
+                </apply-to>
+            </message>`);
+        _converse.connection._dataRecv(mock.createRequest(metadata_stanza));
+        _converse.connection._dataRecv(mock.createRequest(metadata_stanza));
+        _converse.connection._dataRecv(mock.createRequest(metadata_stanza));
+
+        await u.waitUntil(() => view.model.handleMetadataFastening.calls.count());
+        const unfurls = await u.waitUntil(() => view.querySelectorAll('converse-message-unfurl'));
+        expect(unfurls.length).toBe(1);
+        done();
+    }));
 });

+ 6 - 1
src/headless/plugins/muc/muc.js

@@ -2139,7 +2139,12 @@ const ChatRoomMixin = {
                     log.warn("Not showing OGP data because we can't find the relevant URL in the original message");
                     return false;
                 }
-                const list = [...(message.get('ogp_metadata') || []), pick(attrs, METADATA_ATTRIBUTES)];
+                const old_list = (message.get('ogp_metadata') || []);
+                if (old_list.filter(m => m['og:url'] === attrs['og:url']).length) {
+                    // Don't add metadata for the same URL again
+                    return false;
+                }
+                const list = [...old_list, pick(attrs, METADATA_ATTRIBUTES)];
                 message.save('ogp_metadata', list);
                 return true;
             }

+ 1 - 1
src/plugins/muc-views/index.js

@@ -135,7 +135,7 @@ converse.plugins.add('converse-muc-views', {
             // _converse.chatboxes.on('add', addView);
         });
 
-        api.listen.on('clearSession', () => {
+        api.listen.on('clearsession', () => {
             const view = _converse.chatboxviews.get('controlbox');
             if (view && view.roomspanel) {
                 view.roomspanel.model.destroy();