Repository navigation
Releases: oposs/edaptor
Release list
v1.8.0
New
- eDAPtor works out users, groups and their rules from the directory. A config with only
[server]and[auth]can now browse, edit and create entries: at startup eDAPtor samples each container and detects object classes, naming, the fields a form shows (for user accounts, the name fields first, then the password field), defaults such ashomeDirectory = "/home/{uid}", a login-shell list that adds the shells users already have (such as/bin/tcsh) to the built-in ones, user-private groups that list their user asmemberUid, pickers and freeuidNumber/gidNumberranges. Startup printsdetecting profiles…and can take up to 10 seconds longer on a slow server; if detection fails or leaves containers unsampled, a widget whosecandidatenames a detected profile is left out, with awarning:line and a note in the status line. edaptor profilesprints the profiles in effect as TOML you can paste into the config. Each value carries a comment saying whether it was detected (with how many entries agree), assumed, or set by the config;--detected-onlyshows detection before the config is applied. Warnings and notes go to stderr, and no password values are ever printed.- A new, empty directory gets useradd-style defaults. With no users yet, eDAPtor numbers users and groups from 10000 up (client machines use 1000 and up for their local users) and gives every new user a private group, placed in
ou=groupswhen there is no group profile; no private group is assumed when users already under the profile'ssearch_baseshow otherwise or when detection failed.edaptor profilesmarks these values# assumed, andsuppressremoves them. edaptor tui-create <profile>accepts detected profile names such asuser-people.- Startup prints a
warning:line on stderr for each detection problem caused by the config, such as a[[profile]]block that matches no detected profile or asuppresspath that matches nothing. Routine notes about the sample, such as a container it could not read or a sample cut short, are summed up in onenote:line;edaptor profileslists them one by one. When detection fails or drops parts, the TUI's status line says so until the first key press or a click in a pane. - eDAPtor is available from Homebrew and as Debian and RPM packages.
brew tap oposs/edaptor https://github.com/oposs/edaptor && brew install edaptorworks on macOS and Linux;.deb(amd64, arm64) and.rpm(x86_64, aarch64) packages are in the OETIKER+PARTNER registry atgitea.oetiker.ch. The installation guide has the commands. man edaptordocuments the command line. The page ships in the Homebrew formula, in the packages and, except on Windows, in the release archives.edaptor --versionprints the version.
Changed
- Detection is on for existing configs too and adds to hand-written profiles. Creating a user may now also write a second entry, its user-private group, because a
[[profile]]matching a detected profile receives the detected defaults, widgets and companion it does not set itself. Remove one part withsuppress = ["companion"](or only the private group'smemberUidwith"companion.memberUid"), a whole profile withenabled = false, or all detection with[detect] enabled = false;edaptor profilesshows what was added. - The profile chooser of
edaptor tui-createhides detected organizational-unit and domain profiles unless--containeris exactly their container. edaptor passwd <user>printsdetecting profiles…on stderr and searches only profiles with a password field or a password-bearing object class. A user whose private group has the same name no longer fails with "matches multiple entries".- Any profile that includes
sambaSamAccountnow looks up the Samba domain, so thesambaSIDfield generates the SID without[samba] domain_sid; it stays off with[detect] enabled = false. - Profile names in widget
candidatesettings are matched without regard to case.candidate = "PosixGroup"now finds the profileposixgroupinstead of failing withunknown candidate profile.
Fixed
- Picking a login shell for a user whose shell is not in the list now saves the pick. For a user with
/bin/tcsh, choosing "Zsh" or "Disabled (nologin)" kept/bin/tcsh; the same held for any single-choice field with a value outside its options. An unchanged value outside the options is still kept as it is. - Saving a new entry while its
uidNumberis still being allocated no longer writes the text‹allocating…›to the server. The save is refused withStill allocating uidNumber; save again in a moment., and fields filled from the number, such asgidNumber = "{uidNumber}"or the private group'sgidNumber, stay empty until it arrives. If the allocation cannot start, the field is emptied and the status line saysCould not allocate uidNumber: …. - The manual now describes
{next:MIN-MAX}correctly. It said the lowest
unused number is picked; eDAPtor actually takes one above the highest number in
range and never refills gaps. The page also notes that agidNumberrange sees
thegidNumberof user accounts too.
edaptor v1.7.0
1.7.0 - 2026-09-03
New
-
Middle-mouse paste (X11 primary selection). Middle-clicking a form field
pastes the primary selection at the click point, and sweeping a selection with
the left button publishes it — so the usual select-here, middle-click-there
gesture now works between eDAPtor and the rest of the desktop.It needs a display: over SSH (and on illumos, built without the native
clipboard) a middle click does nothing, and shift+middle-click is the
fallback — that bypasses eDAPtor and lets the terminal paste on its own.A masked field never publishes cleartext, revealed or not: revealing a
password is for reading it, not for handing it to another application. Pasting
into a password field still works.
Changed
Fixed
edaptor v1.6.1
1.6.1 - 2026-08-17
Changed
-
Error messages carry the LDAP result code, e.g.
Constraint violation (LDAP 19). It is the one searchable identifier for a failure, and it shows at a
glance when a bare code is genuinely all the server sent. -
The error dialog sizes itself to the message instead of a fixed 60×12 box,
so a message naming a DN and a reason is readable. Long values are wrapped, and
a DN with nowhere to wrap is broken rather than allowed to run past the frame. -
The test server provisions the
uniqueoverlay. Its rules are filtered
(ldap:///?gidNumber?sub?(objectClass=posixGroup)) so a user-private group may
share its account'sgidNumberwhile group gidNumbers stay unique — the
unfiltered form blocks every companion create.tests/live_unique_overlay.rs
pins both halves.
Fixed
- A failed write now says what went wrong. When a server rejects a
transactional create, it reports the result code at commit time with an empty
diagnostic message — schema errors are checked up front and explain themselves,
but overlay errors (unique,ppolicy, …) are deferred to the commit and their
reason is never sent. The dialog therefore readConstraint violationand
nothing else. eDAPtor now replays the rolled-back entries outside the
transaction to recover the server's real explanation, and shows it with the DN
of the entry that failed. The replay runs only after a rollback, stops at the
first failure, removes whatever it created, and names anything it could not
remove instead of leaving it behind silently.
edaptor v1.6.0
1.6.0 - 2026-07-28
New
- Audit block in the entry form. Below the attributes, separated by a blank
line, the entry pane now shows the entry's server-maintained
createTimestamp,creatorsName,modifyTimestampandmodifiersName,
labelledcreated/created by/modified/modified by.
They are read-only — reachable and copyable like any other read-only field,
but never part of a save — and the timestamps are
rendered in local time (2026-07-28 13:03:22) instead of the raw
20260728110322Z. The block refreshes after each save. Entry reads now request
these operational attributes explicitly; a server that does not return them
simply shows no block.
Changed
-
Multi-value blocks scroll sideways too. A member list, an
objectClass
set or any inline multi-value editor whose values are wider than the cell can
now be read to the end:←/→scroll a read-only block andHome/Endjump
to either edge, while the inline editor follows its caret.◄/►mark the
hidden text, and the scroll resets to the left edge when focus lands on the
field. -
Every field in the entry form is now selectable, editable or not. A
read-only field takes focus, so its value can be scrolled (◄/►mark the
hidden part), selected and copied withCtrl+C— previously such fields were
skipped by focus entirely, which made a value wider than its cell impossible to
read to its end. Trying to change one pops a dialog naming the field and the
reason (server-maintained, schemaNO-USER-MODIFICATION, read-only session,
…).PageUp/PageDownstill page the whole form, so long forms stay quick to
cross. -
A truncated DN title says so. When the entry pane is too narrow for the
full DN, the title is cut at the end with a trailing…— previously a cut DN
was indistinguishable from a short one.
Fixed
- A value wider than its cell now shows its start, not its end. Long values
(DNs, paths) were parked at their tail behind a◄marker, hiding the part
that identifies them; they now read from the beginning.
edaptor v1.5.3
1.5.3 - 2026-07-27
New
- illumos / OmniOS builds. Releases now include an
x86_64-unknown-illumosbinary, so eDAPtor runs on illumos hosts such as
OmniOS. The OS-native clipboard is not compiled in on that platform (its
Wayland dependency does not build there); clipboard copy falls back to OSC 52,
which is what works over ssh regardless.
Changed
Fixed
edaptor v1.5.2
1.5.2 - 2026-07-27
Fixed
- The entry form pane now scrolls like a proper scroll container. Scrolling a
long form — especially one with a read-only block taller than the pane, such as
a large group's member list — previously only worked with the arrow keys, and
only by moving focus from field to field. Now the mouse wheel,
PageUp/PageDown, and dragging the scrollbar move the viewport directly,
independent of which field is focused, and the scrollbar thumb tracks the
scroll position so it moves as you go. In particular, after scrolling to the
bottom you can always scroll back up again (previously the keys were swallowed
by whatever field focus had landed on — "no getting back up"). The scrollbar
thumb no longer sits frozen while you page through a tall block. - Release builds no longer draw the footer one row too high, leaving the
bottom terminal row dead. Every released/deployed binary laid the whole UI
out one row short: the status line landed on the second-to-last row and the
entry form lost its bottom line. Builds run fromcargo runwere unaffected,
which is why it only ever showed on installed binaries. The cause is a rustc
miscompilation (reproduced on 1.93.1, 1.95.0 and 1.96.0, at every
opt-level >= 1):Program::newpasses the same screen extent by value to the
desktop / status-line / menu-bar factory closures, and the optimiser does not
re-materialise that argument between calls, so each factory saw whatever the
previous one had written into its own copy. The three factories now derive a
freshRectinstead of mutating their parameter, which keeps the shared
argument intact.cargo test --releasereproduces the old failure.
edaptor v1.5.1
1.5.1 - 2026-07-24
Fixed
- The main window no longer sits one row too low with its bottom edge overlaid
by the footer. The window's bounds were built in screen-absolute coordinates
but applied as desktop-local ones, shifting the whole window down a row — a
blank strip appeared under the menu bar and the window's bottom border landed on
the status-line row. The window is now positioned in desktop-local space, so it
lines up correctly. - Read-only fields at the top or bottom of a long entry form can now be
scrolled into view. Read-only fields cannot take focus, and the entry form's
scroll follows the focused field — so a run of read-only fields below the
last editable field (or above the first) used to be stranded off-screen on a
form taller than the pane: the last field was never visible. Up/Down on the
first/last editable field now walks the viewport through that read-only
head/tail one line at a time before focus moves on, and the reveal stays put
instead of snapping back.
edaptor v1.5.0
1.5.0 - 2026-07-24
Changed
- The password editor's New/Confirm fields now use tvision-rs's native masked
field instead of eDAPtor's own hand-rolled masking. Behaviour for the operator
is the same or better: typing and pasting a password are robust (the fixes
below are now guaranteed by the framework, not a local mirror), and each field
gains a reveal eye in its last column — hold Space or press-and-hold the
eye with the mouse to peek at the password while editing. - The DIT browsing model now classifies containers by
objectClass, not by
whether they happen to have children. Previously a container was defined as
"an entry with ≥1 child", so an emptyorganizationalUnitvanished from the
DIT tree (it showed up misfiled in the Entries pane instead), and a
sub-OU that itself had children never appeared under its parent in the
Entries pane (the one-level find skipped it too). eDAPtor now recognizes
organizationalUnit,organization,dcObject,domainandcontainer
(case-insensitive) as containers regardless of child count, in addition to
"has children". The DIT tree lists every container, including empty ones;
the Entries pane lists all direct children — sub-containers alongside leaf
entries — with sub-containers marked with a▸prefix so they read distinct
from plain entries. Selecting a sub-container row opens its own entry in the
form for editing, exactly like the existing‹self›row.
Fixed
- Pasting into a multi-value field (e.g.
givenName) now works. The inline
multi-value editor is eDAPtor's own view rather than a plain input line, and it
was silently dropping the terminal's bracketed-paste event; it now inserts the
pasted text at the cursor, with each pasted line starting a new value. - Security: pasting into a password field no longer shows the pasted text in
the clear. The masked field forwarded the terminal's bracketed paste straight
to its inner input, which rendered the cleartext (and, worse, staged nothing
because the masked mirror was never updated). Paste is now masked exactly like
typed input — bullets on screen, the real value mirrored for staging — and
control characters (a trailing newline, tabs) are stripped. - The Set-password dialog now verifies that the two fields match before
accepting OK. Previously OK always closed the dialog, silently staging nothing
when New and Confirm differed (or were empty); it now refuses to close and
shows "The two passwords do not match." / "Enter a password." until they agree. - Fixed a crash (
removal index … should be < len …) when editing a password
field whose masked mirror had desynced (triggered by the paste bug above); the
backspace path is now bounds-safe as a belt-and-braces guard. - Read-only multi-value fields edited via the modal picker (
objectClass,
membership, choice, password, …) now scroll line-by-line when their value
block is taller than the form's viewport, instead of jumping straight to the
next field and leaving the block's lower lines unreachable below the frame.
edaptor v1.3.0
1.3.0 - 2026-07-23
New
-
Concurrent-edit protection (optimistic concurrency). When two people edit the
same entry, eDAPtor no longer lets the second save silently overwrite the first.
A save now asserts the version the entry had when you opened it; if it changed
underneath you, eDAPtor re-reads the entry and either rebases silently (when
the other change touched different attributes than yours) or, when your edits
overlap theirs, opens an "Entry changed" dialog offering Reload (discard your
edits and re-read), Overwrite (force your version), or Cancel (keep editing).
Against a server that does not advertise the assertion control, a one-time notice
warns that concurrent edits may be lost. -
Newly created entries now appear in the entry list immediately (and are
selected) instead of only after a restart; renamed entries move rather than
leaving a stale row behind. -
The entry list's incremental find is answered by the server (one-level search
under the selected container), so entries created by other clients are found
without a restart. Capped at 500 matches with a status-line notice. -
The
lookupfield's candidate list re-queries the server as you type instead
of filtering a one-shot, capped load — candidates past the first 100 are now
reachable. -
New Alt+R (File → Reload) re-runs the directory scan, keeping the selected
container and entry; the open edit form is left untouched. A reload that fails
now raises an error dialog instead of passing for a successful one. -
Status messages are now actually shown. The status line has a footer that
reports what just happened — "Saved.", the reload's entry count, a failed
search, a truncated find, and the one-time notice when the server does not
support concurrent-edit protection. These messages existed before but were
never rendered anywhere. A message is cleared as soon as you move on
(switching container, opening another entry, searching, or editing a field),
so it never hides the per-field key hints. -
Renaming a container now re-runs the scan, so its contents follow it under
the new name instead of disappearing from the tree until a restart. -
Editing an attribute used in a tree or list label now refreshes that label in
place, and the cached reverse-label lookups are dropped after every write
(they previously kept showing values eDAPtor itself had changed). -
The entry list and tree no longer move the form on their own. Rebuilding a
list (after a create, rename, reload or find) restores the highlight by DN
instead of by row number, so it can no longer land on the wrong entry. -
Typing a find query no longer interrupts you with the "unsaved changes"
prompt: the list narrows and highlights, but a form with unsaved edits stays
put until you navigate deliberately. -
When the entry you are editing is deleted by someone else, edaptor now says
so instead of silently moving you elsewhere — and if you have unsaved edits it
asks whether to keep them, discard them, or re-create the entry. -
Selecting a container now opens its first entry in the form pane instead of
only highlighting it — the entry pane no longer sits empty until you arrow onto
a row. (A container's first entry is likewise shown at startup.) An
edit-in-progress is never disturbed: the form only follows when nothing unsaved
is open.
Changed
Fixed
- Pasting into a form field now works. A terminal paste (middle-click,
Shift-Ctrl-V, or an X primary-selection paste) into a single-line field used to
do nothing; it now inserts at the cursor. (Fixed upstream in tvision-rs 0.13.1,
which edaptor now requires.) - Form no longer scrambles or re-orders after a save. Saving an entry used to
re-render the form with field labels and values misaligned and drop the profile
showordering (the form only realigned when you navigated to another entry and
back). The re-read after a save now keeps the entry's field order, and the form
pane realigns its cells whenever the field order changes.
edaptor v1.2.1
1.2.1 - 2026-07-17
Changed
- New-entry create form takes focus. Creating an entry (Alt-N) now moves the
keyboard focus straight to the entry editor (the right-hand form pane), so you
can start filling in fields immediately without Tabbing over from the tree/list.
Fixed
{auto:sambaSID}now resolves the Samba domain on its own. A profile that
usessambaSID = "{auto:sambaSID}"in[profile.defaults]without also
declaring asambaSIDwidget previously left the field empty, because the
Samba domain SID was only ever discovered when a widget was present. The computed
default now triggers the same domain discovery (auto-detected from a
sambaDomainentry, or the static[samba] domain_sidfallback), so it fills as
documented.