Files
shopdb-flask/plugins/tools/frontend/routes.js
cproudlock 92cf1d71f0
Some checks failed
CI / backend (push) Failing after 7m9s
CI / frontend (push) Has been cancelled
CI / migrations-mysql (push) Has been cancelled
CI / naming (push) Has been cancelled
Stop making people sign in to reach tools that need no account
/tools, /tools/codes and /tools/secure-send were all behind requiresAuth. None
of them needed to be, and one of them actively contradicted a setting added an
hour earlier: securesend_allow_guests lets somebody with no account create a
link, and the page they would create it on was behind a login wall.

The label generator runs entirely in the browser - no API, no data, nothing to
protect - so gating it only ever cost a guest the use of it.

THE SERVER STILL DECIDES who may create a secret. A signed-in user needs
tools.secrets; a guest needs the site to have opened guest creation. Making the
page reachable is not the same as making the action allowed, and the two were
conflated.

The page now reads the setting on load, so a guest at a site that has NOT opened
guest creation is told to sign in instead of being handed a form that was always
going to be refused - with a line saying that receiving a link never needs an
account, because somebody who lands there confused usually has a link they
should be opening instead.

A signed-in user always sees the form, even without the permission: the server's
"you do not have permission" is a different answer from "sign in", and
collapsing them would send somebody to a login page they are already past.
2026-08-21 16:00:18 -04:00

55 lines
2.1 KiB
JavaScript

/**
* Tech Tools plugin routes.
*
* `default` = AppLayout child routes; `toplevel` = full-screen routes.
*
* The generator sits INSIDE the app shell, unlike the label pages in core.
* Those are toplevel because a print from inside AppLayout would put the
* sidebar on the label stock - which is true unless the print stylesheet says
* otherwise, and style.css now does: the shell is hidden at print time so only
* the labels reach the page. A tool someone spends ten minutes in wants the
* navigation; a one-shot print page does not.
*/
export default [
{
path: 'tools',
name: 'tools',
component: () => import('./views/ToolsIndex.vue'),
// NO requiresAuth. Every tool here is usable without an account: the label
// generator runs entirely in the browser, and secure send decides for
// itself (a site can let guests create, and receiving never needs a login).
// Gating the index turned a public tool into one nobody could reach.
meta: { plugin: 'tools' }
},
{
path: 'tools/codes',
name: 'tools-codes',
component: () => import('./views/CodeGenerator.vue'),
// Browser-only: no API, no data, nothing to protect.
meta: { plugin: 'tools' }
},
{
path: 'tools/secure-send',
name: 'tools-secure-send',
component: () => import('./views/SecureSendCreate.vue'),
// Reachable by anyone; the SERVER decides who may actually create. A signed
// in user needs tools.secrets, and a guest needs the site to have turned on
// securesend_allow_guests. The page reads that setting so a guest who
// cannot create is told so, instead of being handed a form that 401s.
meta: { plugin: 'tools' }
},
]
// PUBLIC and OUTSIDE AppLayout. The recipient of a secret usually has no account
// here, so this page carries no navigation and asks for no login - the
// unguessable token in the path, and the key in the fragment, are what let them
// read it. Short path because the whole link gets pasted into a chat message.
export const toplevel = [
{
path: '/s/:token',
name: 'secure-send-read',
component: () => import('./views/SecureSendRead.vue'),
meta: { plugin: 'tools' }
},
]