-
- {e.href ? (
-
- {e.ziel}
-
- ) : (
- e.ziel
- )}
-
-
{e.pfad}
- {e.zusatz &&
{e.zusatz}
}
+
+
+
+
+ {e.href ? (
+
+ {e.ziel}
+
+ ) : (
+ e.ziel
+ )}
+
+
{e.pfad}
+ {e.zusatz &&
{e.zusatz}
}
+
+
-
+ {/* Aktionen unter dem Eintrag, damit lange Hostnamen nicht umbrechen (#016). */}
+ {e.aktionen}
);
@@ -92,7 +107,7 @@ function AusrollKarte({
);
}
-function privateEintraege(s: SchluesselDetail): Eintrag[] {
+function privateEintraege(s: SchluesselDetail, rechte: Rechte): Eintrag[] {
return s.privateVerwendungen.map((v) => {
const config =
v.sshConfig && typeof v.sshConfig === "object" ? (v.sshConfig as { alias?: unknown }) : null;
@@ -103,11 +118,22 @@ function privateEintraege(s: SchluesselDetail): Eintrag[] {
pfad: v.pfad,
...(typeof config?.alias === "string" ? { zusatz: `config: Host ${config.alias}` } : {}),
zustand: v.zustand,
+ aktionen: (
+
+ ),
};
});
}
-function publicEintraege(s: SchluesselDetail): Eintrag[] {
+type Rechte = { readonly public: boolean; readonly privat: boolean; readonly testen: boolean };
+
+function publicEintraege(s: SchluesselDetail, rechte: Rechte): Eintrag[] {
return s.publicVerwendungen.map((v) => ({
id: v.id,
ziel: v.host
@@ -121,6 +147,15 @@ function publicEintraege(s: SchluesselDetail): Eintrag[] {
pfad: "~/.ssh/authorized_keys",
...(v.optionen ? { zusatz: v.optionen } : {}),
zustand: v.zustand,
+ aktionen: (
+
+ ),
}));
}
@@ -159,6 +194,12 @@ export default async function SchluesselSeite({ params }: { params: Promise<{ id
if (!s) notFound();
const aktiv = s.status === "AKTIV";
+ const rechte: Rechte = {
+ public: darf(benutzer.rolle, "publicKeyAusrollen"),
+ privat: darf(benutzer.rolle, "privateKeyAusrollen"),
+ testen: darf(benutzer.rolle, "hostsVerwalten"),
+ };
+ const auswahl = aktiv && rechte.public ? await zielAuswahl() : undefined;
const personenKey = s.kategorie === "PERSON";
const verwalten = darf(benutzer.rolle, "schluesselVerwalten");
// Den Deployment-Key gibt sshkv nie heraus (#014) – Knoepfe dafuer erscheinen gar nicht erst.
@@ -243,7 +284,7 @@ export default async function SchluesselSeite({ params }: { params: Promise<{ id
}
/>
@@ -260,7 +304,7 @@ export default async function SchluesselSeite({ params }: { params: Promise<{ id
}
/>
+ {rechte.public &&
+ (s.publicVerwendungen.length > 0 || (rechte.privat && s.privateVerwendungen.length > 0)) && (
+