1// $OpenLDAP$ 2/* 3 * Copyright 2000-2021 The OpenLDAP Foundation, All Rights Reserved. 4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file 5 */ 6 7 8//TODO!!! 9// * some kind of iterator to step through the attribute values 10// * remove values from Attribute 11// * handling of subtypes (;de; and so on) 12// * some documentation 13 14 15#include <ldap.h> 16#include <cstdlib> 17 18#include "debug.h" 19#include "StringList.h" 20 21#include "LDAPAttribute.h" 22 23using namespace std; 24 25LDAPAttribute::LDAPAttribute(){ 26 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute( )" << endl); 27 m_name=string(); 28} 29 30LDAPAttribute::LDAPAttribute(const LDAPAttribute& attr){ 31 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute(&)" << endl); 32 DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, 33 " attr:" << attr << endl); 34 m_name=attr.m_name; 35 m_values=StringList(attr.m_values); 36} 37 38LDAPAttribute::LDAPAttribute(const string& name, const string& value){ 39 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl); 40 DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, 41 " name:" << name << endl << " value:" << value << endl); 42 this->setName(name); 43 if(value != ""){ 44 this->addValue(value); 45 } 46} 47 48 49LDAPAttribute::LDAPAttribute(const string& name, const StringList& values){ 50 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl); 51 DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, 52 " name:" << name << endl); 53 m_name=name; 54 m_values=values; 55} 56 57LDAPAttribute::LDAPAttribute(const char *name, char **values){ 58 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl); 59 DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, 60 " name:" << name << endl); 61 this->setName(name); 62 this->setValues(values); 63} 64 65LDAPAttribute::LDAPAttribute(const char *name, BerValue **values){ 66 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl); 67 DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, 68 " name:" << name << endl); 69 this->setName(name); 70 this->setValues(values); 71} 72 73LDAPAttribute::~LDAPAttribute(){ 74 DEBUG(LDAP_DEBUG_DESTROY,"LDAPAttribute::~LDAPAttribute()" << endl); 75} 76 77void LDAPAttribute::addValue(const string& value){ 78 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::addValue()" << endl); 79 m_values.add(value); 80} 81 82int LDAPAttribute::addValue(const BerValue *value){ 83 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::addValue()" << endl); 84 if(value!=0){ 85 this->addValue(string(value->bv_val, value->bv_len)); 86 return 0; 87 } 88 return -1; 89} 90 91int LDAPAttribute::setValues(char **values){ 92 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl); 93 if(values){ 94 m_values.clear(); 95 for( char **i=values; *i!=0; i++){ 96 this->addValue(*i); 97 } 98 } 99 return 0; 100} 101 102int LDAPAttribute::setValues(BerValue **values){ 103 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl); 104 if(values){ 105 m_values.clear(); 106 for( BerValue **i=values; *i!=0; i++){ 107 if( this->addValue(*i) ){ 108 return -1; 109 } 110 } 111 } 112 return 0; 113} 114 115void LDAPAttribute::setValues(const StringList& values){ 116 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl); 117 m_values=values; 118} 119 120const StringList& LDAPAttribute::getValues() const{ 121 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getValues()" << endl); 122 return m_values; 123} 124 125BerValue** LDAPAttribute::getBerValues() const{ 126 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getBerValues()" << endl); 127 size_t size=m_values.size(); 128 if (size == 0){ 129 return 0; 130 }else{ 131 BerValue **temp = (BerValue**) malloc(sizeof(BerValue*) * (size+1)); 132 StringList::const_iterator i; 133 int p=0; 134 135 for(i=m_values.begin(), p=0; i!=m_values.end(); i++,p++){ 136 temp[p]=(BerValue*) malloc(sizeof(BerValue)); 137 temp[p]->bv_len= i->size(); 138 temp[p]->bv_val= (char*) malloc(sizeof(char) * (i->size()+1)); 139 i->copy(temp[p]->bv_val,string::npos); 140 } 141 temp[size]=0; 142 return temp; 143 } 144} 145 146int LDAPAttribute::getNumValues() const{ 147 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getNumValues()" << endl); 148 return m_values.size(); 149} 150 151const string& LDAPAttribute::getName() const { 152 DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::getName()" << endl); 153 return m_name; 154} 155 156void LDAPAttribute::setName(const string& name){ 157 DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::setName()" << endl); 158 DEBUG(LDAP_DEBUG_TRACE | LDAP_DEBUG_PARAMETER," name:" << name << endl); 159 m_name.erase(); 160 m_name=name; 161} 162 163// The bin-FLAG of the mod_op is always set to LDAP_MOD_BVALUES (0x80) 164LDAPMod* LDAPAttribute::toLDAPMod() const { 165 DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::toLDAPMod()" << endl); 166 LDAPMod* ret= (LDAPMod*) malloc(sizeof(LDAPMod)); 167 ret->mod_op=LDAP_MOD_BVALUES; //always assume binary-Values 168 ret->mod_type= (char*) malloc(sizeof(char) * (m_name.size()+1)); 169 m_name.copy(ret->mod_type,string::npos); 170 ret->mod_type[m_name.size()]=0; 171 ret->mod_bvalues=this->getBerValues(); 172 return ret; 173} 174 175bool LDAPAttribute::isNotPrintable() const { 176 StringList::const_iterator i; 177 for(i=m_values.begin(); i!=m_values.end(); i++){ 178 size_t len = i->size(); 179 for(size_t j=0; j<len; j++){ 180 if (! isprint( (i->data())[j] ) ){ 181 return true; 182 } 183 } 184 } 185 return false; 186} 187 188ostream& operator << (ostream& s, const LDAPAttribute& attr){ 189 s << attr.m_name << "="; 190 StringList::const_iterator i; 191 if (attr.isNotPrintable()){ 192 s << "NOT_PRINTABLE" ; 193 }else{ 194 for(i=attr.m_values.begin(); i!=attr.m_values.end(); i++){ 195 s << *i << " "; 196 } 197 } 198 return s; 199} 200