1d11b170bStron // $OpenLDAP$
22de962bdSlukem /*
3*e670fd5cSchristos * Copyright 2000-2021 The OpenLDAP Foundation, All Rights Reserved.
42de962bdSlukem * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
52de962bdSlukem */
62de962bdSlukem
72de962bdSlukem
82de962bdSlukem //TODO!!!
92de962bdSlukem // * some kind of iterator to step through the attribute values
102de962bdSlukem // * remove values from Attribute
112de962bdSlukem // * handling of subtypes (;de; and so on)
122de962bdSlukem // * some documentation
132de962bdSlukem
142de962bdSlukem
152de962bdSlukem #include <ldap.h>
162de962bdSlukem #include <cstdlib>
172de962bdSlukem
182de962bdSlukem #include "debug.h"
192de962bdSlukem #include "StringList.h"
202de962bdSlukem
212de962bdSlukem #include "LDAPAttribute.h"
222de962bdSlukem
232de962bdSlukem using namespace std;
242de962bdSlukem
LDAPAttribute()252de962bdSlukem LDAPAttribute::LDAPAttribute(){
262de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute( )" << endl);
272de962bdSlukem m_name=string();
282de962bdSlukem }
292de962bdSlukem
LDAPAttribute(const LDAPAttribute & attr)302de962bdSlukem LDAPAttribute::LDAPAttribute(const LDAPAttribute& attr){
312de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute(&)" << endl);
322de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
332de962bdSlukem " attr:" << attr << endl);
342de962bdSlukem m_name=attr.m_name;
352de962bdSlukem m_values=StringList(attr.m_values);
362de962bdSlukem }
372de962bdSlukem
LDAPAttribute(const string & name,const string & value)382de962bdSlukem LDAPAttribute::LDAPAttribute(const string& name, const string& value){
392de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl);
402de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
412de962bdSlukem " name:" << name << endl << " value:" << value << endl);
422de962bdSlukem this->setName(name);
432de962bdSlukem if(value != ""){
442de962bdSlukem this->addValue(value);
452de962bdSlukem }
462de962bdSlukem }
472de962bdSlukem
482de962bdSlukem
LDAPAttribute(const string & name,const StringList & values)492de962bdSlukem LDAPAttribute::LDAPAttribute(const string& name, const StringList& values){
502de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl);
512de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
522de962bdSlukem " name:" << name << endl);
532de962bdSlukem m_name=name;
542de962bdSlukem m_values=values;
552de962bdSlukem }
562de962bdSlukem
LDAPAttribute(const char * name,char ** values)572de962bdSlukem LDAPAttribute::LDAPAttribute(const char *name, char **values){
582de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl);
592de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
602de962bdSlukem " name:" << name << endl);
612de962bdSlukem this->setName(name);
622de962bdSlukem this->setValues(values);
632de962bdSlukem }
642de962bdSlukem
LDAPAttribute(const char * name,BerValue ** values)652de962bdSlukem LDAPAttribute::LDAPAttribute(const char *name, BerValue **values){
662de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPAttribute::LDAPAttribute()" << endl);
672de962bdSlukem DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
682de962bdSlukem " name:" << name << endl);
692de962bdSlukem this->setName(name);
702de962bdSlukem this->setValues(values);
712de962bdSlukem }
722de962bdSlukem
~LDAPAttribute()732de962bdSlukem LDAPAttribute::~LDAPAttribute(){
742de962bdSlukem DEBUG(LDAP_DEBUG_DESTROY,"LDAPAttribute::~LDAPAttribute()" << endl);
752de962bdSlukem }
762de962bdSlukem
addValue(const string & value)772de962bdSlukem void LDAPAttribute::addValue(const string& value){
782de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::addValue()" << endl);
792de962bdSlukem m_values.add(value);
802de962bdSlukem }
812de962bdSlukem
addValue(const BerValue * value)822de962bdSlukem int LDAPAttribute::addValue(const BerValue *value){
832de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::addValue()" << endl);
842de962bdSlukem if(value!=0){
852de962bdSlukem this->addValue(string(value->bv_val, value->bv_len));
862de962bdSlukem return 0;
872de962bdSlukem }
882de962bdSlukem return -1;
892de962bdSlukem }
902de962bdSlukem
setValues(char ** values)912de962bdSlukem int LDAPAttribute::setValues(char **values){
922de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl);
932de962bdSlukem if(values){
942de962bdSlukem m_values.clear();
952de962bdSlukem for( char **i=values; *i!=0; i++){
962de962bdSlukem this->addValue(*i);
972de962bdSlukem }
982de962bdSlukem }
992de962bdSlukem return 0;
1002de962bdSlukem }
1012de962bdSlukem
setValues(BerValue ** values)1022de962bdSlukem int LDAPAttribute::setValues(BerValue **values){
1032de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl);
1042de962bdSlukem if(values){
1052de962bdSlukem m_values.clear();
1062de962bdSlukem for( BerValue **i=values; *i!=0; i++){
1072de962bdSlukem if( this->addValue(*i) ){
1082de962bdSlukem return -1;
1092de962bdSlukem }
1102de962bdSlukem }
1112de962bdSlukem }
1122de962bdSlukem return 0;
1132de962bdSlukem }
1142de962bdSlukem
setValues(const StringList & values)1152de962bdSlukem void LDAPAttribute::setValues(const StringList& values){
1162de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::setValues()" << endl);
1172de962bdSlukem m_values=values;
1182de962bdSlukem }
1192de962bdSlukem
getValues() const1202de962bdSlukem const StringList& LDAPAttribute::getValues() const{
1212de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getValues()" << endl);
1222de962bdSlukem return m_values;
1232de962bdSlukem }
1242de962bdSlukem
getBerValues() const1252de962bdSlukem BerValue** LDAPAttribute::getBerValues() const{
1262de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getBerValues()" << endl);
1272de962bdSlukem size_t size=m_values.size();
1282de962bdSlukem if (size == 0){
1292de962bdSlukem return 0;
1302de962bdSlukem }else{
1312de962bdSlukem BerValue **temp = (BerValue**) malloc(sizeof(BerValue*) * (size+1));
1322de962bdSlukem StringList::const_iterator i;
1332de962bdSlukem int p=0;
1342de962bdSlukem
1352de962bdSlukem for(i=m_values.begin(), p=0; i!=m_values.end(); i++,p++){
1362de962bdSlukem temp[p]=(BerValue*) malloc(sizeof(BerValue));
1372de962bdSlukem temp[p]->bv_len= i->size();
1382de962bdSlukem temp[p]->bv_val= (char*) malloc(sizeof(char) * (i->size()+1));
1392de962bdSlukem i->copy(temp[p]->bv_val,string::npos);
1402de962bdSlukem }
1412de962bdSlukem temp[size]=0;
1422de962bdSlukem return temp;
1432de962bdSlukem }
1442de962bdSlukem }
1452de962bdSlukem
getNumValues() const1462de962bdSlukem int LDAPAttribute::getNumValues() const{
1472de962bdSlukem DEBUG(LDAP_DEBUG_TRACE,"LDAPAttribute::getNumValues()" << endl);
1482de962bdSlukem return m_values.size();
1492de962bdSlukem }
1502de962bdSlukem
getName() const1512de962bdSlukem const string& LDAPAttribute::getName() const {
1522de962bdSlukem DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::getName()" << endl);
1532de962bdSlukem return m_name;
1542de962bdSlukem }
1552de962bdSlukem
setName(const string & name)1562de962bdSlukem void LDAPAttribute::setName(const string& name){
1572de962bdSlukem DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::setName()" << endl);
1582de962bdSlukem DEBUG(LDAP_DEBUG_TRACE | LDAP_DEBUG_PARAMETER," name:" << name << endl);
1592de962bdSlukem m_name.erase();
1602de962bdSlukem m_name=name;
1612de962bdSlukem }
1622de962bdSlukem
1632de962bdSlukem // The bin-FLAG of the mod_op is always set to LDAP_MOD_BVALUES (0x80)
toLDAPMod() const1642de962bdSlukem LDAPMod* LDAPAttribute::toLDAPMod() const {
1652de962bdSlukem DEBUG(LDAP_DEBUG_TRACE, "LDAPAttribute::toLDAPMod()" << endl);
1662de962bdSlukem LDAPMod* ret= (LDAPMod*) malloc(sizeof(LDAPMod));
1672de962bdSlukem ret->mod_op=LDAP_MOD_BVALUES; //always assume binary-Values
1682de962bdSlukem ret->mod_type= (char*) malloc(sizeof(char) * (m_name.size()+1));
1692de962bdSlukem m_name.copy(ret->mod_type,string::npos);
1702de962bdSlukem ret->mod_type[m_name.size()]=0;
1712de962bdSlukem ret->mod_bvalues=this->getBerValues();
1722de962bdSlukem return ret;
1732de962bdSlukem }
1742de962bdSlukem
isNotPrintable() const1752de962bdSlukem bool LDAPAttribute::isNotPrintable() const {
1762de962bdSlukem StringList::const_iterator i;
1772de962bdSlukem for(i=m_values.begin(); i!=m_values.end(); i++){
1782de962bdSlukem size_t len = i->size();
1792de962bdSlukem for(size_t j=0; j<len; j++){
1802de962bdSlukem if (! isprint( (i->data())[j] ) ){
1812de962bdSlukem return true;
1822de962bdSlukem }
1832de962bdSlukem }
1842de962bdSlukem }
1852de962bdSlukem return false;
1862de962bdSlukem }
1872de962bdSlukem
operator <<(ostream & s,const LDAPAttribute & attr)1882de962bdSlukem ostream& operator << (ostream& s, const LDAPAttribute& attr){
1892de962bdSlukem s << attr.m_name << "=";
1902de962bdSlukem StringList::const_iterator i;
1912de962bdSlukem if (attr.isNotPrintable()){
1922de962bdSlukem s << "NOT_PRINTABLE" ;
1932de962bdSlukem }else{
1942de962bdSlukem for(i=attr.m_values.begin(); i!=attr.m_values.end(); i++){
1952de962bdSlukem s << *i << " ";
1962de962bdSlukem }
1972de962bdSlukem }
1982de962bdSlukem return s;
1992de962bdSlukem }
200