You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/modules/ldap/ldap_escape.c

106 lines
2.0 KiB

/*
* Kamailio LDAP Module
*
* Copyright (C) 2007 University of North Carolina
*
* Original author: Christian Schlatter, cs@unc.edu
*
*
* This file is part of Kamailio, a free SIP server.
*
* Kamailio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* Kamailio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <stdio.h>
#include <ctype.h>
#include "ldap_escape.h"
/*
* escape string following RFC 4515 (LDAP filter syntax) escaping rules:
*
* * --> \2a
* ( --> \28
* ) --> \29
* \ --> \5c
*
* and percent encode '?' according RFC 4516 (LDAP URL), Section 2.1
* if url_encode equals TRUE
*
* ? --> %3F
*
*/
int ldap_rfc4515_escape(str *sin, str *sout, int url_encode)
{
char *src, *dst;
if (sin == NULL || sout == NULL || sin->s == NULL || sout->s == NULL
|| sin->len <= 0 || sout->len < 3*sin->len+1)
{
return -1;
}
src = sin->s;
dst = sout->s;
while (src < (sin->s + sin->len))
{
switch (*src)
{
case '*':
*dst++ = '\\';
*dst++ = '2';
*dst = 'a';
break;
case '(':
*dst++ = '\\';
*dst++ = '2';
*dst = '8';
break;
case ')':
*dst++ = '\\';
*dst++ = '2';
*dst = '9';
break;
case '\\':
*dst++ = '\\';
*dst++ = '5';
*dst = 'c';
break;
case '?':
if (url_encode)
{
*dst++ = '%';
*dst++ = '3';
*dst = 'F';
} else
{
*dst = *src;
}
break;
default:
*dst = *src;
}
src++;
dst++;
}
*dst = 0;
sout->len = dst - sout->s;
return 0;
}