Changeset 9eb6e1b in Klonkt for src/routes/search.js
- Timestamp:
- 09/30/2026 06:41:45 AM (2 hours ago)
- Branches:
- main
- Children:
- 86cfa1a
- Parents:
- 3ceaef6
- File:
-
- 1 edited
-
src/routes/search.js (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/search.js
r3ceaef6 r9eb6e1b 27 27 import { t as i18nT, resolveLang } from '../services/i18n.js'; 28 28 import ActivityPubService from '../services/ActivityPubService.js'; 29 import ejs from 'ejs'; 30 import path from 'path'; 31 import { fileURLToPath } from 'url'; 29 32 import PermissionsService from '../services/PermissionsService.js'; 30 33 … … 99 102 const site = res.locals.site; 100 103 return !!(site && PermissionsService.canAdminSite(u, site)); 104 } 105 106 /** 107 * Haal het object achter een adres op: eerst als post, dan als profiel. 108 * 109 * Eén weg voor de zoekpagina en de live-preview. Staan ze los, dan verschilt er 110 * vroeg of laat iets -- de ondertekening bijvoorbeeld, en dan toont de preview 111 * een post als ontbrekend die de pagina wel vindt. 112 * 113 * ONDERTEKEND als de site: een post die alleen voor volgers zichtbaar is weigert 114 * een anonieme GET, en dan lijkt een bestaande post te ontbreken. 115 */ 116 async function lookUpRemote(remoteUri, site) { 117 let remote = null; 118 let remoteKind = null; 119 try { remote = await ActivityPubService.resolveRemoteNote(remoteUri, { asSlug: site.slug }); } catch { /* onbereikbaar */ } 120 if (remote) remoteKind = 'note'; 121 if (!remote) { 122 try { remote = await ActivityPubService.resolveRemoteActor(remoteUri); } catch { /* onbereikbaar */ } 123 if (remote) remoteKind = 'actor'; 124 } 125 const reacted = remoteKind === 'note' 126 ? ActivityPubService.getReaction(site.slug, remote.object_uri || remoteUri) 127 : { liked: false, boosted: false }; 128 return { remote, remoteKind, reacted }; 101 129 } 102 130 … … 214 242 const remoteUri = lookupUri(rawQ); 215 243 const mayLookup = remoteUri ? mayLookUp(req, res) : false; 216 let remote = null; 217 let remoteKind = null; 218 if (remoteUri && mayLookup) { 219 // Ondertekend als deze site: een post die alleen voor volgers zichtbaar is 220 // weigert een anonieme GET, en dan lijkt een bestaande post te ontbreken. 221 try { remote = await ActivityPubService.resolveRemoteNote(remoteUri, { asSlug: site.slug }); } catch { /* onbereikbaar */ } 222 if (remote) remoteKind = 'note'; 223 if (!remote) { 224 try { remote = await ActivityPubService.resolveRemoteActor(remoteUri); } catch { /* onbereikbaar */ } 225 if (remote) remoteKind = 'actor'; 226 } 227 } 244 const { remote, remoteKind, reacted: remoteReacted } = (remoteUri && mayLookup) 245 ? await lookUpRemote(remoteUri, site) 246 : { remote: null, remoteKind: null, reacted: { liked: false, boosted: false } }; 228 247 229 248 const r = searchSite(req, res, rawQ, { posts: 50, tracks: 25, events: 25, pages: 8 }); … … 234 253 total, queryError: r.queryError, 235 254 remoteUri, remote, remoteKind, mayLookup, 236 remoteReacted : (remoteKind === 'note') ? ActivityPubService.getReaction(site.slug, remote.object_uri || remoteUri) : { liked: false, boosted: false },255 remoteReacted, 237 256 siteTitle: site.title || '', 238 257 }); 258 }); 259 260 // ── De live-preview van een adres (HTML-fragment) ───────────────────────────── 261 // 262 // Plak je een link in de zoekbalk, dan haalt de uitklaplijst de post zelf op 263 // in plaats van te zoeken naar de tekst van de link (shaer-utpi). 264 // 265 // Dezelfde grens als de volle pagina, en hier weegt hij zwaarder: deze route 266 // wordt bij elke toetsaanslag geraakt, dus zonder die grens is hij een 267 // haalservice die iedereen deze server op adressen naar keuze laat afsturen. 268 // Mag je niet ophalen, of is het geen adres, dan 204: de zoekbalk valt dan 269 // terug op de gewone suggesties. Geen 403, want voor een bezoeker is een 270 // geplakte link gewoon een zoekterm en geen geweigerde handeling. 271 const VIEWS_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'views'); 272 273 router.get('/remote', async (req, res) => { 274 const site = res.locals.site; 275 const remoteUri = lookupUri(String(req.query.q || '').slice(0, 2048)); 276 if (!site || !remoteUri || !mayLookUp(req, res)) return res.status(204).end(); 277 const { remote, remoteKind, reacted } = await lookUpRemote(remoteUri, site); 278 // Dezelfde taal als de pagina eromheen, anders staat er een Engelse kaart 279 // in een Nederlandse zoekbalk. 280 const lang = resolveLang(req, { userLang: req.session?.user?.lang, defaultLang: getSetting('default_lang') }); 281 const html = await ejs.renderFile(path.join(VIEWS_DIR, 'partials', 'remote-preview.ejs'), { 282 t: (k, vars) => i18nT(lang, k, vars), 283 remote, remoteKind, remoteUri, reacted, 284 siteTitle: site.title || '', 285 }, { async: false }); 286 // Wat deze bezoeker ziet hangt van zijn rechten en zijn reacties af: niet 287 // bewaren, niet delen. 288 res.set('Cache-Control', 'private, no-store'); 289 res.type('html').send(html); 239 290 }); 240 291
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)