• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeutils API Reference
  • KDE Home
  • Contact Us
 

kgpg

  • sources
  • kde-4.14
  • kdeutils
  • kgpg
  • transactions
kgpgtextorfiletransaction.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008,2009,2010,2011,2012,2013 Rolf Eike Beer <kde@opensource.sf-tec.de>
3  */
4 
5 /***************************************************************************
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  ***************************************************************************/
13 
14 #include "kgpgtextorfiletransaction.h"
15 
16 #include "gpgproc.h"
17 
18 #include <KDebug>
19 #include <KIO/NetAccess>
20 #include <KLocale>
21 #include <QRegExp>
22 
23 KGpgTextOrFileTransaction::KGpgTextOrFileTransaction(QObject *parent, const QString &text, const bool allowChaining)
24  : KGpgTransaction(parent, allowChaining)
25 {
26  setText(text);
27 }
28 
29 KGpgTextOrFileTransaction::KGpgTextOrFileTransaction(QObject *parent, const KUrl::List &files, const bool allowChaining)
30  : KGpgTransaction(parent, allowChaining)
31 {
32  setUrls(files);
33 }
34 
35 KGpgTextOrFileTransaction::~KGpgTextOrFileTransaction()
36 {
37  cleanUrls();
38 }
39 
40 void
41 KGpgTextOrFileTransaction::setText(const QString &text)
42 {
43  m_text = text;
44  cleanUrls();
45 
46  int begin = text.indexOf(QRegExp(QLatin1String("^(.*\n)?-----BEGIN PGP [A-Z ]*-----\r?\n")));
47  if (begin < 0)
48  return;
49 
50  // find the end of the BEGIN PGP ... line
51  static const QChar lf = QLatin1Char('\n');
52  begin = text.indexOf(lf, begin);
53  Q_ASSERT(begin > 0);
54 
55  // now loop until either an empty line is found (end of header) or
56  // a line beginning with Charset is found. If the latter, use the
57  // charset found there as hint for the following operation
58  int nextlf;
59  begin++;
60  while ((nextlf = text.indexOf(lf, begin)) > 0) {
61  static const QChar cr = QLatin1Char('\r');
62  if ((nextlf == begin) || ((nextlf == begin + 1) && (text[begin] == cr)))
63  break;
64 
65  const QString charset = QLatin1String("Charset: ");
66  if (text.mid(begin, charset.length()) == charset) {
67  QString cs = text.mid(begin + charset.length(), nextlf - begin - charset.length());
68  if (!getProcess()->setCodec(cs.toAscii()))
69  kDebug(2100) << "unsupported charset found in header" << cs;
70  break;
71  }
72  begin = nextlf + 1;
73  }
74 
75 
76 }
77 
78 void
79 KGpgTextOrFileTransaction::setUrls(const KUrl::List &files)
80 {
81  m_text.clear();
82  m_inpfiles = files;
83 }
84 
85 bool
86 KGpgTextOrFileTransaction::preStart()
87 {
88  QStringList locfiles;
89 
90  foreach (const KUrl &url, m_inpfiles) {
91  if (url.isLocalFile()) {
92  locfiles.append(url.toLocalFile());
93  } else {
94  QString tmpfile;
95 
96  if (KIO::NetAccess::download(url, tmpfile, 0)) {
97  m_tempfiles.append(tmpfile);
98  } else {
99  m_messages.append(KIO::NetAccess::lastErrorString());
100  cleanUrls();
101  setSuccess(TS_KIO_FAILED);
102  return false;
103  }
104  }
105  }
106 
107  if (locfiles.isEmpty() && m_tempfiles.isEmpty() && m_text.isEmpty() && !hasInputTransaction()) {
108  setSuccess(TS_MSG_SEQUENCE);
109  return false;
110  }
111 
112  QStringList args(QLatin1String("--status-fd=1"));
113 
114  args << command();
115  // if the input is not stdin set command-fd so GnuPG
116  // can ask if e.g. the file already exists
117  if (!locfiles.isEmpty() || !m_tempfiles.isEmpty()) {
118  args << QLatin1String("--command-fd=0");
119  m_closeInput = false;
120  } else {
121  m_closeInput = !args.contains(QLatin1String("--command-fd=0"));
122  }
123  if (locfiles.count() + m_tempfiles.count() > 1)
124  args << QLatin1String("--multifile");
125  args << locfiles << m_tempfiles;
126  addArguments(args);
127 
128  return true;
129 }
130 
131 void
132 KGpgTextOrFileTransaction::postStart()
133 {
134  if (!m_text.isEmpty()){
135  GPGProc *proc = getProcess();
136  proc->write(m_text.toUtf8());
137  if (m_closeInput)
138  proc->closeWriteChannel();
139  }
140 }
141 
142 bool
143 KGpgTextOrFileTransaction::nextLine(const QString &line)
144 {
145  m_messages.append(line);
146 
147  return false;
148 }
149 
150 void
151 KGpgTextOrFileTransaction::finish()
152 {
153  if (getProcess()->exitCode() != 0) {
154  setSuccess(TS_MSG_SEQUENCE);
155  }
156 }
157 
158 const QStringList &
159 KGpgTextOrFileTransaction::getMessages() const
160 {
161  return m_messages;
162 }
163 
164 void
165 KGpgTextOrFileTransaction::cleanUrls()
166 {
167  foreach (const QString &u, m_tempfiles)
168  KIO::NetAccess::removeTempFile(u);
169 
170  m_tempfiles.clear();
171  m_locfiles.clear();
172  m_inpfiles.clear();
173 }
174 
175 const KUrl::List &
176 KGpgTextOrFileTransaction::getInputFiles() const
177 {
178  return m_inpfiles;
179 }
180 
181 #include "kgpgtextorfiletransaction.moc"
QList::clear
void clear()
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
KGpgTextOrFileTransaction::command
virtual QStringList command() const =0
GPGProc
A interface to GnuPG handling UTF8 recoding correctly.
Definition: gpgproc.h:36
KGpgTransaction::addArguments
int addArguments(const QStringList &args)
add command line arguments to gpg process
Definition: kgpgtransaction.cpp:572
KGpgTextOrFileTransaction::KGpgTextOrFileTransaction
KGpgTextOrFileTransaction(QObject *parent=0, const QString &text=QString(), const bool allowChaining=false)
work with given text
Definition: kgpgtextorfiletransaction.cpp:23
QChar
kgpgtextorfiletransaction.h
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
KGpgTextOrFileTransaction::setUrls
void setUrls(const KUrl::List &files)
set file locations to work with
Definition: kgpgtextorfiletransaction.cpp:79
KGpgTransaction::getProcess
GPGProc * getProcess()
get a reference to the gpg process object
Definition: kgpgtransaction.cpp:556
QString::clear
void clear()
QRegExp
QList::count
int count(const T &value) const
GPGProc::setCodec
bool setCodec(const QByteArray &codec)
sets the codec used to translate the incoming data
Definition: gpgproc.cpp:277
QList::append
void append(const T &value)
KGpgTransaction::hasInputTransaction
bool hasInputTransaction() const
check if another transaction will sent input to this
Definition: kgpgtransaction.cpp:730
KGpgTextOrFileTransaction::~KGpgTextOrFileTransaction
virtual ~KGpgTextOrFileTransaction()
destructor
Definition: kgpgtextorfiletransaction.cpp:35
QObject
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
gpgproc.h
KGpgTextOrFileTransaction::finish
virtual void finish()
implement special handling for GnuPG return codes
Definition: kgpgtextorfiletransaction.cpp:151
QString
KGpgTransaction::TS_MSG_SEQUENCE
unexpected sequence of GnuPG messages
Definition: kgpgtransaction.h:62
KGpgTextOrFileTransaction::getInputFiles
const KUrl::List & getInputFiles() const
Definition: kgpgtextorfiletransaction.cpp:176
QStringList
KGpgTextOrFileTransaction::setText
void setText(const QString &text)
set text to work with
Definition: kgpgtextorfiletransaction.cpp:41
QLatin1Char
KGpgTextOrFileTransaction::nextLine
virtual bool nextLine(const QString &line)
Called for every line the gpg process writes.
Definition: kgpgtextorfiletransaction.cpp:143
KGpgTextOrFileTransaction::preStart
virtual bool preStart()
construct the command line of the process
Definition: kgpgtextorfiletransaction.cpp:86
QString::mid
QString mid(int position, int n) const
QLatin1String
KGpgTransaction::setSuccess
void setSuccess(const int v)
set the success value that will be returned with the done signal
Definition: kgpgtransaction.cpp:448
QString::length
int length() const
KGpgTransaction
Process one GnuPG operation.
Definition: kgpgtransaction.h:44
KGpgTextOrFileTransaction::TS_KIO_FAILED
download of remote file failed
Definition: kgpgtextorfiletransaction.h:39
QString::toAscii
QByteArray toAscii() const
KGpgTextOrFileTransaction::getMessages
const QStringList & getMessages() const
get gpg info message
Definition: kgpgtextorfiletransaction.cpp:159
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kgpg

Skip menu "kgpg"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • sweeper

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal