/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2003-2007 Match Grun and the Claws Mail team
+ * Copyright (C) 2003-2009 Match Grun and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <string.h>
#include <lber.h>
+#include "defs.h"
#include "ldaputil.h"
#include "ldapquery.h"
#include "ldapctrl.h"
* \param ctl Control object.
*/
void ldapqry_set_control( LdapQuery *qry, LdapControl *ctl ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
qry->control = ctl;
}
* \param value Name.
*/
void ldapqry_set_name( LdapQuery* qry, const gchar *value ) {
- g_return_if_fail( qry != NULL );
- g_return_if_fail( ADDRQUERY_NAME(qry) != NULL );
+ cm_return_if_fail( qry != NULL );
ADDRQUERY_NAME(qry) = mgu_replace_string( ADDRQUERY_NAME(qry), value );
+ if (ADDRQUERY_NAME(qry) == NULL)
+ return;
g_strstrip( ADDRQUERY_NAME(qry) );
debug_print("set name: %s\n", ADDRQUERY_NAME(qry));
}
* \param value
*/
void ldapqry_set_search_value( LdapQuery *qry, const gchar *value ) {
- g_return_if_fail( qry != NULL );
- g_return_if_fail( ADDRQUERY_SEARCHVALUE(qry) != NULL );
+ cm_return_if_fail( qry != NULL );
ADDRQUERY_SEARCHVALUE(qry) = mgu_replace_string( ADDRQUERY_SEARCHVALUE(qry), value );
+ if (ADDRQUERY_SEARCHVALUE(qry) == NULL)
+ return;
g_strstrip( ADDRQUERY_SEARCHVALUE(qry) );
debug_print("search value: %s\n", ADDRQUERY_SEARCHVALUE(qry));
}
* \param value Type.
*/
void ldapqry_set_search_type( LdapQuery *qry, const AddrSearchType value ) {
- g_return_if_fail( qry != NULL );
- g_return_if_fail( ADDRQUERY_SEARCHTYPE(qry) != NULL );
+ cm_return_if_fail( qry != NULL );
ADDRQUERY_SEARCHTYPE(qry) = value;
}
* \param value ID for the query.
*/
void ldapqry_set_query_id( LdapQuery* qry, const gint value ) {
- g_return_if_fail( qry != NULL );
- g_return_if_fail( ADDRQUERY_ID(qry) != NULL );
+ cm_return_if_fail( qry != NULL );
ADDRQUERY_ID(qry) = value;
}
* \param value Value of stop flag.
*/
void ldapqry_set_stop_flag( LdapQuery *qry, const gboolean value ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
pthread_mutex_lock( qry->mutexStop );
qry->stopFlag = value;
*/
static gboolean ldapqry_get_stop_flag( LdapQuery *qry ) {
gboolean value;
- g_return_val_if_fail( qry != NULL, TRUE );
+ cm_return_val_if_fail( qry != NULL, TRUE );
pthread_mutex_lock( qry->mutexStop );
value = qry->stopFlag;
* \param value Value of busy flag.
*/
static void ldapqry_set_busy_flag( LdapQuery *qry, const gboolean value ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
if (qry->mutexBusy == NULL)
return; /* exiting, mutex already freed */
*/
static gboolean ldapqry_get_busy_flag( LdapQuery *qry ) {
gboolean value;
- g_return_val_if_fail( qry != NULL, FALSE );
+ cm_return_val_if_fail( qry != NULL, FALSE );
pthread_mutex_lock( qry->mutexBusy );
value = qry->busyFlag;
* \param value Value of aged flag.
*/
static void ldapqry_set_aged_flag( LdapQuery *qry, const gboolean value ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
qry->agedFlag = value;
}
* \param qry Query object.
*/
static void ldapqry_clear( LdapQuery *qry ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
/* Free internal stuff */
g_free( ADDRQUERY_NAME(qry) );
* \param qry Query object to process.
*/
void ldapqry_free( LdapQuery *qry ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
/* Clear out internal members */
ADDRQUERY_TYPE(qry) = ADDRQUERY_NONE;
if( ( vals = ldap_get_values_len( ld, entry, attr ) ) != NULL ) {
if( vals[0] != NULL ) {
- debug_print("sv\t%s: %s\n", attr?attr:"null",
- vals[0]->bv_val?vals[0]->bv_val:"null");
- list = g_slist_append( list, g_strndup( vals[0]->bv_val, vals[0]->bv_len ));
+ if (strcmp(attr, "jpegPhoto")) {
+ debug_print("sv\t%s: %s\n", attr?attr:"null",
+ vals[0]->bv_val?vals[0]->bv_val:"null");
+ list = g_slist_append( list, g_strndup( vals[0]->bv_val, vals[0]->bv_len ));
+ } else {
+ char *file = get_tmp_file();
+ FILE *fp = g_fopen(file, "wb");
+ if (fp) {
+ fwrite(vals[0]->bv_val, 1, vals[0]->bv_len, fp);
+ fclose(fp);
+ }
+ list = g_slist_append( list, file);
+ }
}
}
ldap_value_free_len( vals );
ItemPerson *person;
ItemEMail *email;
ItemFolder *folder;
+ gchar *picfile = NULL;
GList *listReturn = NULL;
folder = ADDRQUERY_FOLDER(qry);
for (cur = attributes; cur; cur = cur->next) {
UserAttribute *attrib = addritem_copy_attribute((UserAttribute *)cur->data);
- addritem_person_add_attribute( person, attrib );
+ if (attrib->name && strcmp(attrib->name, "jpegPhoto")) {
+ addritem_person_add_attribute( person, attrib );
+ } else {
+ if (qry && qry->server && qry->server->control) {
+ gchar *dir = g_strconcat( get_rc_dir(), G_DIR_SEPARATOR_S,
+ ADDRBOOK_DIR, G_DIR_SEPARATOR_S, NULL );
+ gchar *filename = g_strdup_printf("%s-%s-%s",
+ qry->server->control->hostName?qry->server->control->hostName:"nohost",
+ qry->server->control->baseDN?qry->server->control->baseDN:"nobase",
+ dn);
+ picfile = g_strdup_printf("%s%s.png", dir, filename);
+ addritem_person_set_picture( person, filename );
+ rename_force(attrib->value, picfile);
+ g_free(filename);
+ g_free(picfile);
+ g_free(dir);
+ }
+ }
}
addrcache_folder_add_person( cache, ADDRQUERY_FOLDER(qry), person );
qry->elapsedTime = -1;
ADDRQUERY_RETVAL(qry) = LDAPRC_INIT;
+ ldapsrv_set_options (ctl->timeOut, NULL);
+
uri = g_strdup_printf("ldap%s://%s:%d",
ctl->enableSSL?"s":"",
ctl->hostName, ctl->port);
static gint ldapqry_search_retrieve( LdapQuery *qry ) {
LdapControl *ctl;
LDAP *ld;
- LDAPMessage *result, *e = NULL;
+ LDAPMessage *result = NULL, *e = NULL;
char **attribs;
gchar *criteria;
gboolean searchFlag;
else if( rc == LDAP_SUCCESS ) {
searchFlag = TRUE;
}
- else if( rc == LDAP_PARTIAL_RESULTS ) {
+ else if( rc == LDAP_PARTIAL_RESULTS || (result && ldap_count_entries(ld, result) > 0) ) {
searchFlag = TRUE;
}
else {
static gint ldapqry_search( LdapQuery *qry ) {
gint retVal;
- g_return_val_if_fail( qry != NULL, -1 );
- g_return_val_if_fail( qry->control != NULL, -1 );
+ cm_return_val_if_fail( qry != NULL, -1 );
+ cm_return_val_if_fail( qry->control != NULL, -1 );
ldapqry_touch( qry );
qry->completed = FALSE;
* \return Error/status code.
*/
gint ldapqry_read_data_th( LdapQuery *qry ) {
- g_return_val_if_fail( qry != NULL, -1 );
- g_return_val_if_fail( qry->control != NULL, -1 );
+ cm_return_val_if_fail( qry != NULL, -1 );
+ cm_return_val_if_fail( qry->control != NULL, -1 );
ldapqry_set_stop_flag( qry, FALSE );
ldapqry_touch( qry );
LdapQuery *qry;
qry = ( LdapQuery * ) ptr;
- g_return_if_fail( qry != NULL );
- g_return_if_fail( ADDRQUERY_NAME(qry) != NULL );
+ cm_return_if_fail( qry != NULL );
debug_print("ldapqry_destroyer::%d::%s\n", (int) pthread_self(),
- ADDRQUERY_NAME(qry));
+ ADDRQUERY_NAME(qry)?ADDRQUERY_NAME(qry):"null");
/* Perform any destruction here */
if( qry->control != NULL ) {
* \param qry Query object to process.
*/
void ldapqry_cancel( LdapQuery *qry ) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
- debug_print("cancelling::%d::%s\n", (int) pthread_self(), ADDRQUERY_NAME(qry));
+ debug_print("cancelling::%d::%s\n", (int) pthread_self(),
+ ADDRQUERY_NAME(qry)?ADDRQUERY_NAME(qry):"null");
if( ldapqry_get_busy_flag( qry ) ) {
if( qry->thread ) {
debug_print("calling pthread_cancel\n");
void ldapqry_age( LdapQuery *qry, gint maxAge ) {
gint age;
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
/* Limit the time that queries can hang around */
if( maxAge < 1 ) maxAge = LDAPCTL_MAX_QUERY_AGE;
AddressCache *cache;
ItemFolder *folder;
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
folder = ADDRQUERY_FOLDER(qry);
if( folder ) {
}
void ldapqry_print(LdapQuery *qry, FILE *stream) {
- g_return_if_fail( qry != NULL );
+ cm_return_if_fail( qry != NULL );
ldapsvr_print_data(qry->server, stream);
ldapctl_print(qry->control, stream);