Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions client/src/pages/makerspace_page/ExpandableHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { isManagerFor } from "../../common/PrivilegeUtils";
import EditIcon from "@mui/icons-material/Edit";
import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp";
import { FullMakerspace } from "../../queries/makerspaceQueries";
import { useNavigate } from "react-router-dom";
import { useNavigate, useSearchParams } from "react-router-dom";
import { useCurrentUser } from "../../common/CurrentUserProvider";
import MakerspaceHours from "../../types/MakerspaceHours";
import MakerspaceHoursSection from "./MakerspaceHours";
Expand Down Expand Up @@ -127,10 +127,12 @@ export default function ExpandableHeader({ makerspace, makerspaceTrainings }: Ex
const navigate = useNavigate();
const isMobile = useIsMobile();

const [expanded, setExpanded] = useState<boolean>(user.visitor);
const [searchParams, setSearchParams] = useSearchParams()
const startOpen = searchParams.get("o") == "1"
const [expanded, setExpanded] = useState<boolean>(user.visitor || startOpen);

return (
<Accordion expanded={expanded} sx={{ border: "none" }} elevation={0} onChange={() => setExpanded(!expanded)}>
<Accordion expanded={expanded} sx={{ border: "none" }} elevation={0} onChange={() => {setExpanded(!expanded); setSearchParams({"o":(!expanded) ? "1" : "0"})}}>
<AccordionSummary>
{TitleRow(
navigate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default function DevicesPage() {
const cores: Core[] = makerspaceWithDevicesResult.data?.makerspaceByID.cores ?? [];
const _dispensers: Dispenser[] = makerspaceWithDevicesResult.data?.makerspaceByID.dispensers ?? [];

const filteredCores: Core[] = cores.filter((core) => core.device.name.includes(searchText))
const filteredCores: Core[] = cores.filter((core) => core.device.name.toLowerCase().includes(searchText.toLowerCase()))

return (
<Stack padding={"10px"} spacing={1}>
Expand Down
8 changes: 5 additions & 3 deletions server/src/graphql/resolvers/maintenanceTicketResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,18 +165,20 @@ const MaintenanceTicketResolver = {
if (args.assignedID) {
const assigned = await UserRepo.getUserByID(args.assignedID);
await AuditLogRepo.createAuditLog(
`{user} assigned ticket #${args.id} to {user}`,
`{user} assigned ticket #${args.id} for {equipment} to {user}`,
"admin",
makerspaceID,
{ id: user.id, label: UserRepo.getUsersFullName(user) },
{ id: equipRow?.id ?? 0, label: equipRow?.name ?? "unknown equipment" },
{ id: assigned.id, label: UserRepo.getUsersFullName(assigned) }
);
} else {
await AuditLogRepo.createAuditLog(
`{user} unassigned ticket #${args.id}`,
`{user} unassigned ticket #${args.id} for {equipment}`,
"admin",
makerspaceID,
{ id: user.id, label: UserRepo.getUsersFullName(user) }
{ id: user.id, label: UserRepo.getUsersFullName(user) },
{ id: equipRow?.id ?? 0, label: equipRow?.name ?? "unknown equipment" }
);
}
}),
Expand Down
52 changes: 48 additions & 4 deletions server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import path from "path";
import * as schedule from "node-schedule";
import { getUserByCardTagID, getUsersFullName } from "./database/repositories/Users/UserRepository.js";
import { createUnassocaitedAuditLog } from "./database/repositories/AuditLogs/AuditLogRepository.js";
import { getReaderCertCA } from "./database/repositories/Readers/ReaderRepository.js";
import { getReaderCertCA, setReaderCertCA } from "./database/repositories/Readers/ReaderRepository.js";
import morgan from "morgan"; //Log provider
import { createRequire } from "module";
import { setDataPointValue } from "./database/repositories/DataPoints/DataPointsRepository.js";
Expand All @@ -43,10 +43,10 @@ import fs from "node:fs";
import { ViteDevServer } from "vite";
import { SiteSettings } from "./database/models/site_settings/SiteSettings.js";
import * as ThemeRepo from "./database/repositories/SiteSettings/ThemesRepository.js";
import { createHash } from 'node:crypto';

const require = createRequire(import.meta.url);

const allowed_origins = [process.env.VITE_ORIGIN, "https://studio.apollographql.com", "https://make.rit.edu", "https://shibboleth.main.ad.rit.edu"];
const SECURE_ORIGIN = (process.env.VITE_ORIGIN ?? "");
const __dirname = import.meta.dirname;

Expand Down Expand Up @@ -249,12 +249,32 @@ async function startServer() {
});
app.use("/api/files/", express.static(path.join(__dirname, '../../client/shlug-files/')));

app.get("/api/files/certCA", async function (req, res) {
app.get("/api/rootCA", async function (req, res) {
const SNHeader = 'shlug-sn';
if (!req.headers[SNHeader]) {
return res.status(401).send();
}
const SN = req.headers[SNHeader];
if (typeof SN !== "string") {
return res.status(401).send();
}

const device = await getDeviceBySN(SN);
if (device == null) {
return res.status(404).send();
}

const certca = (await getReaderCertCA())?.value;
if (certca == null) {
return res.status(404).send();
}
return res.send(certca);
const textForSha = `${device.SN}:${await device.generateKey()}:${certca}`
const sha = createHash('sha256').update(textForSha).digest('hex')
const result = {
cert: certca,
sha: sha,
}
return res.json(result);
})

app.get('/api/files/ota/:tagname', async function (req, res) {
Expand Down Expand Up @@ -542,6 +562,27 @@ async function startServer() {
createUnassocaitedAuditLog(`Trainings: Sent ${numNotified} expiry notices, and purged ${numPurged} expired trainings.`, "server")

}
async function updateRootCert() {
try {
const url = process.env.READER_CERT_URL;
if (url == undefined || url == "") {
console.error("Can not update root cert. No download URL provided");
return
}
const response = await fetch(url);

if (!response.ok) {
console.error(`Could not download new root cert. HTTP error: ${response.status}`)
return;
}

const certString = await response.text();
// normalize \r\n to \n
setReaderCertCA(certString.replace(/\r/g,""));
} catch (error) {
console.error(`Failed to update root cert: ${error}`)
}
}
/**
Cron Format:
* * * * * *
Expand Down Expand Up @@ -574,6 +615,9 @@ async function startServer() {
// Advance any time-based maintennace tickets from UPCOMING -> TODO
await advanceTimeTickets();

// Get a new root certificate for readers
await updateRootCert();

// Command all cores to restart for the periodic restart
await scheduledRestartAllCores();
});
Expand Down
Loading