An LDAP to CardDav (1 way read) Phone Book Gateway.
Most modern (business) voice phones have the capability to do comfortable LDAP directory look-up like:
Unfortunately, most of the ‘smaller’ companies (i guess companies beyond 100 employee) don’t have an ‘enterprise’ LDAP directory, much less than private persons.
Most of such companies do have something like a cloud address book, often based on WebDAV / CardDAV (i.e. Nextcloud, Ownlcoud, Baïkal, Daylite, …).
This is, where this Gateway might make your live easier.
If this program get started on some kind of hardware (Windows, macOS or Linux), it will do the following:
You need some kind of 24/7 machine where this gateway live. Windows PC, Linux, macOS, Raspberry or the like.
By default it will look for a configuration file in the following places (in the given order):
It will write to a small local database directory (defaults to ‘/tmp/l2cpbg.db’).
At the moment there’s no “Admin GUI” or something like it. But for miminimal infos like “uptime”, “license”, “number of search requests” as well as “number of sent result records” you might send the l2cpbg process a SIGHUP
signal and check the logs afterwards.
dpkg -i l2cpbg-<version>_<architecture>.deb
to install the package.
/etc/l2cpbg.conf
.[dav]
![ldap]
, [ldap.bind]
, [dav]
as well as [location]
sections (in /etc/l2cpbg.conf) to your need.systemctrl restart l2cpbg
and check startup by systemctrl status l2cpbg
.journalctl -u l2cpbg
.journalctl -fu l2cpbg
.If l2cpbg started up, adapt your phone(s) to point their “LDAP Directory” lookup requests to l2cpbg with the settings you defined in /etc/l2cpbg.conf.
sudo tar xvf l2cpbg_0.9.2_linux-amd64.tgz -C /usr/local/bin/ l2cpbg
sudo tar xvf l2cpbg_0.9.2_linux-amd64.tgz -C /etc/ l2cpbg.conf
[ldap]
, [ldap.bind]
, [dav]
as well as [location]
to your need.l2cpbg
and check terminal output for any issues. <Ctrl-c>, edit config and start l2cpbg
till terminal output is okay.sudo l2cpbg --service=install
. You should see a single “… ‘install’ succeed” message.sudo systemctrl start|stop|status|restart l2cpbg
. When booting next, L2CPBG should get started automatically and log output systemd journal.journalctl -u l2cpbg
.journalctl -fu l2cpbg
.Adapt your phone(s) to point their “LDAP Directory” lookup requests to l2cpbg with the settings you defined in /etc/l2cpbg.conf.
Uninstalling the service/daemon is simply done by sudo l2cpbg --service=uninstall
sudo tar xvf l2cpbg_0.9.2_linux-amd64.tgz -C /usr/local/bin/ l2cpbg
sudo tar xvf l2cpbg_0.9.2_linux-amd64.tgz -C /etc/ l2cpbg.conf
[ldap]
, [ldap.bind]
, [dav]
as well as [location]
to your need.l2cpbg
and check terminal output for any issues. <Ctrl-c>, edit config and start l2cpbg
till terminal output is okay.sudo l2cpbg --service=install
. You should see a single “… ‘install’ succeed” message.sudo service l2cpbg start|stop|status|restart
. When booting next, L2CPBG should get started automatically and log output get send to /var/log/l2cpbg.err|log.Adapt your phone(s) to point their “LDAP Directory” lookup requests to l2cpbg with the settings you defined in /etc/l2cpbg.conf.
Uninstalling the service/daemon is simply done by sudo l2cpbg --service=uninstall
C:\Program Files\LDAP2CardDAV-Gateway
. Take attention that the 32-bit version should be installted somewhere under C:\Program Files (x86)
!C:\Program Files\LDAP2CardDAV-Gateway\l2cpbg.conf
within Notepad and adapt config section [ldap]
, [ldap.bind]
, [dav]
as well as [location]
to your need. When done, don’t forget to save!cd C:\Program Files\LDAP2CardDAV-Gateway
, start it in foreground by l2cpbg.exe
and check terminal output for any issues. <Ctrl-c>, edit config and start l2cpbg.exe
till terminal output is okay.l2cpbg.exe --service=install
. You should see a single “… ‘install’ succeed” message.l2cpbg.exe --service=start|stop|restart
. After ’start’ed, log entries can be viewed by Windows Event Viewer (eventvwr). When booting next, L2CPBG should get started automatically.Uninstalling the service/daemon is simply done by l2cpbg.exe --service=uninstall
Since version 0.9.0 the config file syntax has changed from ‘ini’ to ‘toml’. Not a big deal, but you need to adapt some entries. Mainly strings have to be entered within quotes!
Following a quick minimal sample:
# Comments get started with a hash character
#
# The Gateway will act as LDAP Server, listening
# for requests from your phone(s).
#
[ldap]
host = "0.0.0.0"
#port = 1389
base = "dc=example, dc=com"
[ldap.bind]
dn = "cn=pbx"
pass = "your-password"
#
# Your CardDAV server where this Gateway get the contacts from
#
[dav]
server = "https://cloudserver.example.com/remote.php/dav"
user = "cloud-login-name"
pass = "cloud-login-password"
[location]
int = 1 # Your international code. 1 = US, 49 = Germany, ...
area = 807 # Your local area code (without a leading 0)
maxarealength = 7
country = "EN"
host
: Which IP to listen for LDAP requests. Defaults to “0.0.0.0” = ‘Listen on all interfaces’. You’ve to point your LDAP phone settings to this machines IP/hostname.
port
: Which port to listen for LDAP requests. Defaults to port 1389. The standard LDAP port is 389, so you need to change your phone to the port you configure here.
base
: This LDAP’s ‘base DN’. Choose whatever you want, but use the same settings within your phone’s LDAP settings. Defaults to ‘dc=example, dc=com’.
dn
: Distinguish name. Name, how the phone has to log into/authorize to the gateway.
pass
: Related ‘dn’ password, a phone has to use when logging in/authorize to the gateway.
server
: Your WebDAV/CardDAV server address/URL. Please see ‘Limitations’!
user
: WebDav username with read access to the relevant addressbook which shall be requested for phone book lookups. Might also be a ‘shared’ address book.
pass
: Related user password.
addressbooks
: Optional regular expression string of matchable addressbook(s) used for phone book lookups. If unsure, enter something. l2cpbg will log all found address books of the logged in CardDav user during startup and log them as ‘Non-matching’ or ‘Matching’ address book(s).
syncinterval
: Interval of CardDav sync checks. Given as string with suffix ‘m’ for minutes, or ‘h’ as hours. Has to be greater than “2m”.
chunksize
: If an address book get loaded the first time, it get loaded in “chunks of contacts” in this given size. You may increase this value for quicker initial load, but if your CardDAV server answer with an “507 Insufficient Storage” error or similar, you need to lower this value. Default to 200. This option was added in L2CPBG version 0.8.1.
insecurecert
controls whether a client verifies the server’s certificate chain and host name. If insecurecert is true, crypto/tls accepts any certificate presented by the server and any host name in that certificate. In this mode, TLS is susceptible to machine-in-the-middle attacks unless custom verification is used. This should be used only for testing or in trusted environments. Defaults to false. This option was added in L2CPBG version 0.9.1.
tel
: CardDAV attribute which contain phone numbers. Normally (and by default) ‘TEL’. Don’t change this, except your really know what you’re doing.
int
: International area code (1 = North America, …, 44 = United Kingdom, 49 = Germany, …) of your location.
intPrefix
: Dial prefix for international calls. Mostly “00”. Defaults to “00”. ATTENTION: Has to be entered as string like “00”.
area
: Local area code without leading 0 (20 = London (UK), 40 = Hamburg (DE), …).
areaPrefix
: Dial prefix for national calls. Mostly “0”. Defaults to “0”. ATTENTION: Has to be entered as string like “0”.
maxarealength
: Longest possible length of a telephone number within your local area. If a found or received number is shorter or equal, it’s identified as a number without local area code.
country
: Two-letter ISO 3166-1 alpha-2 country code (i.e. US, GB, DE, …).
maxintlength
: Maximum length of internal phone numbers. These numbers don’t get harmonized or E.164 converted.
prettifyNums
: By default phone numbers loaded from CardDAV get prettified in two ways: At first, if a CardDAV number is stored in international format, but you live in the same country, the international part get removed. At second, the number get formatted in (spaced or braced) number groups as it’s common in your country. You can disable this prettifying by setting the value to false.
extdialprefix
: Optional external dial prefix for getting an external line. Get prefixed before the phone number if outgoing number length > maxintlength
level
: Log level. Might be one of “trace”, “debug”, “info”, “warn”, “error” or “fatal”. Defaults to “info”.
The log levels are organized as follows:
trace
: This is the most verbose log level. It logs simply everything. Never use it in production environment as it might produce an awful amount of log entries! When started as Windows-Service, ‘trace’ messages doesn’t get send to windows event console.
debug
: Logs a lot internal stuff, probably interesting when searching a solution for an issue. Should not be used in production environment as it produce also a lot log entries! When started as Windows-Service, ‘debug’ messages doesn’t get send to windows event console.
info
: This is the most usual log level. Logs only stuff which is relevant.
warn
: Logs stuff which doesn’t behave as expected. Not critical (generic functionality should be okay) but should be noticed/checked.
error
: Something essential/critical happened. Functionality is limited or aborted at all.
fatal
: Game over.
directory
: An own directory where to store the internal database. Defaults to ‘/tmp/l2cpbg.db’ which is not very useful on Linux based systems as it normally get cleaned after each reboot.
Choose yourself where to store the database. If you’ve a small CardDAV server with <= 200 contacts, let the DB in /tmp. An initial sync of 200 contacts (after a reboot) will be quickly done. Not much storage space is needed. An CardDAV server with approx. 4 thousand contacts, take about 10 MByte storage.
ATTENTION: If you use one of the .deb packages, the binary get started as user=l2cpbg. Thus, the given directory here, manually need to made owned by l2cpbg via chown -R l2cpbg:l2cpbg /your/db/directory
! Otherwise the DB process miss read/write permissions and will fail!
Every LDAP attribute which is used within a phone(s) filter or response, need to have a corresponding CardDav mapping which get done as follows:
First you need to define a separate block for the LDAP attribute in the following syntax: [ldap.map.<ldap attribute name (case sensitive)>]
Within such a LDAP mapping block you have to define:
dav
: Corresponding CardDav field/attribute name.
and optional define the following settings:
itypes
: Regular expression (RE2 syntax) of including relevant CardDav types or Apple addressbook label (Apple Adressbook extension: X-ABLabel).
etypes
: Regular expression (RE2 syntax) of excluding relevant CardDav types or Apple addressbook label (Apple Adressbook extension: X-ABLabel).
index
: Zero based index in the case of a multi-value CardDav field.
For an overview of the predefined/default LDAP/CardDav mappings, take a look into ‘l2cpbg.sample.conf’ file.
Here’s a configuration sample of a Gigaset N510 IP PRO: Take attention that ‘Server Address’ point to the machine where this gateway lives (as well as ‘Serverport’)
‘BaseDN’, ‘Common User Name’ and ‘Common Password’ get filled with the same values as defined in your L2CPG config file.
Another configuration sample of a Yealink SIP-T52S: Take attention that ‘Server Address’ point to the machine where this gateway lives (as well as ‘Port’).
‘Base’, ‘User Name’ and ‘Password’ get filled with the same values as defined in your L2CPG config file.
The LDAP configuration of Snom phones look similar to the ones of Gigaset or Yealink. But a user reported that entering (|(cn=*%*)(sn=*%*)(givenName=*%*)(company=*%*))
within ‘LDAP name filter’ did the trick for working name searches.
This version is tested with:
For getting help or discussing l2cpbg, please browse the L2CPBG Forum or check/open the Tickets area.