Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a5924086f4 | |||
| 89e4f90fc3 | |||
| 39b0b07a77 | |||
| 48c710bfbf |
@@ -58,7 +58,7 @@ function verifyAdmin(req, res, next) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const payload = jwt.verify(auth.slice(7), JWT_SECRET);
|
const payload = jwt.verify(auth.slice(7), JWT_SECRET);
|
||||||
if (!payload?.isAdmin) {
|
if (!payload?.user.isAdmin) {
|
||||||
return res.status(403).json({ error: toFriendlyError(403) });
|
return res.status(403).json({ error: toFriendlyError(403) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+33
-11
@@ -57,7 +57,12 @@ const healthPaths = {
|
|||||||
errors: "/health",
|
errors: "/health",
|
||||||
};
|
};
|
||||||
const testerRoutes = [
|
const testerRoutes = [
|
||||||
{ service: "auth", method: "POST", path: "/login", label: "Login (userCode + password)" },
|
{
|
||||||
|
service: "auth",
|
||||||
|
method: "POST",
|
||||||
|
path: "/login",
|
||||||
|
label: "Login (userCode + password)",
|
||||||
|
},
|
||||||
{ service: "auth", method: "GET", path: "/me", label: "Current session" },
|
{ service: "auth", method: "GET", path: "/me", label: "Current session" },
|
||||||
{
|
{
|
||||||
service: "employee",
|
service: "employee",
|
||||||
@@ -108,8 +113,8 @@ function App() {
|
|||||||
const [token, setToken] = useState(
|
const [token, setToken] = useState(
|
||||||
() => localStorage.getItem("transit-monitor-token") || "",
|
() => localStorage.getItem("transit-monitor-token") || "",
|
||||||
);
|
);
|
||||||
const [user, setUser] = useState(
|
const [user, setUser] = useState(() =>
|
||||||
() => JSON.parse(localStorage.getItem("transit-monitor-user") || "null"),
|
JSON.parse(localStorage.getItem("transit-monitor-user") || "null"),
|
||||||
);
|
);
|
||||||
const [health, setHealth] = useState({});
|
const [health, setHealth] = useState({});
|
||||||
const [history, setHistory] = useState({});
|
const [history, setHistory] = useState({});
|
||||||
@@ -129,7 +134,8 @@ function App() {
|
|||||||
const [loginLoading, setLoginLoading] = useState(false);
|
const [loginLoading, setLoginLoading] = useState(false);
|
||||||
const [loginError, setLoginError] = useState("");
|
const [loginError, setLoginError] = useState("");
|
||||||
|
|
||||||
const login = useCallback(async (userCode, password) => {
|
const login = useCallback(
|
||||||
|
async (userCode, password) => {
|
||||||
const url = urls.auth;
|
const url = urls.auth;
|
||||||
if (!url) {
|
if (!url) {
|
||||||
setLoginError("Auth API URL not configured");
|
setLoginError("Auth API URL not configured");
|
||||||
@@ -157,7 +163,9 @@ function App() {
|
|||||||
} finally {
|
} finally {
|
||||||
setLoginLoading(false);
|
setLoginLoading(false);
|
||||||
}
|
}
|
||||||
}, [urls.auth]);
|
},
|
||||||
|
[urls.auth],
|
||||||
|
);
|
||||||
|
|
||||||
const logout = useCallback(() => {
|
const logout = useCallback(() => {
|
||||||
setToken("");
|
setToken("");
|
||||||
@@ -590,7 +598,9 @@ function Docs() {
|
|||||||
<summary>API Routes</summary>
|
<summary>API Routes</summary>
|
||||||
<ul>
|
<ul>
|
||||||
{meta.routes.map((route) => (
|
{meta.routes.map((route) => (
|
||||||
<li key={route}><code>{route}</code></li>
|
<li key={route}>
|
||||||
|
<code>{route}</code>
|
||||||
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
@@ -855,7 +865,11 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
|
|||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
{loginError && <div className="login-error">{loginError}</div>}
|
{loginError && <div className="login-error">{loginError}</div>}
|
||||||
<button type="submit" className="run-button save-button" disabled={loginLoading}>
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="run-button save-button"
|
||||||
|
disabled={loginLoading}
|
||||||
|
>
|
||||||
{loginLoading ? "Logging in..." : "Login"}
|
{loginLoading ? "Logging in..." : "Login"}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -898,10 +912,18 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="user-info">
|
<div className="user-info">
|
||||||
<h3>Logged in as</h3>
|
<h3>Logged in as</h3>
|
||||||
<p><strong>User Code:</strong> {user?.userCode}</p>
|
<p>
|
||||||
<p><strong>Role:</strong> {user?.job}</p>
|
<strong>User Code:</strong> {user?.userCode}
|
||||||
<p><strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}</p>
|
</p>
|
||||||
<button className="ghost-button" onClick={logout}>Logout</button>
|
<p>
|
||||||
|
<strong>Role:</strong> {user?.job}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}
|
||||||
|
</p>
|
||||||
|
<button className="ghost-button" onClick={logout}>
|
||||||
|
Logout
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
className="run-button save-button"
|
className="run-button save-button"
|
||||||
|
|||||||
Reference in New Issue
Block a user