Show confidential meeting details setting added
[qtmeetings] / src / Domain / Configuration / Configuration.cpp
1 #include "Configuration.h"
2 #include "ConnectionSettings.h"
3 #include "StartupSettings.h"
4 #include "DisplaySettings.h"
5 #include "DateTimeSettings.h"
6 #include "Room.h"
7 #include <QDomDocument>
8 #include <QDomElement>
9 #include <QDomNode>
10 #include <QFile>
11 #include <QCryptographicHash>
12
13 #include <QtDebug>
14 #include <QString>
15 #include <QUrl>
16
17 Configuration * Configuration::sInstance = 0;
18 QString Configuration::sConfigurationPath = "/etc/QtMeetings.conf";
19
20 Configuration::Configuration() :
21         iConnectionSettings(0), iStartupSettings(0), iDisplaySettings(0),
22         iDateTimeSettings(0), 
23         iShowConfidentialMeetingDetails(false)
24 {
25 }
26
27 Configuration::~Configuration() {
28         delete iConnectionSettings;
29         delete iStartupSettings;
30         delete iDisplaySettings;
31         delete iDateTimeSettings;
32         while (!iRooms.isEmpty()) {
33                 delete iRooms.takeFirst();
34         }
35 }
36
37 Configuration* Configuration::instance() {
38         if (sInstance == 0) {
39                 qDebug() << "HERE";
40                 sInstance = new Configuration();
41                 sInstance->readFromXML(sConfigurationPath);
42                 if (!sInstance) {
43                         qDebug() << "FATAL: Configuration cannot be read from:"
44                                         << Configuration::sConfigurationPath;
45                 }
46         }
47         return sInstance;
48 }
49
50 /*ConnectionSettings* Configuration::connectionSettings()
51  {
52  return iConnectionSettings;
53  }*/
54
55 StartupSettings * Configuration::startupSettings() {
56         return iStartupSettings;
57 }
58
59 DisplaySettings * Configuration::displaySettings() {
60         return iDisplaySettings;
61 }
62
63 DateTimeSettings * Configuration::dateTimeSettings() {
64         return iDateTimeSettings;
65 }
66
67 Room* Configuration::defaultRoom() {
68         // default room is stored as the first element of the list
69         return (iRooms.count() == 0) ? 0 : iRooms.at(0);
70 }
71
72 QString Configuration::languageCode() {
73         return iLanguageCode;
74 }
75
76 QList<Room*> Configuration::rooms() {
77         return iRooms;
78 }
79
80 QByteArray Configuration::adminPassword() {
81         return iAdminPassword;
82 }
83 QUrl Configuration::getServerUrl() {
84         return iConnectionSettings->serverUrl();
85 }
86
87 QString Configuration::getUsername() {
88         return iConnectionSettings->username();
89 }
90 QString Configuration::getPassword() {
91         return iConnectionSettings->password();
92 }
93
94 unsigned int Configuration::getRefreshinterval() {
95         return iConnectionSettings->refreshInterval();
96 }
97
98 void Configuration::setServerUrl(QUrl serverUrl) {
99         iConnectionSettings->setServerUrl(serverUrl);
100 }
101 void Configuration::setUsername(QString username) {
102         iConnectionSettings->setUsername(username);
103 }
104 void Configuration::setPassword(QString password) {
105         iConnectionSettings->setPassword(password);
106 }
107 void Configuration::setRefreshinterval(unsigned int refreshinterval) {
108         iConnectionSettings->setRefreshInterval(refreshinterval);
109 }
110
111 void Configuration::save() {
112         QDomDocument doc;
113         QFile file(sConfigurationPath);
114         if (!file.open(QIODevice::ReadWrite)) {
115                 return;
116         }
117
118         if (!doc.setContent(&file)) {
119                 file.close();
120                 return;
121         }
122
123         QDomElement root = doc.documentElement();
124         // Save all attributes to document
125
126         saveAdminPassword(root);
127
128         bool confidentialMeetingDetailsElementMissing = true;
129
130         for (QDomNode node = root.firstChild(); !node.isNull(); node
131                         = node.nextSibling()) {
132                 QDomElement e = node.toElement();
133                 QString tagName = e.tagName().toLower();
134                 if (tagName == QString("connection")) {
135                         saveConnectionSettings(node);
136                 } else if (tagName == QString("rooms")) {
137                         saveRooms(node);
138                 } else if (tagName == QString("language")) {
139                         saveLanguageCode(node);
140                 } else if (tagName == QString("startup")) {
141                         saveStartupSettings(node);
142                 } else if (tagName == QString("display")) {
143                         saveDisplaySettings(node);
144                 } else if (tagName == QString("daylight_saving_time")) {
145                         saveDateTimeSettings(node);
146                 } else if (tagName == QString("privacy")) {
147                         confidentialMeetingDetailsElementMissing = false;
148                         savePrivacySettings(node);
149                 }               
150         }
151
152         if( confidentialMeetingDetailsElementMissing )
153         {
154                 QDomElement e = root.ownerDocument().createElement("privacy");
155                 savePrivacySettings(e);
156                 root.appendChild(e);
157         }
158
159         //! Empty the file from previous content and write again with new one
160         file.resize(0);
161         file.write(doc.toByteArray(4)); //! 4 as intent
162
163         file.close();
164         emit configurationChanged();
165 }
166
167 void Configuration::saveConnectionSettings(const QDomNode &aXML) {
168         QDomElement e = aXML.firstChild().toElement();
169         QString tagName = e.tagName().toLower();
170         qDebug() << tagName;
171         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
172                         = node.nextSibling()) {
173                 QDomElement e = node.toElement();
174                 QString tagName = e.tagName().toLower();
175                 qDebug() << tagName;
176                 if (tagName == QString("serverurl")) {
177                         QDomText t = node.ownerDocument().createTextNode(
178                                         iConnectionSettings->serverUrl().toString());
179                         if (e.hasChildNodes()) {
180                                 e.replaceChild(t, e.firstChild());
181                         } else {
182                                 e.appendChild(t);
183                         }
184                 } else if (tagName == QString("username")) {
185                         QDomText t = node.ownerDocument().createTextNode(
186                                         iConnectionSettings->username());
187                         if (e.hasChildNodes()) {
188                                 e.replaceChild(t, e.firstChild());
189                         } else {
190                                 e.appendChild(t);
191                         }
192
193                 } else if (tagName == QString("password")) {
194                         QDomText t = node.ownerDocument().createTextNode(
195                                         iConnectionSettings->password());
196                         if (e.hasChildNodes()) {
197                                 e.replaceChild(t, e.firstChild());
198                         } else {
199                                 e.appendChild(t);
200                         }
201                 } else if (tagName == QString("refreshinterval")) {
202                         QString s = QString("%1").arg(
203                                         iConnectionSettings->refreshInterval());
204                         QDomText t = node.ownerDocument().createTextNode(s);
205                         e.replaceChild(t, e.firstChild());
206                 }
207         }
208 }
209
210 void Configuration::saveRooms(const QDomNode &aXML) {
211         //! List of rooms must be cleared and rewritten again
212         QDomDocument doc = aXML.ownerDocument();
213         QDomNode root = aXML;
214
215         // Remove child nodes...
216         int count = root.childNodes().count();
217         QDomNode node = root.firstChild();
218         QDomNode next;
219         for (int i = 0; i < count; i++) {
220                 qDebug() << "remove " << node.toElement().text();
221                 next = node.nextSibling();
222                 node = root.removeChild(node);
223                 node = next;
224         }
225
226         node = aXML;
227         QList<Room*>::iterator i;
228         for (i = iRooms.begin(); i != iRooms.end(); ++i) {
229                 QDomElement tag = doc.createElement("room");
230                 node.appendChild(tag);
231
232                 // First room in the list is a dafault room
233                 if (i == iRooms.begin()) {
234                         tag.setAttribute("default", "true");
235                 }
236
237                 QDomElement ename = doc.createElement("name");
238                 QDomText tname = node.ownerDocument().createTextNode((*i)->name());
239                 ename.appendChild(tname);
240                 tag.appendChild(ename);
241
242                 QDomElement eaddress = doc.createElement("address");
243                 QDomText taddress =
244                                 node.ownerDocument().createTextNode((*i)->address());
245                 eaddress.appendChild(taddress);
246                 tag.appendChild(eaddress);
247         }
248 }
249
250 void Configuration::saveLanguageCode(const QDomNode &aXML) {
251         QDomElement e = aXML.toElement();
252         e.setAttribute("code", languageCode());
253 }
254
255 void Configuration::saveStartupSettings(const QDomNode &aXML) {
256         QDomElement e = aXML.toElement();
257
258         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
259                         = node.nextSibling()) {
260                 e = node.toElement();
261                 QString tagName = e.tagName().toLower();
262
263                 if (tagName == QString("powersaving")) {
264                         (iStartupSettings->isPowersavingEnabled() ? e.setAttribute(
265                                         "enabled", "true") : e.setAttribute("enabled", "false"));
266
267                         e.setAttribute("on", iStartupSettings->turnOnAt().toString("hh:mm"));
268                         e.setAttribute("off", iStartupSettings->turnOffAt().toString(
269                                         "hh:mm"));
270                 }
271         }
272 }
273
274 void Configuration::saveDisplaySettings(const QDomNode &aXML) {
275         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
276                         = node.nextSibling()) {
277                 QDomElement e = node.toElement();
278                 QString tagName = e.tagName().toLower();
279
280                 if (tagName == QString("schedule")) {
281                         for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
282                                         = scheduleNode.nextSibling()) {
283                                 QDomElement scheduleElem = scheduleNode.toElement();
284                                 tagName = scheduleElem.tagName().toLower();
285
286                                 if (tagName == QString("week")) {
287                                         scheduleElem.setAttribute("days",
288                                                         iDisplaySettings->daysInSchedule());
289                                 } else if (tagName == QString("day")) {
290                                         scheduleElem.setAttribute("startsat",
291                                                         iDisplaySettings->dayStartsAt().toString("hh:mm"));
292                                         scheduleElem.setAttribute("endsat",
293                                                         iDisplaySettings->dayEndsAt().toString("hh:mm"));
294                                 }
295                         } // end of for
296                 } // end of schedule
297                 else if (tagName == QString("dateformat")) {
298                         QDomText t = node.ownerDocument().createTextNode(
299                                         iDisplaySettings->dateFormat());
300                         e.replaceChild(t, e.firstChild());
301                 } else if (tagName == QString("timeformat")) {
302                         QDomText t = node.ownerDocument().createTextNode(
303                                         iDisplaySettings->timeFormat());
304                         e.replaceChild(t, e.firstChild());
305                 } else if (tagName == QString("screensaver")) {
306                         QString s = QString("%1").arg(iDisplaySettings->screensaver());
307                         QDomText t = node.ownerDocument().createTextNode(s);
308                         e.replaceChild(t, e.firstChild());
309                 }
310         }
311 }
312
313 void Configuration::saveDateTimeSettings(const QDomNode &aXML) {
314         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
315                         = node.nextSibling()) {
316                 QDomElement e = node.toElement();
317                 QString tagName = e.tagName().toLower();
318
319                 if (tagName == QString("dayofweek")) {
320                         QDomText t = node.ownerDocument().createTextNode(
321                                         iDateTimeSettings->switchDay());
322                         e.replaceChild(t, e.firstChild());
323                 } else if (tagName == QString("StandardTimeChangeMoment")) {
324                         QDomText t =
325                                         node.ownerDocument().createTextNode(
326                                                         iDateTimeSettings->STDDateTime().toString(
327                                                                         "ddMMyyyyhhmmss"));
328                         e.replaceChild(t, e.firstChild());
329                 } else if (tagName == QString("DaylightSaveTimeChangeMoment")) {
330                         QDomText t =
331                                         node.ownerDocument().createTextNode(
332                                                         iDateTimeSettings->DSTDateTime().toString(
333                                                                         "ddMMyyyyhhmmss"));
334                         e.replaceChild(t, e.firstChild());
335                 }
336         }
337 }
338
339 void Configuration::saveAdminPassword(const QDomNode &aXML) {
340         QDomElement e = aXML.toElement();
341         e.setAttribute("password", QString(adminPassword()));
342 }
343
344 void Configuration::readFromXML(const QString &aPath) {
345         QDomDocument doc;
346         QFile file(aPath);
347
348         if (!file.open(QIODevice::ReadOnly)) {
349                 return;
350         }
351         if (!doc.setContent(&file)) {
352                 file.close();
353                 return;
354         }
355         file.close();
356
357         QDomElement root = doc.documentElement();
358         // check if the file is the one we need
359         if (root.tagName().toLower() != QString("configuration")) {
360                 return;
361         }
362
363         iAdminPassword = /*Configuration::*/readAdminPassword(root);
364
365         for (QDomNode node = root.firstChild(); !node.isNull(); node
366                         = node.nextSibling()) {
367                 QDomElement e = node.toElement();
368                 QString tagName = e.tagName().toLower();
369
370                 if (tagName == QString("connection")) {
371                         iConnectionSettings = readConnectionSettings(node);
372                 } else if (tagName == QString("rooms")) {
373                         iRooms = readRooms(node);
374                 } else if (tagName == QString("language")) {
375                         iLanguageCode = readLanguageCode(node);
376                 } else if (tagName == QString("startup")) {
377                         iStartupSettings = readStartupSettings(node);
378                 } else if (tagName == QString("display")) {
379                         iDisplaySettings = readDisplaySettings(node);
380                 } else if (tagName == QString("daylight_saving_time")) {
381                         iDateTimeSettings = readDateTimeSettings(node);
382                 } else if (tagName == QString("privacy")) {
383                         readPrivacySettings(node);
384                 }
385         }
386 }
387
388 ConnectionSettings* Configuration::readConnectionSettings(const QDomNode &aXML) {
389         QString server, username, password;
390         unsigned int interval = Configuration::sDefaultInterval;
391
392         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
393                         = node.nextSibling()) {
394                 QDomElement e = node.toElement();
395                 QString tagName = e.tagName().toLower();
396
397                 if (tagName == QString("serverurl")) {
398                         server = e.text();
399                 } else if (tagName == QString("username")) {
400                         username = e.text();
401                 } else if (tagName == QString("password")) {
402                         password = e.text();
403                 } else if (tagName == QString("refreshinterval")) {
404                         bool success = false;
405                         unsigned int intervalTMP = e.text().toUInt(&success);
406                         if (success) {
407                                 interval = intervalTMP;
408                         }
409                 }
410         }
411
412         return new ConnectionSettings(server, username, password, interval);
413 }
414
415 QList<Room*> Configuration::readRooms(const QDomNode &aXML) {
416         QList<Room*> rooms;
417
418         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
419                         = node.nextSibling()) {
420                 QDomElement e = node.toElement();
421                 QString tagName = e.tagName().toLower();
422
423                 if (tagName == QString("room")) {
424                         QString name, address;
425
426                         for (QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode
427                                         = roomNode.nextSibling()) {
428                                 QDomElement roomElem = roomNode.toElement();
429                                 tagName = roomElem.tagName().toLower();
430                                 if (tagName == QString("name")) {
431                                         name = roomElem.text();
432                                 } else if (tagName == QString("address")) {
433                                         address = roomElem.text();
434                                 }
435                         }
436                         Room* room = new Room(name, address);
437                         QString defaultAttr = e.attribute("default").toLower();
438                         if (defaultAttr == QString("true")) {
439                                 rooms.insert(0, room);
440                         } else {
441                                 rooms.append(room);
442                         }
443                 }
444         }
445
446         return rooms;
447 }
448
449 QString Configuration::readLanguageCode(const QDomNode &aXML) {
450         QDomElement e = aXML.toElement();
451         QString tagName = e.tagName().toLower();
452
453         if (e.hasAttribute("code")) {
454                 return e.attribute("code");
455         } else {
456                 // default language is English
457                 return "EN";
458         }
459 }
460
461 StartupSettings * Configuration::readStartupSettings(const QDomNode &aXML) {
462         QDomElement e = aXML.toElement();
463
464         bool isPowersavingEnabled = false;
465         QTime turnOnAt, turnOffAt;
466
467         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
468                         = node.nextSibling()) {
469                 e = node.toElement();
470                 QString tagName = e.tagName().toLower();
471
472                 if (tagName == QString("powersaving")) {
473                         if (e.hasAttribute("enabled") && e.attribute("enabled") == QString(
474                                         "true")) {
475                                 isPowersavingEnabled = true;
476                         }
477
478                         if (e.hasAttribute("on")) {
479                                 QString on = e.attribute("on");
480                                 turnOnAt = QTime::fromString(on, "hh:mm");
481
482                         }
483
484                         if (e.hasAttribute("off")) {
485                                 QString off = e.attribute("off");
486                                 turnOffAt = QTime::fromString(off, "hh:mm");
487                         }
488                 }
489         }
490
491         return new StartupSettings(isPowersavingEnabled, turnOnAt, turnOffAt);
492 }
493
494 DisplaySettings * Configuration::readDisplaySettings(const QDomNode &aXML) {
495         DisplaySettings::DaysInSchedule daysInSchedule =
496                         DisplaySettings::WeekdaysInSchedule;
497         QTime dayStartsAt, dayEndsAt;
498         DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
499         DisplaySettings::TimeFormat timeformat =
500                         DisplaySettings::TwentyFourHoursTimeFormat;
501         int screensaver = 1; //! Default value for screensaver wait time
502
503         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
504                         = node.nextSibling()) {
505                 QDomElement e = node.toElement();
506                 QString tagName = e.tagName().toLower();
507
508                 if (tagName == QString("schedule")) {
509                         for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
510                                         = scheduleNode.nextSibling()) {
511                                 QDomElement scheduleElem = scheduleNode.toElement();
512                                 tagName = scheduleElem.tagName().toLower();
513
514                                 if (tagName == QString("week")) {
515                                         if (scheduleElem.hasAttribute("days")) {
516                                                 // default value is 5, only other supported possibility is 7
517                                                 bool success = false;
518                                                 unsigned int days =
519                                                                 scheduleElem.attribute("days").toUInt(&success);
520                                                 daysInSchedule
521                                                                 = (success && days == 7) ? DisplaySettings::WholeWeekInSchedule
522                                                                                 : DisplaySettings::WeekdaysInSchedule;
523                                         }
524
525                                 } else if (tagName == QString("day")) {
526                                         if (scheduleElem.hasAttribute("startsat")) {
527                                                 QString time = scheduleElem.attribute("startsat");
528                                                 dayStartsAt = QTime::fromString(time, "hh:mm");
529                                         }
530                                         if (scheduleElem.hasAttribute("endsat")) {
531                                                 QString time = scheduleElem.attribute("endsat");
532                                                 dayEndsAt = QTime::fromString(time, "hh:mm");
533                                         }
534
535                                 }
536                         } // end of for
537                 } // end of schedule
538                 else if (tagName == QString("dateformat")) {
539                         //! Not able to display long format anyway at the moment
540                         /*
541                          if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
542                          dateformat = DisplaySettings::LongDateFormat;
543                          else
544                          dateformat = DisplaySettings::ShortDateFormat;
545                          */
546                         dateformat = DisplaySettings::ShortDateFormat;
547                 } else if (tagName == QString("timeformat")) {
548                         //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
549                         /*
550                          if ( e.text() == QObject::tr( "hh:mm ap" ) )
551                          timeformat = DisplaySettings::TwelveHoursTimeFormat;
552                          else
553                          timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
554                          */
555                         timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
556                 } else if (tagName == QString("screensaver")) {
557                         bool success = false;
558                         unsigned int screensaverTMP = e.text().toUInt(&success);
559                         if (success) {
560                                 screensaver = screensaverTMP;
561                         }
562                 }
563         }
564
565         return new DisplaySettings(dateformat, timeformat, daysInSchedule,
566                         dayStartsAt, dayEndsAt, screensaver);
567 }
568
569 DateTimeSettings * Configuration::readDateTimeSettings(const QDomNode &aXML) {
570         // Set defaults..
571         QDateTime standardTimeChangeMoment = QDateTime::fromString(
572                         "05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
573         QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString(
574                         "01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
575         DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
576
577         for (QDomNode node = aXML.firstChild(); !node.isNull(); node
578                         = node.nextSibling()) {
579                 QDomElement e = node.toElement();
580                 QString tagName = e.tagName().toLower();
581
582                 if (tagName == QString("dayofweek")) {
583                         qDebug() << "Configuration::readDateTimeSettings: " + e.text();
584
585                         bool success = false;
586                         unsigned int weekDayTmp = e.text().toUInt(&success);
587                         if (success && weekDayTmp < 7) {
588                                 dayOfWeek = (DateTimeSettings::weekDay) weekDayTmp;
589                         }
590                 } else if (tagName == QString("standardtimechangemoment")) {
591                         standardTimeChangeMoment = QDateTime::fromString(e.text(),
592                                         "dd'.'MM'.'yyyy' 'hh:mm:ss");
593                         qDebug() << "Configuration::readDateTimeSettings: "
594                                         + standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
595                 } else if (tagName == QString("daylightsavetimechangemoment")) {
596                         daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(),
597                                         "dd'.'MM'.'yyyy' 'hh:mm:ss");
598                         qDebug() << "Configuration::readDateTimeSettings: "
599                                         + daylightSaveTimeChangeMoment.toString(
600                                                         "dd.MM.yyyy hh:mm:ss");
601                 }
602         }
603
604         return new DateTimeSettings(standardTimeChangeMoment,
605                         daylightSaveTimeChangeMoment, dayOfWeek);
606 }
607
608 QByteArray Configuration::readAdminPassword(const QDomNode &aXML) {
609         QDomElement e = aXML.toElement();
610         QString tagName = e.tagName().toLower();
611         if (e.hasAttribute("password")) {
612                 QString pw = e.attribute("password");
613                 // Check if the password is default uncrypted "admin"
614
615                 int x = QString::compare(pw, "admin", Qt::CaseInsensitive);  // x == 0
616
617                 if (x == 0) {
618                         // uncrypted password needs to be encoded
619                         QCryptographicHash *hash = new QCryptographicHash(
620                                         QCryptographicHash::Md5);
621                         hash->addData(pw.toUtf8());
622                         pw = QString(hash->result());
623                         delete hash;
624                         return (pw.toAscii()).toHex();
625                 }
626
627                 return (pw.toAscii());
628
629         } else {
630                 return 0;
631         }
632 }
633
634 void Configuration::setRooms(const QList<Room*> aRooms) {
635         iRooms = aRooms;
636 }
637
638 void Configuration::readPrivacySettings(const QDomNode &aXML) {
639         QString s = QString("show_confidential_meeting_details");
640
641         QDomElement e = aXML.firstChildElement(s);
642
643         if (e.hasAttribute("enabled") && 
644                 e.attribute("enabled") == QString("true")) {
645                 iShowConfidentialMeetingDetails = true;
646         }
647         else
648         {
649                 iShowConfidentialMeetingDetails = false;
650         }
651 }
652
653 void Configuration::savePrivacySettings(QDomNode &aXML) {
654         QString s = QString("show_confidential_meeting_details");
655
656         QDomElement e = aXML.firstChildElement(s);
657
658         if (e.isNull()) {
659                 e = aXML.ownerDocument().createElement(s);
660                 aXML.appendChild(e);
661         }
662
663         if( showConfidentialMeetingDetails() )
664                 e.setAttribute("enabled", "true");
665         else
666                 e.setAttribute("enabled", "false");
667 }
668
669 bool Configuration::setShowConfidentialMeetingDetails(
670                 bool showconfidentialmeetingdetails) {
671         iShowConfidentialMeetingDetails = showconfidentialmeetingdetails;
672 }
673
674 bool Configuration::showConfidentialMeetingDetails() {
675         return iShowConfidentialMeetingDetails;
676 }
677
678 QString Configuration::hashPassword(const QString aPassword) {
679         QCryptographicHash *hash = new QCryptographicHash(QCryptographicHash::Md5);
680         hash->addData(aPassword.toUtf8());
681         QByteArray password = hash->result();
682         delete hash;
683
684         return QString(password);
685 }