Skip to content

Commit 3b9beae

Browse files
committed
Various tweaks and backend improvements
1 parent 7331cb3 commit 3b9beae

File tree

12 files changed

+85
-19
lines changed

12 files changed

+85
-19
lines changed

backend/internal/certificate.js

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const certbotLogsDir = "/data/logs";
2424
const certbotWorkDir = "/tmp/letsencrypt-lib";
2525

2626
const omissions = () => {
27-
return ["is_deleted", "owner.is_deleted"];
27+
return ["is_deleted", "owner.is_deleted", "meta.dns_provider_credentials"];
2828
};
2929

3030
const internalCertificate = {
@@ -122,7 +122,7 @@ const internalCertificate = {
122122
}
123123

124124
// this command really should clean up and delete the cert if it can't fully succeed
125-
const certificate = await certificateModel.query().insertAndFetch(data).then(utils.omitRow(omissions()));
125+
const certificate = await certificateModel.query().insertAndFetch(data);
126126

127127
try {
128128
if (certificate.provider === "letsencrypt") {
@@ -202,6 +202,9 @@ const internalCertificate = {
202202
savedRow.meta = _.assign({}, savedRow.meta, {
203203
letsencrypt_certificate: certInfo,
204204
});
205+
206+
await internalCertificate.addCreatedAuditLog(access, certificate.id, savedRow);
207+
205208
return savedRow;
206209
} catch (err) {
207210
// Delete the certificate from the database if it was not created successfully
@@ -218,14 +221,18 @@ const internalCertificate = {
218221
data.meta = _.assign({}, data.meta || {}, certificate.meta);
219222

220223
// Add to audit log
224+
await internalCertificate.addCreatedAuditLog(access, certificate.id, utils.omitRow(omissions())(data));
225+
226+
return utils.omitRow(omissions())(certificate);
227+
},
228+
229+
addCreatedAuditLog: async (access, certificate_id, meta) => {
221230
await internalAuditLog.add(access, {
222231
action: "created",
223232
object_type: "certificate",
224-
object_id: certificate.id,
225-
meta: data,
233+
object_id: certificate_id,
234+
meta: meta,
226235
});
227-
228-
return certificate;
229236
},
230237

231238
/**
@@ -285,10 +292,7 @@ const internalCertificate = {
285292
.query()
286293
.where("is_deleted", 0)
287294
.andWhere("id", data.id)
288-
.allowGraph("[owner]")
289-
.allowGraph("[proxy_hosts]")
290-
.allowGraph("[redirection_hosts]")
291-
.allowGraph("[dead_hosts]")
295+
.allowGraph("[owner,proxy_hosts,redirection_hosts,dead_hosts,streams]")
292296
.first();
293297

294298
if (accessData.permission_visibility !== "all") {
@@ -305,7 +309,24 @@ const internalCertificate = {
305309
}
306310
// Custom omissions
307311
if (typeof data.omit !== "undefined" && data.omit !== null) {
308-
return _.omit(row, data.omit);
312+
return _.omit(row, [...data.omit]);
313+
}
314+
315+
return internalCertificate.cleanExpansions(row);
316+
},
317+
318+
cleanExpansions: (row) => {
319+
if (typeof row.proxy_hosts !== "undefined") {
320+
row.proxy_hosts = utils.omitRows(["is_deleted"])(row.proxy_hosts);
321+
}
322+
if (typeof row.redirection_hosts !== "undefined") {
323+
row.redirection_hosts = utils.omitRows(["is_deleted"])(row.redirection_hosts);
324+
}
325+
if (typeof row.dead_hosts !== "undefined") {
326+
row.dead_hosts = utils.omitRows(["is_deleted"])(row.dead_hosts);
327+
}
328+
if (typeof row.streams !== "undefined") {
329+
row.streams = utils.omitRows(["is_deleted"])(row.streams);
309330
}
310331
return row;
311332
},
@@ -415,7 +436,7 @@ const internalCertificate = {
415436
.query()
416437
.where("is_deleted", 0)
417438
.groupBy("id")
418-
.allowGraph("[owner,proxy_hosts,redirection_hosts,dead_hosts]")
439+
.allowGraph("[owner,proxy_hosts,redirection_hosts,dead_hosts,streams]")
419440
.orderBy("nice_name", "ASC");
420441

421442
if (accessData.permission_visibility !== "all") {
@@ -433,7 +454,11 @@ const internalCertificate = {
433454
query.withGraphFetched(`[${expand.join(", ")}]`);
434455
}
435456

436-
return await query.then(utils.omitRows(omissions()));
457+
const r = await query.then(utils.omitRows(omissions()));
458+
for (let i = 0; i < r.length; i++) {
459+
r[i] = internalCertificate.cleanExpansions(r[i]);
460+
}
461+
return r;
437462
},
438463

439464
/**

backend/models/certificate.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import deadHostModel from "./dead_host.js";
88
import now from "./now_helper.js";
99
import proxyHostModel from "./proxy_host.js";
1010
import redirectionHostModel from "./redirection_host.js";
11+
import streamModel from "./stream.js";
1112
import userModel from "./user.js";
1213

1314
Model.knex(db);
@@ -114,6 +115,17 @@ class Certificate extends Model {
114115
qb.where("redirection_host.is_deleted", 0);
115116
},
116117
},
118+
streams: {
119+
relation: Model.HasManyRelation,
120+
modelClass: streamModel,
121+
join: {
122+
from: "certificate.id",
123+
to: "stream.certificate_id",
124+
},
125+
modify: (qb) => {
126+
qb.where("stream.is_deleted", 0);
127+
},
128+
},
117129
};
118130
}
119131
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export type AccessListExpansion = "owner" | "items" | "clients";
22
export type AuditLogExpansion = "user";
3-
export type CertificateExpansion = "owner" | "proxy_hosts" | "redirection_hosts" | "dead_hosts";
3+
export type CertificateExpansion = "owner" | "proxy_hosts" | "redirection_hosts" | "dead_hosts" | "streams";
44
export type HostExpansion = "owner" | "certificate";
55
export type ProxyHostExpansion = "owner" | "access_list" | "certificate";
66
export type UserExpansion = "permissions";

frontend/src/components/Table/Formatter/CertificateInUseFormatter.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import OverlayTrigger from "react-bootstrap/OverlayTrigger";
22
import Popover from "react-bootstrap/Popover";
3-
import type { DeadHost, ProxyHost, RedirectionHost } from "src/api/backend";
3+
import type { DeadHost, ProxyHost, RedirectionHost, Stream } from "src/api/backend";
44
import { T } from "src/locale";
55

66
const getSection = (title: string, items: ProxyHost[] | RedirectionHost[] | DeadHost[]) => {
@@ -23,13 +23,34 @@ const getSection = (title: string, items: ProxyHost[] | RedirectionHost[] | Dead
2323
);
2424
};
2525

26+
const getSectionStream = (items: Stream[]) => {
27+
if (items.length === 0) {
28+
return null;
29+
}
30+
return (
31+
<>
32+
<div>
33+
<strong>
34+
<T id="streams" />
35+
</strong>
36+
</div>
37+
{items.map((stream) => (
38+
<div key={stream.id} className="ms-1">
39+
{stream.forwardingHost}:{stream.forwardingPort}
40+
</div>
41+
))}
42+
</>
43+
);
44+
};
45+
2646
interface Props {
2747
proxyHosts: ProxyHost[];
2848
redirectionHosts: RedirectionHost[];
2949
deadHosts: DeadHost[];
50+
streams: Stream[];
3051
}
31-
export function CertificateInUseFormatter({ proxyHosts, redirectionHosts, deadHosts }: Props) {
32-
const totalCount = proxyHosts?.length + redirectionHosts?.length + deadHosts?.length;
52+
export function CertificateInUseFormatter({ proxyHosts, redirectionHosts, deadHosts, streams }: Props) {
53+
const totalCount = proxyHosts?.length + redirectionHosts?.length + deadHosts?.length + streams?.length;
3354
if (totalCount === 0) {
3455
return (
3556
<span className="badge bg-red-lt">
@@ -41,13 +62,15 @@ export function CertificateInUseFormatter({ proxyHosts, redirectionHosts, deadHo
4162
proxyHosts.sort();
4263
redirectionHosts.sort();
4364
deadHosts.sort();
65+
streams.sort();
4466

4567
const popover = (
4668
<Popover id="popover-basic">
4769
<Popover.Body>
4870
{getSection("proxy-hosts", proxyHosts)}
4971
{getSection("redirection-hosts", redirectionHosts)}
5072
{getSection("dead-hosts", deadHosts)}
73+
{getSectionStream(streams)}
5174
</Popover.Body>
5275
</Popover>
5376
);

frontend/src/components/Table/Formatter/EventFormatter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconShield, IconUser } from "@tabler/icons-react";
2+
import cn from "classnames";
23
import type { AuditLog } from "src/api/backend";
34
import { DateTimeFormat, T } from "src/locale";
45

@@ -32,7 +33,7 @@ const getColorForAction = (action: string) => {
3233
};
3334

3435
const getIcon = (row: AuditLog) => {
35-
const c = getColorForAction(row.action);
36+
const c = cn(getColorForAction(row.action), "me-1");
3637
let ico = null;
3738
switch (row.objectType) {
3839
case "user":

frontend/src/hooks/useDeadHost.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const useSetDeadHost = () => {
5252
queryClient.invalidateQueries({ queryKey: ["dead-hosts"] });
5353
queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
5454
queryClient.invalidateQueries({ queryKey: ["host-report"] });
55+
queryClient.invalidateQueries({ queryKey: ["certificates"] });
5556
},
5657
});
5758
};

frontend/src/hooks/useProxyHost.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const useSetProxyHost = () => {
5959
queryClient.invalidateQueries({ queryKey: ["proxy-hosts"] });
6060
queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
6161
queryClient.invalidateQueries({ queryKey: ["host-report"] });
62+
queryClient.invalidateQueries({ queryKey: ["certificates"] });
6263
},
6364
});
6465
};

frontend/src/hooks/useRedirectionHost.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const useSetRedirectionHost = () => {
6363
queryClient.invalidateQueries({ queryKey: ["redirection-hosts"] });
6464
queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
6565
queryClient.invalidateQueries({ queryKey: ["host-report"] });
66+
queryClient.invalidateQueries({ queryKey: ["certificates"] });
6667
},
6768
});
6869
};

frontend/src/hooks/useStream.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const useSetStream = () => {
4848
queryClient.invalidateQueries({ queryKey: ["streams"] });
4949
queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
5050
queryClient.invalidateQueries({ queryKey: ["host-report"] });
51+
queryClient.invalidateQueries({ queryKey: ["certificates"] });
5152
},
5253
});
5354
};

frontend/src/pages/Certificates/Table.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export default function Table({ data, isFetching, onDelete, onRenew, onDownload,
7979
proxyHosts={r.proxyHosts}
8080
redirectionHosts={r.redirectionHosts}
8181
deadHosts={r.deadHosts}
82+
streams={r.streams}
8283
/>
8384
);
8485
},

0 commit comments

Comments
 (0)