fix: Skipper-Signatur für WRITE-Collaborators und Events-Hash

WRITE-Collaborators dürfen Skipper-Freigaben leisten; der Eintrags-Hash sortiert events nach time, damit Umordnungen die Passkey-Signatur invalidieren.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-29 16:57:00 +02:00
co-authored by Cursor
parent 241b2fdf63
commit 1710007efe
4 changed files with 53 additions and 21 deletions
+3 -3
View File
@@ -98,7 +98,7 @@ export default function LogEntryEditor({
// Signatures
const [signSkipper, setSignSkipper] = useState<SignatureValue | ''>('')
const [signCrew, setSignCrew] = useState<SignatureValue | ''>('')
const [isOwner, setIsOwner] = useState(false)
const [canSignSkipper, setCanSignSkipper] = useState(false)
const [hasWriteCollaborators, setHasWriteCollaborators] = useState(false)
const [isOnline, setIsOnline] = useState(navigator.onLine)
const [entryHash, setEntryHash] = useState('')
@@ -211,7 +211,7 @@ export default function LogEntryEditor({
useEffect(() => {
getLogbookAccess(logbookId).then((access) => {
if (!access) return
setIsOwner(access.isOwner)
setCanSignSkipper(access.isOwner || access.role === 'WRITE')
setHasWriteCollaborators(access.writeCollaboratorCount > 0)
})
}, [logbookId])
@@ -1454,7 +1454,7 @@ export default function LogEntryEditor({
readOnly={readOnly}
disabled={saving}
isOnline={isOnline}
isOwner={isOwner}
canSignSkipper={canSignSkipper}
hasWriteCollaborators={hasWriteCollaborators}
signSkipper={signSkipper}
signCrew={signCrew}
+4 -4
View File
@@ -12,7 +12,7 @@ interface SignatureSectionProps {
readOnly?: boolean
disabled?: boolean
isOnline: boolean
isOwner: boolean
canSignSkipper: boolean
hasWriteCollaborators: boolean
signSkipper: SignatureValue | ''
signCrew: SignatureValue | ''
@@ -188,7 +188,7 @@ export default function SignatureSection({
readOnly = false,
disabled = false,
isOnline,
isOwner,
canSignSkipper,
hasWriteCollaborators,
signSkipper,
signCrew,
@@ -202,7 +202,7 @@ export default function SignatureSection({
}: SignatureSectionProps) {
const { t } = useTranslation()
const showSkipperPasskey = isOwner && isOnline
const showSkipperPasskey = canSignSkipper && isOnline
const showCrewPasskey = hasWriteCollaborators && isOnline
const hasSignature = !!(signSkipper || signCrew)
@@ -231,7 +231,7 @@ export default function SignatureSection({
readOnly={readOnly}
disabled={disabled}
classicHint={showSkipperPasskey ? t('logs.sign_classic_or_passkey') : undefined}
offlineHint={!isOnline && isOwner ? t('logs.sign_offline_hint') : undefined}
offlineHint={!isOnline && canSignSkipper ? t('logs.sign_offline_hint') : undefined}
onChange={onSignSkipperChange}
onPasskeySign={onPasskeySignSkipper}
onBeforeSign={onBeforeSign}