xref: /netbsd-src/external/bsd/openldap/dist/contrib/ldapc++/src/LDAPAttribute.cpp (revision e670fd5c413e99c2f6a37901bb21c537fcd322d2)
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