LDAP Configuration

<%= javascript_tag do %> var currentPreset = null; function domainToDC(domain) { if (!domain) return ''; return domain.split('.').map(function(part) { return 'dc=' + part; }).join(','); } function updateFromDomain() { var domain = document.getElementById('domain_input').value; if (!currentPreset || !domain) return; var dc = domainToDC(domain); var bindUser = document.getElementById('bind_user').value || 'admin'; var baseDN, bindDN, filter, attrLogin; if (currentPreset === 'freeipa') { baseDN = 'cn=users,cn=accounts,' + dc; bindDN = 'uid=' + bindUser + ',cn=users,cn=accounts,' + dc; filter = '(objectClass=person)'; attrLogin = 'uid'; } else if (currentPreset === 'active_directory') { baseDN = 'CN=Users,' + dc.toUpperCase().replace(/dc=/g, 'DC='); bindDN = bindUser + '@' + domain; filter = '(&(objectClass=user)(!(objectClass=computer)))'; attrLogin = 'sAMAccountName'; } else if (currentPreset === 'openldap') { baseDN = 'ou=users,' + dc; bindDN = 'cn=' + bindUser + ',' + dc; filter = '(objectClass=inetOrgPerson)'; attrLogin = 'uid'; } document.getElementById('auth_source_ldap_base_dn').value = baseDN; document.getElementById('auth_source_ldap_account').value = bindDN; document.getElementById('auth_source_ldap_filter').value = filter; document.getElementById('auth_source_ldap_attr_login').value = attrLogin; document.getElementById('auth_source_ldap_attr_firstname').value = 'givenName'; document.getElementById('auth_source_ldap_attr_lastname').value = 'sn'; document.getElementById('auth_source_ldap_attr_mail').value = 'mail'; document.getElementById('auth_source_ldap_onthefly_register').checked = true; } function setFieldsReadonly(readonly) { var fields = ['auth_source_ldap_base_dn', 'auth_source_ldap_account', 'auth_source_ldap_filter', 'auth_source_ldap_attr_login', 'auth_source_ldap_attr_firstname', 'auth_source_ldap_attr_lastname', 'auth_source_ldap_attr_mail']; fields.forEach(function(id) { var el = document.getElementById(id); if (el) { el.readOnly = readonly; el.style.backgroundColor = readonly ? '#f0f0f0' : ''; } }); } function applyPresetMode(preset) { currentPreset = preset; var domainSection = document.getElementById('domain-section'); if (preset && (preset === 'freeipa' || preset === 'active_directory' || preset === 'openldap')) { domainSection.style.display = 'block'; var names = { 'freeipa': 'FreeIPA', 'active_directory': 'Active Directory', 'openldap': 'OpenLDAP' }; document.getElementById('auth_source_ldap_name').value = names[preset]; setFieldsReadonly(true); document.getElementById('domain_input').value = ''; document.getElementById('bind_user').value = 'admin'; } else { domainSection.style.display = 'none'; setFieldsReadonly(false); document.getElementById('auth_source_ldap_name').value = ''; } } function testLdapConnection() { var form = document.getElementById('ldap-form'); var formData = new FormData(form); var testBtn = document.getElementById('test-btn'); var resultDiv = document.getElementById('test-result'); testBtn.disabled = true; testBtn.value = 'Testing...'; resultDiv.innerHTML = ''; fetch('<%= url_for(controller: 'ldap_config', action: 'test_connection') %>', { method: 'POST', body: formData, headers: { 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content } }) .then(function(response) { return response.json(); }) .then(function(data) { testBtn.disabled = false; testBtn.value = 'Test Connection'; if (data.success) { resultDiv.innerHTML = 'OK: ' + data.message + ''; } else { resultDiv.innerHTML = 'FAIL: ' + data.message + ''; } }) .catch(function(error) { testBtn.disabled = false; testBtn.value = 'Test Connection'; resultDiv.innerHTML = 'Error: ' + error + ''; }); } $(document).ready(function() { $('#domain_input').on('keyup change', function() { updateFromDomain(); }); $('#bind_user').on('keyup change', function() { updateFromDomain(); }); $('#preset').on('change', function() { applyPresetMode(this.value); }); }); <% end %> <% if @ldap_sources.any? %>

Existing LDAP Sources

<% @ldap_sources.each do |ldap| %> <% end %>
Name Host Port TLS Base DN On-the-fly Users Actions
<%= ldap.name %> <%= ldap.host %> <%= ldap.port %> <%= ldap.tls ? 'Yes' : 'No' %> <%= truncate(ldap.base_dn, length: 40) %> <%= ldap.onthefly_register ? 'Yes' : 'No' %> <%= ldap.users.count %> <%= link_to 'Edit', ldap_config_edit_path(ldap), class: 'icon icon-edit' %> <%= link_to 'Delete', ldap_config_delete_path(ldap), method: :delete, data: { confirm: 'Are you sure?' }, class: 'icon icon-del' %>

<% end %>

Add New LDAP Source

(Select preset for simplified setup)

<%= form_for @ldap, url: { controller: 'ldap_config', action: 'create' }, html: { id: 'ldap-form', class: 'tabular' } do |f| %> <%= render partial: 'ldap_form', locals: { f: f } %>

<%= f.submit 'Create', class: 'button-positive' %>

<% end %>