00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "internal.h"
00024
00025 #if HAVE_LIBIDN
00026 # include <stringprep.h>
00027 # if defined (HAVE_PR29_H) && defined (HAVE_PR29_8Z)
00028 # include <pr29.h>
00029 # endif
00030 #endif
00031
00047 int
00048 gsasl_saslprep (const char *in, Gsasl_saslprep_flags flags,
00049 char **out, int *stringpreprc)
00050 {
00051 #if HAVE_LIBIDN
00052 int rc;
00053
00054 rc = stringprep_profile (in, out, "SASLprep",
00055 (flags & GSASL_ALLOW_UNASSIGNED)
00056 ? STRINGPREP_NO_UNASSIGNED : 0);
00057
00058 if (stringpreprc)
00059 *stringpreprc = rc;
00060
00061 if (rc != STRINGPREP_OK)
00062 {
00063 *out = NULL;
00064 return GSASL_SASLPREP_ERROR;
00065 }
00066
00067 # if defined (HAVE_PR29_8Z) && defined (HAVE_PR29_H)
00068 if (pr29_8z (*out) != PR29_SUCCESS)
00069 {
00070 free (*out);
00071 *out = NULL;
00072 if (stringpreprc)
00073 *stringpreprc = STRINGPREP_NFKC_FAILED;
00074
00075 return GSASL_SASLPREP_ERROR;
00076 }
00077 #endif
00078
00079 #else
00080 size_t i, inlen = strlen (in);
00081
00082 for (i = 0; i < inlen; i++)
00083 if (in[i] & 0x80)
00084 {
00085 *out = NULL;
00086 return GSASL_SASLPREP_ERROR;
00087 }
00088
00089 *out = malloc (inlen + 1);
00090 if (!*out)
00091 return GSASL_MALLOC_ERROR;
00092 strcpy (*out, in);
00093 #endif
00094
00095 return GSASL_OK;
00096 }