Repository navigation
Releases: skensell201/ldapper
Release list
Ldapper v0.6.1
Pick a theme yourself, a connection dialog that fits, and tidier scrollbars
on Windows.
Choose the theme
The title bar has a theme switch beside Connections: follow the system,
light, or dark. A pinned theme stays pinned across restarts. Choose "follow
the system" to go back to switching with the operating system. The choice
belongs to this machine, not to any connection.
The connection dialog fits
The dialog is now wide rather than tall. Where to connect is on the left and
who to connect as is on the right, so the whole form fits the window and
Connect is always in view. Before, it had to be scrolled.
Scrollbars on Windows
Windows drew its classic scrollbar, arrow buttons and all, cutting square
through the rounded panes and the dialog. It is now a thin rounded bar in a
clear track that keeps away from the corners, and it darkens under the
pointer. macOS keeps its own scrollbars, which already look this way.
Nothing else changed
No behaviour, no settings and no saved connections are touched.
Verified
318 Go tests, 63 frontend tests and 37 integration tests.
Ldapper v0.6.0
Ldapper has a new look, and now a light one as well as a dark one.
Light and dark
The window follows the system. In light mode it is a pale grey ground with
white cards lifted off it by a soft shadow; in dark mode the same layout sits
on graphite, with hairline edges where a shadow would not show. There is no
setting to find — change the system appearance and Ldapper changes with it.
Ink and three tones
The one thing to press on a screen — Connect, Search, Save, Copy DN — is an
ink-black pill in light mode and a white one in dark. Everything else is an
outlined pill or plain text, so the eye still finds the button that matters.
Colour now marks what a thing is rather than how important it is:
- Lilac is the interface pointing: the selected row, pane headings, the
selected saved connection, the edited mark on a filter. - Mint is time and health: decoded timestamps,
never, and a working
connection. - Rose is flags: the bits decoded from
userAccountControl.
Decoded values are token chips toned that way, so in an attribute table a SID,
a date and a flag can be told apart before they are read. Filter dialects get
the same treatment in the library — Active Directory, generic and POSIX each
have their own tone.
Roomier
Tree rows, result rows and attribute rows are a little taller, headings a
little larger, and fields and buttons a size up. The status bar shows each
fact about the connection as its own chip.
Fixed
- In the connection dialog, "Remember the password" was set in monospace and
wrapped mid-word: it was picking up a style meant for the filter editor.
Nothing else changed
This release is visual only. No behaviour, no settings and no saved
connections are touched.
Verified
318 Go tests, 56 frontend tests and 37 integration tests. The screenshots in
the README are retaken from this build's interface.
Ldapper v0.5.0
Ldapper has a new look, and its mark a new ink.
Plum and lavender
The window moves from aubergine and coral to a darker plum, with the panes
lifted a step above it rather than sunk below it. Depth comes from those steps
and from hairline edges — there are no drop shadows anywhere — and a faint
violet aurora sits behind the title bar.
Colour is rationed now, and each one means one thing:
- Lavender is the interface talking: pane headings, what is selected, the
version in the status bar. A selected row is a lavender wash with a bar at
its edge, where it used to be a solid coral block. - Green is the one button to press on a screen — Search, Connect, Save —
and a connection that is working. Nothing else is green, so the eye finds it. - Ember is kept for errors and for deleting things.
Buttons and switches are rounded rectangles instead of pills. Text is a warm
bone rather than pure white, which glared on the dark plum. Inputs have a
visible edge, and a lavender ring when they have focus.
The mark
The same two levels of a tree and three nodes, now inked in a single gradient
from violet at the root to ember at the leaf. The app icon, the Windows icon,
the favicon and every raster size are regenerated from assets/icon.svg.
Nothing else changed
This release is visual only. No behaviour, no settings and no saved
connections are touched.
Verified
318 Go tests, 49 frontend tests and 37 integration tests. The screenshots in
the README are retaken from this build's interface.
Ldapper v0.4.1
Windows gets its own title bar, drawn by Ldapper.
One bar instead of two
Windows was putting a light title bar above a dark application. Two bars, one
of them belonging to a different design entirely, and the name repeated in
both.
The window is frameless there now. Minimise, maximise and close sit at the end
of the same bar that carries the connection — sized and spaced the way Windows
does them, so the pointer lands where it expects to, with the close button
turning coral on approach. Double-clicking the bar maximises the window, and
dragging it moves the window, as before.
macOS is untouched. Its window controls belong to the system and already sit
inside this bar looking native; drawing our own there would be a second set.
One thing that could have gone badly
When the bar ran short of room, the item that gave way was the window controls
— which would have left no way to close the window at all. It is the
connection pill that shrinks now, and the controls never do.
For anyone working on the interface
npm run dev accepts ?platform=windows, which shows the chrome Windows gets.
It is the only way to look at it without a Windows machine, and it is how this
was checked.
Verified
318 Go tests, 49 frontend tests — including that the three buttons exist on
Windows and that none of them are drawn on macOS — and 37 integration tests.
Ldapper v0.4.0
Which build you are running is now on screen, and the README shows what
Ldapper looks like.
The version, where you will look for it
Bottom right of the status bar. It is the one place always on screen, it is
the first thing a bug report needs, and a separate About window for a tool
this size is a click nobody wants.
A build made without the stamp says dev rather than claiming a release it is
not, and a build from a working tree with uncommitted changes gets a +. The
tooltip carries the commit.
Screenshots
The README now shows browsing, searching, the filter library and the
connection dialog.
Two more fixes, found while taking them
- The heading above the attribute table showed
Volkova\2C Anna. The
unescaping added for the tree had never been applied there, so the two panes
disagreed about the same name. - Double-clicking a tree row to expand it also selected the label and started
a drag, which made the row look like it had come loose. - The scope selector wrapped "One level" onto two lines, making that segment
taller than the ones beside it.
For anyone working on the interface
npm run dev in frontend/ now runs the interface against a stand-in for the
Go side, so it can be worked on without building the application. It is the
same components and the same stylesheets — it is how the screenshots above
were taken.
Verified
318 Go tests, 46 frontend tests, 37 integration tests.
Ldapper v0.3.2
A connection's health now has a colour, and the title bar carries the mark.
Green, amber, red
The rest of the interface is deliberately aubergine and coral, but a
connection's health is not decoration — it is the one thing worth reading from
across the room.
- Green — connected over LDAPS or StartTLS, working.
- Amber — connected, but without TLS. Credentials are crossing the network
in the clear. It works, and you should know. - Red — the server could not be reached, or something went wrong since.
Both colours are pulled toward the aubergine so they belong to this interface
rather than looking like a traffic light bolted onto it. One function decides
which state applies, and the indicator in the title bar and the status bar
both read it — so they cannot disagree about what the dot means.
The status bar spells the state out beside the dot, and calls out an
unencrypted connection as no TLS rather than stating it flatly.
The title bar
It carries the Ldapper mark now, beside the name.
The left inset that macOS needs for its window controls was being applied
everywhere, which pushed the name off centre on Windows. Only macOS gets it.
Verified
315 Go tests, 41 frontend tests, 37 integration tests. The health states have
tests of their own, including the one that matters most: an error outranks an
open connection, because saying "Connected" over the top of a failure would be
a lie.
Ldapper v0.3.1
Fixes from the first run against a real domain controller.
Active Directory is recognised again
This is the one that mattered. 1.2.840.113556.1.4.800 is a capability, and
Active Directory publishes it in supportedCapabilities — never in
supportedControl, which is where Ldapper looked for it.
Every domain controller was therefore reported as plain LDAP. The status bar
said so, and all twelve Active Directory filters sat greyed out with a message
explaining that the server did not support them. It did.
If you connected to a domain and wondered why the filters were unavailable,
that was why.
The bound identity fits now
CN=SpaceReader,OU=Service Accounts,DC=da,DC=lan ran off the end of the
connection pill and was cut mid-word. Only the leftmost value is shown —
SpaceReader — with the whole name in the tooltip. A comma inside a name is
unescaped there too.
The status bar agrees with the chrome
They described the connection separately and could drift apart. They share an
indicator and a colour now: white when connected, coral when something went
wrong. An unencrypted connection is called out rather than stated flatly.
Run and Delete look like controls
Both read as labels that happened to be clickable. Run is outlined as the
thing you came to the editor to press. Delete shows its intent on approach
instead of sitting permanently red next to Save.
Verified
315 Go tests, 33 frontend tests, 37 integration tests. The Active Directory
detection has tests covering a domain controller's real capability list, a
server that republishes the marker among its controls, and OpenLDAP, which
publishes neither and must not be mistaken for a domain.
Ldapper v0.3.0
The interface is now tested, not just built — and there is a single command
that opens Ldapper against a real directory with nothing to fill in.
The window has tests now
Twenty-four of them, rendering every pane with the shapes the Go side actually
produces. This closes the gap that mattered most: until now the panes were
verified by reading them, and the one time that was not enough, the
application opened to an empty rectangle.
They cover what would break silently — a pane crashing on real data, a
decoded value not reaching the screen, a search batch arriving from Go and not
appearing, a truncated search reported as "found nothing", a filter the server
cannot answer being hidden instead of greyed.
Connect without an account
Plenty of directories allow reading without credentials, and Ldapper had no
way to ask. Anonymous joins NTLM and simple bind in the connection dialog,
and the credential fields step aside when it is chosen.
The connection dialog lists your connections
It had no way to pick among saved connections at all: it silently edited the
first one and read its values once, so opening it a moment early showed
factory defaults over a connection that was already there — with nothing on
screen to explain it. There is now a list of saved connections with a + New
beside them.
One command to see it
make demoA directory of 2594 entries in Docker, a connection saved for it, and the
application open and pointed at it. Press Connect. make demo-down when done.
Also fixed
- A binding that returns nothing — the Go side failing in a way it could not
report — left the window silently empty. It now says the directory did not
answer. - Errors while loading saved connections were swallowed, producing the same
unexplained empty form.
Verified
313 Go tests, 24 frontend tests, 37 integration tests against OpenLDAP. The
Windows build compiles and links in CI but still has not been run by hand.
Ldapper v0.2.1
Three bugs found by pointing Ldapper at a directory built to be awkward rather
than tidy. All three are the kind that only show up against real data.
Fixed
- A comma inside a name was shown as its escape sequence.
Volkova, Anna
came back from the server asVolkova\2C Anna— orVolkova\, Anna,
depending on the server — and the tree showed it that way. Names are now
unescaped for display while the distinguished name keeps its escapes, which
is what makes it usable as an identifier. - CSV could not be read back reliably. Multiple values were joined with
"; ", so a single value that happened to contain a semicolon looked
identical to several values. Values are now separated by newlines inside the
quoted field, which a spreadsheet shows as line breaks and a CSV reader
parses back exactly. - The built-in "empty groups" filter never matched anything. It looked only
atgroupandgroupOfNames, and both require a member by schema — a
genuinely empty group is almost always aposixGroup. The filter now covers
that case, anduniqueMemberbesides.
Also in this release
dev/directory/ — a generator and a compose file for a directory worth
exploring: 2594 entries, groups of 3 to 500 members, POSIX accounts, 60
computers, and the awkward cases that found the bugs above. A comma inside a
name, Cyrillic in every field, semicolons inside a value, a 900-character
value, and an entry missing an attribute the table has a column for.
docker compose -f dev/directory/docker-compose.yml up -d --waitThen connect to localhost:4389 as cn=admin,dc=example,dc=com with the
password adminpassword.
Verified
311 unit tests and 37 integration tests, the latter now including an entry
whose name contains a comma — checked all the way from the server to the label
the interface would draw. Everything above was also confirmed by hand against
the development directory: 2508 people paged in three round trips, a
500-member group exported in full, a 900-character value surviving LDIF, and
Cyrillic base64-encoded correctly.
Ldapper v0.2.0
Search, the filter library and export. With these, everything the v1 design
called for is in place: read, search, filter, export. Still strictly
read-only.
New in this release
- Search streams as it runs. Results appear while the server is still
walking the tree rather than after it finishes, and Stop halts a search
partway and says how far it got. A filter is compiled locally first, so a
malformed one never reaches the server — where the answer would be a
protocol error that says nothing about which part was wrong. - The filter library with its editor. All 18 built-in filters are
editable, a changed one is marked, and Reset returns it to the version
Ldapper ships. Deleting a built-in makes it stay deleted across updates.
Filters the connected server cannot answer are greyed with the reason,
never hidden — a greyed row tells you something, a missing one does not. - Substitutions resolve as you type.
{{now-90d:filetime}}shows the
18-digit Windows FILETIME it becomes before you run anything. - Export to LDIF and CSV, written straight to the file you choose. A
subtree export never passes through the interface, which is exactly the case
that would run out of memory if it did.
Carried over from v0.1.0
Connections over LDAPS, StartTLS or plain LDAP with a simple or NTLM bind;
passwords in the system keychain; untrusted certificates shown with their
fingerprint before you decide; a paged, virtualised tree; and attributes
decoded underneath their raw values.
What is still not here
Writing to the directory, snapshots and diffs, and Kerberos — none of them are
in v1 by design. Reconnecting automatically after a dropped connection is
deferred: the event bridge it needs exists now, but there is no way yet to
produce a dropped connection on purpose to test against.
Installing
macOS — unzip and drag Ldapper.app to Applications. Not notarised, so
the first launch needs right-click → Open.
Windows — unzip and run Ldapper.exe. Needs the WebView2 runtime, which
current Windows 10 and 11 already carry. No installer yet.
What is verified, and what is not
301 unit tests and 36 integration tests against a real OpenLDAP server, the
latter driving the same facade the window calls: connect, page through a
branch, read an entry, validate and expand a filter, export to both formats.
The window itself has been run and its chrome checked by eye on macOS. The
Windows build compiles and links in CI but has not been run by hand — if it
misbehaves there, that is the report most worth having.