text: /* This file is part of the KDE project
     Copyright 2009 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
  
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
     License as published by the Free Software Foundation; either
     version 2 of the License, or (at your option) any later version.
  
     This library 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
     Library General Public License for more details.
  
     You should have received a copy of the GNU Library General Public License
     along with this library; see the file COPYING.LIB.  If not, write to
     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     Boston, MA 02110-1301, USA.
  */
  
  #include "ProtectableObject.h"
  
  #include "part/Digest.h" // FIXME detach from part
  #include "SheetsDebug.h"
  
  #include <KoXmlNS.h>
  
  //AFA #include <kcodecs.h>
  //AFA #include <KLocalizedString>
  //AFA #include <kmessagebox.h>
  //AFA #include <knewpassworddialog.h>
  //AFA #include <kpassworddialog.h>
  
  #include <QPointer>
  
  using namespace Calligra::Sheets;
  
  void ProtectableObject::password(QByteArray & password) const
  {
      password = m_password;
  }
  
  bool ProtectableObject::isProtected() const
  {
      return !m_password.isNull();
  }
  
  void ProtectableObject::setProtected(QByteArray const & password)
  {
      m_password = password;
  }
  
  bool ProtectableObject::checkPassword(QByteArray const & password) const
  {
      return (password == m_password);
  }
  
  bool ProtectableObject::showPasswordDialog(QWidget* parent, Mode mode, const QString& title)
  {
      //AFA
  #ifdef ENABLE_GUI
      if (mode == Lock) {
          QPointer<KNewPasswordDialog> dlg = new KNewPasswordDialog(parent);
          dlg->setPrompt(i18n("Enter a password."));
          dlg->setWindowTitle(title);
          if (dlg->exec() != KPasswordDialog::Accepted) {
              return false;
          }
  
          QByteArray hash;
          QString password = dlg->password();
          if (password.length() > 0) {
              SHA1::getHash(password, hash);
          }
          m_password = hash;
          delete dlg;
      } else { /* Unlock */
          QPointer<KPasswordDialog> dlg = new KPasswordDialog(parent);
          dlg->setPrompt(i18n("Enter the password."));
          dlg->setWindowTitle(title);
          if (dlg->exec() != KPasswordDialog::Accepted) {
              return false;
          }
  
          QByteArray hash("");
          QString password(dlg->password());
          if (password.length() > 0) {
              SHA1::getHash(password, hash);
          }
          if (!checkPassword(hash)) {
              KMessageBox::error(parent, i18n("Password is incorrect."));
              return false;
          }
          m_password = QByteArray();
          delete dlg;
      }
  #endif
      return true;
  }
  
  void ProtectableObject::loadXmlProtection(const KoXmlElement& element)
  {
      if (element.hasAttribute("protected")) {
          const QString passwd = element.attribute("protected");
          QByteArray str(passwd.toUtf8());
          //AFA m_password = KCodecs::base64Decode(str);
          m_password = QByteArray::fromBase64(str);
      }
  }
  
  