feat: validate required SSH permissions before creating server

- New server_permissions table (migration 007) stores required SSH permissions per server
- PermissionValidator service connects via SSH and validates each permission before save
- ServerPermission model for CRUD on server_permissions table
- Web flow: create/edit forms include dynamic permission rows with quick-add presets
- API flow: serverAdd/serverUpdate accept permissions array, return 400 on failure
- Show view displays required permissions on server detail page
- Form input preserved on validation failure (credentials excluded)
- AGENTS.md updated with new conventions
This commit is contained in:
2026-06-13 10:41:18 -04:00
parent 8f3b5bd7ce
commit 0cfed5bf27
10 changed files with 689 additions and 24 deletions

View File

@@ -3071,3 +3071,65 @@ textarea.form-input {
font-weight: 500;
color: var(--text-secondary);
}
/* --- Server permission rows --- */
.permission-row {
display: flex;
gap: 0.5rem;
align-items: center;
margin-bottom: 0.5rem;
padding: 0.5rem;
background: var(--bg-secondary, #f8f9fa);
border-radius: 6px;
border: 1px solid var(--border-color, #e0e0e0);
}
.permission-row .permission-type {
flex: 0 0 160px;
}
.permission-row .permission-value {
flex: 1 1 auto;
}
.permission-row .permission-desc {
flex: 0 0 200px;
}
.permission-row .btn-danger {
flex: 0 0 auto;
}
.permission-actions {
margin-top: 0.5rem;
}
.permission-presets {
margin-top: 0.75rem;
display: flex;
align-items: center;
gap: 0.4rem;
flex-wrap: wrap;
}
.permission-presets .preset-label {
font-size: 0.8rem;
color: var(--text-muted, #888);
margin-right: 0.25rem;
}
.btn-outline {
background: transparent;
border: 1px solid var(--border-color, #ccc);
color: var(--text-primary, #333);
padding: 0.25rem 0.6rem;
font-size: 0.8rem;
border-radius: 4px;
cursor: pointer;
transition: all 0.15s;
}
.btn-outline:hover {
background: var(--bg-hover, #e9ecef);
border-color: var(--text-muted, #888);
}