/*
* Copyright (c) 2021 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "components/core/CoreHandlers.hpp"
#include "components/core/CoreManager.hpp"
#include "utils/Utils.hpp"
#include "LdapModel.hpp"
// =============================================================================
using namespace std;
LdapModel::LdapModel (const int& id,QObject *parent ) : QObject(parent), mId(id){
mIsValid = false;
mMaxResults = 50;
mTimeout = 5;
mDebug = false;
mVerifyServerCertificates = -1;
mUseTls = true;
mUseSal = false;
mServer = "ldap://ldap.example.org";
mConfig["enable"] = "0";
}
void LdapModel::init(){
set();
unset();
}
bool LdapModel::isValid(){
bool valid = mServerFieldError==""
&& mMaxResultsFieldError==""
&& mTimeoutFieldError==""
&& mPasswordFieldError==""
&& mBindDnFieldError==""
&& mBaseObjectFieldError==""
&& mFilterFieldError==""
&& mNameAttributesFieldError==""
&& mSipAttributesFieldError==""
&& mSipDomainFieldError=="";
if( valid != mIsValid){
mIsValid = valid;
emit isValidChanged();
}
return mIsValid;
}
void LdapModel::save(){
if(isValid()){
set();
CoreManager *coreManager = CoreManager::getInstance();
auto lConfig = coreManager->getCore()->getConfig();
std::string section = ("ldap_"+QString::number(mId)).toStdString();
lConfig->cleanSection(section);
for(auto it = mConfig.begin() ; it != mConfig.end() ; ++it)
lConfig->setString(section, it.key().toStdString(), it.value().toString().toStdString());
lConfig->sync();
}
}
void LdapModel::unsave(){
if(mId>=0){
CoreManager *coreManager = CoreManager::getInstance();
auto lConfig = coreManager->getCore()->getConfig();
std::string section = ("ldap_"+QString::number(mId)).toStdString();
lConfig->cleanSection(section);
lConfig->sync();
}
}
bool LdapModel::load(const std::string& section){
bool ok = false;
CoreManager *coreManager = CoreManager::getInstance();
auto lConfig = coreManager->getCore()->getConfig();
std::string sectionName;
size_t i = section.length()-1;
while(i>0 && section[i] != '_')// Get the name strip number
--i;
if(i>0){
sectionName = section.substr(0,i);
mId = atoi(section.substr(i+1).c_str());
}else{
sectionName = section;
mId = 0;
}
if(sectionName == "ldap"){
mConfig.clear();
auto keys = lConfig->getKeysNamesList(section);
for(auto itKeys = keys.begin() ; itKeys != keys.end() ; ++itKeys){
mConfig[QString::fromStdString(*itKeys)] = QString::fromStdString(lConfig->getString(section, *itKeys, ""));
}
unset();
ok = true;
}
return ok;
}
QVariantMap LdapModel::getConfig(){
return mConfig;
}
void LdapModel::setConfig(const QVariantMap& config){
mConfig = config;
emit configChanged();
}
void LdapModel::set(){
mConfig["server"] = mServer;
mConfig["display_name"] = mDisplayName;
mConfig["use_sal"] = (mUseSal?"1":"0");
mConfig["use_tls"] = (mUseTls?"1":"0");
mConfig["server"] = mServer;
mConfig["max_results"] = mMaxResults;
mConfig["timeout"] = mTimeout;
mConfig["password"] = mPassword;
mConfig["bind_dn"] = mBindDn;
mConfig["base_object"] = mBaseObject;
mConfig["filter"] = mFilter;
mConfig["name_attribute"] = mNameAttributes;
mConfig["sip_attribute"] = mSipAttributes;
mConfig["sip_domain"] = mSipDomain;
mConfig["debug"] = (mDebug?"1":"0");
mConfig["verify_server_certificates"] = mVerifyServerCertificates;
}
void LdapModel::unset(){
mServer = mConfig["server"].toString();
mDisplayName = mConfig["display_name"].toString();
mUseTls = mConfig["use_tls"].toString() == "1";
mUseSal = mConfig["use_sal"].toString() == "1";
mMaxResults = mConfig["max_results"].toInt();
mTimeout = mConfig["timeout"].toInt();
mPassword = mConfig["password"].toString();
mBindDn = mConfig["bind_dn"].toString();
mBaseObject = mConfig["base_object"].toString();
mFilter = mConfig["filter"].toString();
mNameAttributes = mConfig["name_attribute"].toString();
mSipAttributes = mConfig["sip_attribute"].toString();
mSipDomain = mConfig["sip_domain"].toString();
mDebug = mConfig["debug"].toString() == "1";
mVerifyServerCertificates = mConfig["verify_server_certificates"].toInt();
testServerField();
testMaxResultsField();
testTimeoutField();
testPasswordField();
testBindDnField();
testBaseObjectField();
testFilterField();
testNameAttributesField();
testSipAttributesField();
testSipDomainField();
isValid();
}
bool LdapModel::isEnabled(){
return mConfig["enable"].toString() == "1";
}
void LdapModel::setEnabled(const bool& data){
if(isValid()){
mConfig["enable"] = (data?"1":"0");
save();
}else
mConfig["enable"] = "0";
emit enabledChanged();
}
//------------------------------------------------------------------------------------
void LdapModel::setServer(const QString& server){
mServer = server;
testServerField();
emit serverChanged();
}
void LdapModel::testServerField(){
QString valid;
if(mServer == "")
valid = "Server must not be empty";
else{
QUrl url(mServer);
if(!url.isValid())
valid = "Server is not an URL";
else if(url.scheme().left(4) != "ldap")
valid = "URL must begin by a ldap scheme.";
else if(url.scheme() == "ldaps")
valid = "ldaps is not supported.";
else
valid = "";
}
if( valid != mServerFieldError){
mServerFieldError = valid;
emit serverFieldErrorChanged();
isValid();
}
}
void LdapModel::setMaxResults(const int& data){
mMaxResults = data;
testMaxResultsField();
emit maxResultsChanged();
}
void LdapModel::testMaxResultsField(){
QString valid;
if(mMaxResults <= 0)
valid = "Max Results must be greater than 0";
else
valid = "";
if( valid != mMaxResultsFieldError){
mMaxResultsFieldError = valid;
emit maxResultsFieldErrorChanged();
isValid();
}
}
void LdapModel::setTimeout(const int& data){
mTimeout = data;
testTimeoutField();
emit timeoutChanged();
}
void LdapModel::testTimeoutField(){
QString valid;
if(mTimeout < 0)
valid = "Timeout must be positive in seconds.";
else
valid = "";
if( valid != mTimeoutFieldError){
mTimeoutFieldError = valid;
emit timeoutFieldErrorChanged();
isValid();
}
}
void LdapModel::setPassword(const QString& data){
mPassword = data;
testPasswordField();
emit passwordChanged();
}
void LdapModel::testPasswordField(){
QString valid = "";
if( valid != mPasswordFieldError){
mPasswordFieldError = valid;
emit passwordFieldErrorChanged();
isValid();
}
}
void LdapModel::setBindDn(const QString& data){
mBindDn = data;
testBindDnField();
emit bindDnChanged();
}
void LdapModel::testBindDnField(){
QString valid;
if( valid != mBindDnFieldError){
mBindDnFieldError = valid;
emit bindDnFieldErrorChanged();
isValid();
}
}
void LdapModel::setBaseObject(const QString& data){
mBaseObject = data;
testBaseObjectField();
emit baseObjectChanged();
}
void LdapModel::testBaseObjectField(){
QString valid;
if(mBaseObject == "")
valid = "Search Base must not be empty";
else
valid = "";
if( valid != mBaseObjectFieldError){
mBaseObjectFieldError = valid;
emit baseObjectFieldErrorChanged();
isValid();
}
}
void LdapModel::setFilter(const QString& data){
mFilter = data;
testFilterField();
emit filterChanged();
}
void LdapModel::testFilterField(){
QString valid = "";
if( valid != mFilterFieldError){
mFilterFieldError = valid;
emit filterFieldErrorChanged();
isValid();
}
}
void LdapModel::setNameAttributes(const QString& data){
mNameAttributes = data;
testNameAttributesField();
emit nameAttributesChanged();
}
void LdapModel::testNameAttributesField(){
QString valid = "";
if( valid != mNameAttributesFieldError){
mNameAttributesFieldError = valid;
emit nameAttributesFieldErrorChanged();
isValid();
}
}
void LdapModel::setSipAttributes(const QString& data){
mSipAttributes = data;
testSipAttributesField();
emit sipAttributesChanged();
}
void LdapModel::testSipAttributesField(){
QString valid = "";
if( valid != mSipAttributesFieldError){
mSipAttributesFieldError = valid;
emit sipAttributesFieldErrorChanged();
isValid();
}
}
void LdapModel::setSipDomain(const QString& data){
mSipDomain = data;
testSipDomainField();
emit sipDomainChanged();
}
void LdapModel::testSipDomainField(){
QString valid = "";
if( valid != mSipDomainFieldError){
mSipDomainFieldError = valid;
emit sipDomainFieldErrorChanged();
isValid();
}
}