1 // $OpenLDAP$ 2 /* 3 * Copyright 2000-2019 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 23 using namespace std; 24 25 LDAPAttribute::LDAPAttribute(){ 26 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute( )" << endl); 27 m_name=string(); 28 } 29 30 LDAPAttribute::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 38 LDAPAttribute::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 49 LDAPAttribute::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 57 LDAPAttribute::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 65 LDAPAttribute::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 73 LDAPAttribute::~LDAPAttribute(){ 74 DEBUG(LDAP_DEBUG_DESTROY,"LDAPAttribute::~LDAPAttribute()" << endl); 75 } 76 77 void LDAPAttribute::addValue(const string& value){ 78 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::addValue()" << endl); 79 m_values.add(value); 80 } 81 82 int 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 91 int 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 102 int 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 115 void LDAPAttribute::setValues(const StringList& values){ 116 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl); 117 m_values=values; 118 } 119 120 const StringList& LDAPAttribute::getValues() const{ 121 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getValues()" << endl); 122 return m_values; 123 } 124 125 BerValue** 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 146 int LDAPAttribute::getNumValues() const{ 147 DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getNumValues()" << endl); 148 return m_values.size(); 149 } 150 151 const string& LDAPAttribute::getName() const { 152 DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::getName()" << endl); 153 return m_name; 154 } 155 156 void 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) 164 LDAPMod* 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 175 bool 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 188 ostream& 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