summaryrefslogtreecommitdiffstats
path: root/kioslave/cgi
diff options
context:
space:
mode:
Diffstat (limited to 'kioslave/cgi')
-rw-r--r--kioslave/cgi/Makefile.am16
-rw-r--r--kioslave/cgi/README15
-rw-r--r--kioslave/cgi/cgi.cpp273
-rw-r--r--kioslave/cgi/cgi.h48
-rw-r--r--kioslave/cgi/cgi.protocol8
-rw-r--r--kioslave/cgi/kcmcgi/Makefile.am17
-rw-r--r--kioslave/cgi/kcmcgi/kcmcgi.cpp151
-rw-r--r--kioslave/cgi/kcmcgi/kcmcgi.desktop231
-rw-r--r--kioslave/cgi/kcmcgi/kcmcgi.h55
9 files changed, 814 insertions, 0 deletions
diff --git a/kioslave/cgi/Makefile.am b/kioslave/cgi/Makefile.am
new file mode 100644
index 000000000..cc71753e9
--- /dev/null
+++ b/kioslave/cgi/Makefile.am
@@ -0,0 +1,16 @@
+SUBDIRS = kcmcgi
+
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kio_cgi.la
+
+kio_cgi_la_SOURCES = cgi.cpp
+kio_cgi_la_LIBADD = $(LIB_KIO)
+kio_cgi_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+noinst_HEADERS = cgi.h
+
+METASOURCES = AUTO
+
+kdelnkdir = $(kde_servicesdir)
+kdelnk_DATA = cgi.protocol
diff --git a/kioslave/cgi/README b/kioslave/cgi/README
new file mode 100644
index 000000000..d68fc9d2c
--- /dev/null
+++ b/kioslave/cgi/README
@@ -0,0 +1,15 @@
+The CGI IO slave provides a way to execute CGI programs without the need to
+have a running web server. This can for example be used for local testing of
+CGI programs or for using search engines that only provide a CGI frontend like
+the one from Doxygen.
+
+The IO slave implements the cgi: protocol. It uses the filename from the given
+URL and searches a configurable list of directories. If it finds an executable
+with the given name it executes it, passes the arguments of the URL and sets the
+environment variables needed by CGI programs.
+
+The kcontrol module System/kcmcgi is used to configure the search paths for CGI
+programs.
+
+If you have questions or comments please contact Cornelius Schumacher
+<schumacher@kde.org>.
diff --git a/kioslave/cgi/cgi.cpp b/kioslave/cgi/cgi.cpp
new file mode 100644
index 000000000..011760e0b
--- /dev/null
+++ b/kioslave/cgi/cgi.cpp
@@ -0,0 +1,273 @@
+/*
+ Copyright (C) 2002 Cornelius Schumacher <schumacher@kde.org>
+ Copyright 2006 Michael Pyne <michael.pyne@kde.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 2 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qdir.h>
+#include <qregexp.h>
+
+#include <kdebug.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kconfig.h>
+
+#include "cgi.h"
+
+using namespace KIO;
+
+CgiProtocol::CgiProtocol( const QCString &pool, const QCString &app )
+ : SlaveBase( "cgi", pool, app )
+{
+ kdDebug(7124) << "CgiProtocol::CgiProtocol" << endl;
+
+ KConfig cfg( "kcmcgirc" );
+ cfg.setGroup( "General" );
+ mCgiPaths = cfg.readListEntry( "Paths" );
+}
+
+CgiProtocol::~CgiProtocol()
+{
+ kdDebug(7124) << "CgiProtocol::~CgiProtocol" << endl;
+}
+
+/**
+ * Search in reverse order through a QByteArray for a given character. The position
+ * of the character is returned, or -1 if it was not found.
+ */
+static int qByteArrayFindRev( const QByteArray &ba, char c, int startIndex )
+{
+ for ( int i = startIndex; i >= 0; --i )
+ if ( ba[i] == c ) return i;
+
+ return -1;
+}
+
+/**
+ * Extract data in ba from start, including no more than len characters from ba.
+ * Should be exactly comparable to QCString::mid()
+ */
+static QCString extractQCString( const QByteArray &ba, uint start, uint len = 0xffffffff )
+{
+ uint realLen = len;
+
+ if ( ( ba.size() - start ) < len )
+ realLen = ba.size() - start;
+
+ return QCString( &ba[ start ], realLen + 1 );
+}
+
+/**
+ * Search through a QByteArray for a given string. The position of the string
+ * is returned, or -1 if it was not found.
+ */
+static int qByteArrayFindStr( const QByteArray &ba, const char *str )
+{
+ int strLen = qstrlen( str );
+ int searchLen = ba.size() - strLen;
+
+ for ( int i = 0; i <= searchLen; ++i ) {
+ QCString temp = extractQCString( ba, i, strLen );
+ if ( temp == str )
+ return i;
+ }
+
+ return -1;
+}
+
+void CgiProtocol::get( const KURL& url )
+{
+ kdDebug(7124) << "CgiProtocol::get()" << endl;
+ kdDebug(7124) << " URL: " << url.url() << endl;
+#if 0
+ kdDebug(7124) << " Path: " << url.path() << endl;
+ kdDebug(7124) << " Query: " << url.query() << endl;
+ kdDebug(7124) << " Protocol: " << url.protocol() << endl;
+ kdDebug(7124) << " Filename: " << url.filename() << endl;
+#endif
+ QCString protocol = "SERVER_PROTOCOL=HTTP";
+ putenv( protocol.data() );
+
+ QCString requestMethod = "REQUEST_METHOD=GET";
+ putenv( requestMethod.data() );
+
+ QCString query = url.query().mid( 1 ).local8Bit();
+ query.prepend( "QUERY_STRING=" );
+ putenv( query.data() );
+
+ QString path = url.path();
+
+ QString file;
+
+ int pos = path.findRev('/');
+ if ( pos >= 0 ) file = path.mid( pos + 1 );
+ else file = path;
+
+ QString cmd;
+
+ bool stripHeader = false;
+ bool forwardFile = true;
+
+ QStringList::ConstIterator it;
+ for( it = mCgiPaths.begin(); it != mCgiPaths.end(); ++it ) {
+ cmd = *it;
+ if ( !(*it).endsWith("/") )
+ cmd += "/";
+ cmd += file;
+ if ( KStandardDirs::exists( cmd ) ) {
+ forwardFile = false;
+ stripHeader = true;
+ break;
+ }
+ }
+
+ FILE *fd;
+
+ if ( forwardFile ) {
+ kdDebug(7124) << "Forwarding to '" << path << "'" << endl;
+
+ QCString filepath = QFile::encodeName( path );
+
+ fd = fopen( filepath.data(), "r" );
+
+ if ( !fd ) {
+ kdDebug(7124) << "Error opening '" << filepath << "'" << endl;
+ error( KIO::ERR_CANNOT_OPEN_FOR_READING, filepath );
+ return;
+ }
+ } else {
+ kdDebug(7124) << "Cmd: " << cmd << endl;
+
+ fd = popen( QFile::encodeName(KProcess::quote( cmd )).data(), "r" );
+
+ if ( !fd ) {
+ kdDebug(7124) << "Error running '" << cmd << "'" << endl;
+ error( KIO::ERR_CANNOT_OPEN_FOR_READING, cmd );
+ return;
+ }
+ }
+
+ char buffer[ 4090 ];
+
+ while ( !feof( fd ) )
+ {
+ int n = fread( buffer, 1, 2048, fd );
+
+ if ( n == -1 )
+ {
+ // ERROR
+ if ( forwardFile ) {
+ fclose( fd );
+ } else {
+ pclose( fd );
+ }
+ return;
+ }
+
+ buffer[n] = 0;
+
+ if ( stripHeader ) {
+ QByteArray output;
+
+ // Access the buffer in-place by using setRawData()
+ output.setRawData( buffer, n );
+
+ int colon = output.find( ':' );
+ int newline = output.find( '\n' );
+ int semicolon = qByteArrayFindRev( output, ';', newline );
+ int end;
+ if ( semicolon < 0 ) end = newline;
+ else end = semicolon;
+
+#if 0
+ kdDebug(7124) << " colon: " << colon << endl;
+ kdDebug(7124) << " newline: " << newline << endl;
+ kdDebug(7124) << " semicolon: " << semicolon << endl;
+ kdDebug(7124) << " end: " << end << endl;
+#endif
+
+ QCString contentType = extractQCString( output, colon + 1, end - colon - 1 );
+
+ contentType = contentType.stripWhiteSpace();
+
+ kdDebug(7124) << "ContentType: '" << contentType << "'" << endl;
+
+ mimeType( contentType );
+
+ int start = qByteArrayFindStr( output, "\r\n\r\n" );
+ if ( start >= 0 ) start += 4;
+ else {
+ start = qByteArrayFindStr( output, "\n\n" );
+ if ( start >= 0 ) start += 2;
+ }
+
+ if ( start < 0 )
+ start = 0;
+
+ // We're done with the part of the buffer we're using.
+ output.resetRawData ( buffer, n );
+
+ // Now access the part of the buffer after the header.
+ output.setRawData ( buffer + start, n - start );
+ data( output );
+ output.resetRawData ( buffer + start, n - start );
+
+ stripHeader = false;
+ } else {
+ QByteArray array;
+ array.setRawData( buffer, n );
+ data( array );
+ array.resetRawData( buffer, n );
+ }
+ }
+
+ if ( forwardFile ) {
+ fclose( fd );
+ } else {
+ pclose( fd );
+ }
+
+ finished();
+
+ kdDebug(7124) << "CgiProtocol::get - done" << endl;
+}
+
+extern "C" { int KDE_EXPORT kdemain( int argc, char **argv ); }
+
+/*! The kdemain function generates an instance of the ioslave and starts its
+ * dispatch loop. */
+
+int kdemain( int argc, char **argv )
+{
+ KInstance instance( "kio_cgi" );
+
+ kdDebug(7124) << "kio_cgi starting " << getpid() << endl;
+
+ if (argc != 4)
+ {
+ fprintf(stderr, "Usage: kio_cgi protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ CgiProtocol slave( argv[2], argv[3] );
+ slave.dispatchLoop();
+
+ return 0;
+}
diff --git a/kioslave/cgi/cgi.h b/kioslave/cgi/cgi.h
new file mode 100644
index 000000000..fec90aa59
--- /dev/null
+++ b/kioslave/cgi/cgi.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2002 Cornelius Schumacher <schumacher@kde.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 2 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef KIO_CGI_H
+#define KIO_CGI_H
+
+#include <qobject.h>
+
+#include <kio/slavebase.h>
+
+class KProcess;
+
+/*!
+ This class implements an ioslave for viewing CGI script output without the
+ need to run a web server.
+*/
+class CgiProtocol : public KIO::SlaveBase
+{
+ public:
+ CgiProtocol( const QCString &pool, const QCString &app );
+ virtual ~CgiProtocol();
+
+ virtual void get( const KURL& url );
+
+// virtual void mimetype( const KURL& url );
+
+ protected:
+// QCString errorMessage();
+
+ private:
+ QStringList mCgiPaths;
+};
+
+#endif
diff --git a/kioslave/cgi/cgi.protocol b/kioslave/cgi/cgi.protocol
new file mode 100644
index 000000000..9c6cc378e
--- /dev/null
+++ b/kioslave/cgi/cgi.protocol
@@ -0,0 +1,8 @@
+[Protocol]
+exec=kio_cgi
+protocol=cgi
+input=none
+output=filesystem
+reading=true
+DocPath=kioslave/cgi.html
+Icon=html
diff --git a/kioslave/cgi/kcmcgi/Makefile.am b/kioslave/cgi/kcmcgi/Makefile.am
new file mode 100644
index 000000000..abfef594b
--- /dev/null
+++ b/kioslave/cgi/kcmcgi/Makefile.am
@@ -0,0 +1,17 @@
+
+kde_module_LTLIBRARIES = kcm_cgi.la
+
+kcm_cgi_la_SOURCES = kcmcgi.cpp
+kcm_cgi_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_cgi_la_LIBADD = -lkdeui $(LIB_KIO)
+
+INCLUDES= $(all_includes)
+
+kcm_cgi_la_METASOURCES = AUTO
+
+noinst_HEADERS = kcmcgi.h
+
+xdg_apps_DATA = kcmcgi.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmcgi.pot
diff --git a/kioslave/cgi/kcmcgi/kcmcgi.cpp b/kioslave/cgi/kcmcgi/kcmcgi.cpp
new file mode 100644
index 000000000..18436e8d9
--- /dev/null
+++ b/kioslave/cgi/kcmcgi/kcmcgi.cpp
@@ -0,0 +1,151 @@
+/*
+ Copyright (C) 2002 Cornelius Schumacher <schumacher@kde.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 2 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kaboutdata.h>
+#include <kfiledialog.h>
+
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+
+#include "kcmcgi.h"
+#include "kcmcgi.moc"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_cgi( QWidget *parent, const char * )
+ {
+ KGlobal::locale()->insertCatalogue("kcmcgi");
+ return new KCMCgi( parent, "kcmcgi" );
+ }
+}
+
+
+KCMCgi::KCMCgi(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ setButtons(Default|Apply);
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ QGroupBox *topBox = new QGroupBox( 1, Horizontal, i18n("Paths to Local CGI Programs"), this );
+ topLayout->addWidget( topBox );
+
+ mListBox = new QListBox( topBox );
+
+ QHBox *buttonBox = new QHBox( topBox );
+ buttonBox->setSpacing( KDialog::spacingHint() );
+
+ mAddButton = new QPushButton( i18n("Add..."), buttonBox );
+ connect( mAddButton, SIGNAL( clicked() ), SLOT( addPath() ) );
+
+ mRemoveButton = new QPushButton( i18n("Remove"), buttonBox );
+ connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removePath() ) );
+ connect( mListBox, SIGNAL( clicked ( QListBoxItem * )),this, SLOT( slotItemSelected( QListBoxItem *)));
+
+ mConfig = new KConfig("kcmcgirc");
+
+ load();
+ updateButton();
+ KAboutData *about =
+ new KAboutData( I18N_NOOP("kcmcgi"),
+ I18N_NOOP("CGI KIO Slave Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002 Cornelius Schumacher") );
+
+ about->addAuthor( "Cornelius Schumacher", 0, "schumacher@kde.org" );
+ setAboutData(about);
+}
+
+KCMCgi::~KCMCgi()
+{
+ delete mConfig;
+}
+
+void KCMCgi::slotItemSelected( QListBoxItem * )
+{
+ updateButton();
+}
+
+void KCMCgi::updateButton()
+{
+ mRemoveButton->setEnabled( mListBox->selectedItem ());
+}
+
+void KCMCgi::defaults()
+{
+ mListBox->clear();
+ updateButton();
+}
+
+void KCMCgi::save()
+{
+ QStringList paths;
+
+ uint i;
+ for( i = 0; i < mListBox->count(); ++i ) {
+ paths.append( mListBox->text( i ) );
+ }
+
+ mConfig->setGroup( "General" );
+ mConfig->writeEntry( "Paths", paths );
+
+ mConfig->sync();
+}
+
+void KCMCgi::load()
+{
+ mConfig->setGroup( "General" );
+ QStringList paths = mConfig->readListEntry( "Paths" );
+
+ mListBox->insertStringList( paths );
+}
+
+void KCMCgi::addPath()
+{
+ QString path = KFileDialog::getExistingDirectory( QString::null, this );
+
+ if ( !path.isEmpty() ) {
+ mListBox->insertItem( path );
+ emit changed( true );
+ }
+ updateButton();
+}
+
+void KCMCgi::removePath()
+{
+ int index = mListBox->currentItem();
+ if ( index >= 0 ) {
+ mListBox->removeItem( index );
+ emit changed( true );
+ }
+ updateButton();
+}
+
+QString KCMCgi::quickHelp() const
+{
+ return i18n("<h1>CGI Scripts</h1> The CGI KIO slave lets you execute "
+ "local CGI programs without the need to run a web server. "
+ "In this control module you can configure the paths that "
+ "are searched for CGI scripts.");
+}
diff --git a/kioslave/cgi/kcmcgi/kcmcgi.desktop b/kioslave/cgi/kcmcgi/kcmcgi.desktop
new file mode 100644
index 000000000..a948a38b4
--- /dev/null
+++ b/kioslave/cgi/kcmcgi/kcmcgi.desktop
@@ -0,0 +1,231 @@
+[Desktop Entry]
+Icon=run
+Type=Application
+Exec=kcmshell kcmcgi
+DocPath=
+X-KDE-ModuleType=Library
+X-KDE-Library=cgi
+
+Name=CGI Scripts
+Name[af]=CGI Skripte
+Name[ar]=نصوص CGI البرمجية
+Name[az]=CGI Skriptləri
+Name[be]=Сцэнары CGI
+Name[bg]=CGI скриптове
+Name[bn]=সি-জি-আই স্ক্রিপ্ট
+Name[br]=Urzhiaouegoù CGI
+Name[bs]=CGI skripte
+Name[ca]=Scripts CGI
+Name[cs]=CGI skripty
+Name[csb]=Skriptë CGI
+Name[cy]=Sgriptiau CGI
+Name[da]=CGI Scripter
+Name[de]=CGI-Skripte
+Name[el]=Σενάρια CGI
+Name[eo]=CGI-Skriptaĵoj
+Name[es]=Procedimientos CGI
+Name[et]=CGI skriptid
+Name[eu]=CGI scriptak
+Name[fa]=دست‌نوشته‌های CGI
+Name[fi]=CGI-komentosarjat
+Name[fr]=Scripts CGI
+Name[fy]=CGI-skripts
+Name[ga]=Scripteanna CGI
+Name[gl]=Guións CGI
+Name[he]=תסריטי CGI
+Name[hi]=सीजीआई स्क्रिप्ट
+Name[hr]=CGI skripte
+Name[hu]=CGI-programok
+Name[is]=CGI Skriftur
+Name[it]=Script CGI
+Name[ja]=CGI スクリプト
+Name[ka]=CGI სკრიპტები
+Name[kk]=CGI скрипттері
+Name[km]=ស្គ្រីប CGI
+Name[ko]=CGI 스크립트
+Name[lo]=ໂໍຊລາລີສ
+Name[lt]=CGI scenarijai
+Name[lv]=CGI Skripts
+Name[mk]=CGI-скрипти
+Name[mn]=CGI-Скрипт
+Name[ms]=Skrip CGI
+Name[mt]=Scripts CGI
+Name[nb]=CGI-skript
+Name[nds]=CGI-Skripten
+Name[ne]=CGI स्क्रिप्ट
+Name[nl]=CGI-scripts
+Name[nn]=CGI-skript
+Name[nso]=Ditshwaelo tsa CGI
+Name[pa]=CGI ਸਕ੍ਰਿਪਟਾਂ
+Name[pl]=Skrypty CGI
+Name[pt]=Programas CGI
+Name[pt_BR]=Scripts CGI
+Name[ro]=Scripturi CGI
+Name[ru]=Сценарии CGI
+Name[rw]=Agaporogaramu CGI
+Name[se]=CGI-skriptat
+Name[sk]=Skripty CGI
+Name[sl]=Skripte CGI
+Name[sr]=CGI Скрипте
+Name[sr@Latn]=CGI Skripte
+Name[sv]=CGI-skript
+Name[ta]=CGI எழுத்தாக்கங்கள்
+Name[te]=సిజిఐ స్క్రిప్ట్లు
+Name[tg]=Дастнависи CGI
+Name[th]=สคริปต์ CGI
+Name[tr]=CD Betikleri
+Name[tt]=CGI Ämerleklär
+Name[uk]=Скрипти CGI
+Name[uz]=CGI skriptlar
+Name[uz@cyrillic]=CGI скриптлар
+Name[ven]=Zwikiriputi zwa CGI
+Name[vi]=Văn lệnh CGI
+Name[wa]=Scripe CGI
+Name[xh]=Amagama ashicilelwe phantsi CGI
+Name[zh_CN]=CGI 脚本
+Name[zh_TW]=CGI 命令稿
+Name[zu]=Izikript ze-CGI
+Comment=Configure the CGI KIO slave
+Comment[af]=Stel die CGI KIO slaaf op
+Comment[ar]=تهيئة CGI KIO slave
+Comment[be]=Настаўленні CGI KIO slave
+Comment[bg]=Настройване на модула за изпълнение на скриптове без уеб сървър - CGI KIO
+Comment[bn]=CGI KIO স্লেভ কনফিগার করুন
+Comment[bs]=Podešavanje CGI KIO slave-a
+Comment[ca]=Configura l'esclau KIO CGI
+Comment[cs]=Nastavení CGI pro KDE
+Comment[csb]=Kònfigùracëjô procedurë òbsłużënkù CGI
+Comment[cy]=Ffurfweddu'r gwas CGI KIO
+Comment[da]=Indstilling af CGI KIO-slaven
+Comment[de]=Ein-/Ausgabemodul für CGI einrichten
+Comment[el]=Ρυθμίστε το CGI KIO slave
+Comment[eo]=Agordu CGI-enel-sklavon
+Comment[es]=Configuración del KIO slave de CGI
+Comment[et]=CGI KIO mooduli seadistamine
+Comment[eu]=CGI KIO slave-a konfiguratu
+Comment[fa]=پیکربندی پی‌رو CGI KIO
+Comment[fi]=Muokkaa CGI-KIO-palvelun asetuksia
+Comment[fr]=Configuration du CGI KIO slave
+Comment[fy]=Hjir kinne jo de CGI Kio-slave ynstelle
+Comment[ga]=Cumraigh an sclábhaí CGI KIO
+Comment[gl]=Configuración do escravo KIO de CGI
+Comment[he]=שינוי הגדרות פרוטוקול ה־CGI
+Comment[hi]=सीजीआई केआईओ स्लेव कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje CGI KIO podčinjenog
+Comment[hu]=A CGI KDE-protokoll beállításai
+Comment[is]=Stilla CGI þrælinn
+Comment[it]=Configura il KIO-slave CGI
+Comment[ja]=CGI KIO スレーブの設定
+Comment[ka]=CGI KIO slave-ის კონფიგურაცია
+Comment[kk]=CGI KIO slave-ты баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​កូនចៅ CGI KIO
+Comment[ko]=CGI KIO 슬레이브 설정
+Comment[lo]=ປັບແຕ່ງກ້ອງ
+Comment[lt]=Konfigūruoti CGI KIO slave
+Comment[lv]=Konfigurēt CGI KIO vergu
+Comment[mk]=Конфигурација на CGI KIO служителот
+Comment[mn]=CGI-Оролт/Гаралтын-Модул тохируулах
+Comment[ms]=Konfigur hamba CGI KIO
+Comment[mt]=Ikkonfigura l-iskjav CGI
+Comment[nb]=Tilpass CGI KIO slave
+Comment[nds]=Den CGI-In-/Utgaavdeenst instellen
+Comment[ne]=CGI KIO स्लेभ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de CGI Kio-slave instellen
+Comment[nn]=Set opp CGI-KIO-slaven
+Comment[nso]=Beakanya lekgoba la KIO ya CGI
+Comment[pa]=CGI KIO ਸਲੇਵ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja procedury obsługi CGI
+Comment[pt]=Configuração do KIO slave de CGIs
+Comment[pt_BR]=Configurar o KIO (escravo) do CGI
+Comment[ro]=Configurează dispozitivul I/O CGI
+Comment[ru]=Настройка CGI KIO slave
+Comment[rw]=Kuboneza CGI KIO umugaragu
+Comment[se]=Heivet CGI-KIO-šláva
+Comment[sk]=Nastavenie IO klienta CGI
+Comment[sl]=Nastavi podrejenega KIO CGI
+Comment[sr]=Подешавање CGI KIO slave-а
+Comment[sr@Latn]=Podešavanje CGI KIO slave-a
+Comment[sv]=Anpassa I/O-slaven för CGI
+Comment[ta]=CGI KIO slaveஐ வடிவமை
+Comment[tg]=Бандаи CGI KIO-ро танзим кунед
+Comment[th]=ปรับแต่ง CGI KIO slave
+Comment[tr]=CGI KIO aracısını yapılandır
+Comment[tt]=CGI KIO slave caylawı
+Comment[uk]=Налаштування підлеглого KIO CGI
+Comment[uz]=CGI KIO sleyvni moslash
+Comment[uz@cyrillic]=CGI KIO слейвни мослаш
+Comment[ven]=Dzudzanyani phuli CGI KIO
+Comment[vi]=Cấu hình đày tớCGI KIO
+Comment[wa]=Apontyî li mandaye KIO CGI
+Comment[xh]=Qwlalsela i CGI KIO slave
+Comment[zh_CN]=配置 CGI KIO 仆人
+Comment[zh_TW]=設定 CGI KIO slave
+Comment[zu]=Hlanganisela i-CGI KIO slave
+
+Keywords=CGI,KIO,Slave,Paths
+Keywords[ar]=CGI,KIO,Slave,Paths,مسارات
+Keywords[az]=CGI,KIO,Slave,Paths,Cığırlar
+Keywords[be]=Шляхі,CGI,KIO,Slave,Paths
+Keywords[bg]=скриптове, уеб, динамичен, скрипт, Интернет, път, пътища, CGI, KIO, Slave, Paths
+Keywords[br]=CGI,KIO,sklav,hentoù
+Keywords[ca]=CGI,KIO,Esclau,Rutes
+Keywords[cs]=CGI,KIO,slave,cesty
+Keywords[csb]=CGI,KIO,procedurë wé/wi,stegnë
+Keywords[cy]=CGI,KIO,Gwas,Llwybrau
+Keywords[da]=CGI,KIO,Slave,Stier
+Keywords[de]=CGI,KIO,Ein-/Ausgabemodul,Pfade
+Keywords[el]=CGI,KIO,Slave,Διαδρομές
+Keywords[eo]=CGI,Enel,K-enel,sklavo,servo,vojoj
+Keywords[es]=CGI,KIO,Slave,Rutas
+Keywords[et]=CGI,KIO,moodul,otsinguteed
+Keywords[fa]=CGI، KIO، Slave، مسیرها
+Keywords[fi]=CGI,KIO,KIO-palvelu,palvelu,Polut
+Keywords[fr]=CGI,KIO,Slave,Paths,Chemins,Emplacements
+Keywords[fy]=cgi,kio,slave,paths,paden
+Keywords[ga]=CGI,KIO,Sclábhaí,Bealaí
+Keywords[gl]=CGI,KIO,Escravo,Camiños
+Keywords[he]=CGI,KIO,פרוטוקול,נתיבים, Slave,Paths
+Keywords[hi]=सीजीआई,केआईओ,स्लेव,पथ
+Keywords[hr]=CGI,KIO,Slave,Paths,podčinjeni,putanje
+Keywords[hu]=CGI,KIO,protokoll,elérési utak
+Keywords[is]=CGI,KIO,þræll,slóðir
+Keywords[it]=CGI,KIO,kioslave,percorsi
+Keywords[ja]=CGI,KIO,スレーブ,パス
+Keywords[km]=CGI,KIO,កូនចៅ,ផ្លូវ
+Keywords[lt]=CGI,KIO,Slave,Paths, keliai
+Keywords[lv]=CGI,KIO,vergi,ceļi
+Keywords[mk]=CGI,KIO,Slave,Paths,Патеки
+Keywords[mn]=CGI,KIO,Оролт/Гаралтын-Модул,Зам
+Keywords[mt]=CGI,KIO,Slave,Paths,skjav,passaġġ
+Keywords[nb]=CGI,KIO,Slave,slave,stier
+Keywords[nds]=CGI,KIO,Slave,IU,In-/Utgaavdeenst,Deenst,Padden
+Keywords[ne]=CGI,KIO,स्लेभ, मार्ग
+Keywords[nl]=cgi,kio,slave,paths,paden
+Keywords[nn]=CGI,KIO,slave,stiar
+Keywords[nso]=CGI,KIO,Lekgoba,Ditsejana
+Keywords[pa]=CGI,KIO,ਸਲੇਵ,ਮਾਰਗ
+Keywords[pl]=CGI,KIO,procedury we/wy,ścieżki
+Keywords[pt]=CGI,KIO,Slave,Localizações
+Keywords[pt_BR]=CGI,KIO,Escravo,Caminhos
+Keywords[ro]=I/E,IE,CGI,KIO,dispozitiv,căi
+Keywords[rw]=CGI,KIO,Umugaragu,Inzira
+Keywords[se]=CGI,KIO,šláva,bálgát
+Keywords[sk]=CGI,KIO,klient,cesty
+Keywords[sl]=CGI,KIO,podrejeni,pot
+Keywords[sr]=CGI,KIO,Slave,Путање
+Keywords[sr@Latn]=CGI,KIO,Slave,Putanje
+Keywords[sv]=CGI,KIO,Slav,Sökvägar
+Keywords[ta]=CGI,KIO,ஸ்லேவ்,பாதைகள்
+Keywords[te]=సిజిఐ,కెఐఒ,బానిస,దారులు
+Keywords[th]=CGI,KIO,Slave,เส้นทาง
+Keywords[tr]=CGI,KIO,Aracı,Yollar
+Keywords[uk]=CGI,KIO,підлеглий,шлях
+Keywords[uz]=CGI,KIO,Sleyv,Yoʻllar
+Keywords[uz@cyrillic]=CGI,KIO,Слейв,Йўллар
+Keywords[ven]=CGI,KIO,Phuli,Ludila
+Keywords[vi]=CGI,KIO,Đày tớ,Đường dẫn
+Keywords[wa]=CGI,KIO,Slave,Paths,tchimins,mandaye
+Keywords[zh_CN]=CGI,KIO,Slave,Paths,路径
+Keywords[zh_TW]=CGI,KIO,Slave,Paths,路徑
+Keywords[zu]=CGI,KIO,Slave,Izindlela
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kioslave/cgi/kcmcgi/kcmcgi.h b/kioslave/cgi/kcmcgi/kcmcgi.h
new file mode 100644
index 000000000..10e4e3385
--- /dev/null
+++ b/kioslave/cgi/kcmcgi/kcmcgi.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2002 Cornelius Schumacher <schumacher@kde.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 2 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef KCMCGI_H
+#define KCMCGI_H
+
+#include <kcmodule.h>
+
+class QListBox;
+class QPushButton;
+
+class KConfig;
+
+class KCMCgi : public KCModule
+{
+ Q_OBJECT
+ public:
+ KCMCgi( QWidget *parent = 0, const char *name = 0 );
+ ~KCMCgi();
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+ public slots:
+
+ protected slots:
+ void addPath();
+ void removePath();
+ void slotItemSelected( QListBoxItem * item );
+ private:
+ void updateButton();
+ QListBox *mListBox;
+ QPushButton *mAddButton;
+ QPushButton *mRemoveButton;
+
+ KConfig *mConfig;
+};
+
+#endif