Skip to content

Releases: oposs/edaptor

v1.8.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 13:50
cdcb3f3

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 as homeDirectory = "/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 as memberUid, pickers and free uidNumber/gidNumber ranges. Startup prints detecting profiles… and can take up to 10 seconds longer on a slow server; if detection fails or leaves containers unsampled, a widget whose candidate names a detected profile is left out, with a warning: line and a note in the status line.
  • edaptor profiles prints 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-only shows 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=groups when there is no group profile; no private group is assumed when users already under the profile's search_base show otherwise or when detection failed. edaptor profiles marks these values # assumed, and suppress removes them.
  • edaptor tui-create <profile> accepts detected profile names such as user-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 a suppress path 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 one note: line; edaptor profiles lists 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 edaptor works on macOS and Linux; .deb (amd64, arm64) and .rpm (x86_64, aarch64) packages are in the OETIKER+PARTNER registry at gitea.oetiker.ch. The installation guide has the commands.
  • man edaptor documents the command line. The page ships in the Homebrew formula, in the packages and, except on Windows, in the release archives.
  • edaptor --version prints 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 with suppress = ["companion"] (or only the private group's memberUid with "companion.memberUid"), a whole profile with enabled = false, or all detection with [detect] enabled = false; edaptor profiles shows what was added.
  • The profile chooser of edaptor tui-create hides detected organizational-unit and domain profiles unless --container is exactly their container.
  • edaptor passwd <user> prints detecting 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 sambaSamAccount now looks up the Samba domain, so the sambaSID field generates the SID without [samba] domain_sid; it stays off with [detect] enabled = false.
  • Profile names in widget candidate settings are matched without regard to case. candidate = "PosixGroup" now finds the profile posixgroup instead of failing with unknown 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 uidNumber is still being allocated no longer writes the text ‹allocating…› to the server. The save is refused with Still allocating uidNumber; save again in a moment., and fields filled from the number, such as gidNumber = "{uidNumber}" or the private group's gidNumber, stay empty until it arrives. If the allocation cannot start, the field is emptied and the status line says Could 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 a gidNumber range sees
    the gidNumber of user accounts too.

edaptor v1.7.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 16:21

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

Choose a tag to compare

@github-actions github-actions released this 17 Aug 07:33

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 unique overlay. Its rules are filtered
    (ldap:///?gidNumber?sub?(objectClass=posixGroup)) so a user-private group may
    share its account's gidNumber while 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 read Constraint violation and
    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

Choose a tag to compare

@github-actions github-actions released this 28 Jul 13:42

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, modifyTimestamp and modifiersName,
    labelled created / 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 and Home/End jump
    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 with Ctrl+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, schema NO-USER-MODIFICATION, read-only session,
    …). PageUp/PageDown still 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

Choose a tag to compare

@github-actions github-actions released this 27 Jul 15:27

1.5.3 - 2026-07-27

New

  • illumos / OmniOS builds. Releases now include an
    x86_64-unknown-illumos binary, 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

Choose a tag to compare

@github-actions github-actions released this 27 Jul 12:37

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 from cargo run were 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::new passes 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
    fresh Rect instead of mutating their parameter, which keeps the shared
    argument intact. cargo test --release reproduces the old failure.

edaptor v1.5.1

Choose a tag to compare

@github-actions github-actions released this 24 Jul 22:20

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

Choose a tag to compare

@github-actions github-actions released this 24 Jul 15:00

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 empty organizationalUnit vanished 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, domain and container
    (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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 14:01

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 lookup field'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
    show ordering (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

Choose a tag to compare

@github-actions github-actions released this 17 Jul 14:34

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
    uses sambaSID = "{auto:sambaSID}" in [profile.defaults] without also
    declaring a sambaSID widget 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
    sambaDomain entry, or the static [samba] domain_sid fallback), so it fills as
    documented.