I've got all fix done, should be fine right now! I'm waiting for feedback!!
Cheers Domenico Chierico >From b692b00fb83592245135d8e8b11e0e17a91553b2 Mon Sep 17 00:00:00 2001 From: Domenico Chierico <[email protected]> Date: Thu, 29 Oct 2009 22:46:06 +0100 Subject: [PATCH] Add support for gopher protocol --- myserver/configure.ac | 2 + myserver/include/protocol/Makefile.am | 2 +- myserver/include/protocol/gopher/Makefile.am | 4 + myserver/include/protocol/gopher/engine.h | 64 ++++ myserver/include/protocol/gopher/gopher.h | 102 ++++++ myserver/include/protocol/gopher/gopher_content.h | 266 +++++++++++++++ myserver/src/protocol/Makefile.am | 2 +- myserver/src/protocol/gopher/Makefile.am | 3 + myserver/src/protocol/gopher/engine.cpp | 288 ++++++++++++++++ myserver/src/protocol/gopher/gopher.cpp | 109 ++++++ myserver/src/protocol/gopher/gopher_content.cpp | 363 +++++++++++++++++++++ myserver/src/server/server.cpp | 2 + 12 files changed, 1205 insertions(+), 2 deletions(-) create mode 100644 myserver/include/protocol/gopher/Makefile.am create mode 100644 myserver/include/protocol/gopher/engine.h create mode 100644 myserver/include/protocol/gopher/gopher.h create mode 100644 myserver/include/protocol/gopher/gopher_content.h create mode 100644 myserver/src/protocol/gopher/Makefile.am create mode 100644 myserver/src/protocol/gopher/engine.cpp create mode 100644 myserver/src/protocol/gopher/gopher.cpp create mode 100644 myserver/src/protocol/gopher/gopher_content.cpp diff --git a/myserver/configure.ac b/myserver/configure.ac index 1d5c6af..0e6c6d0 100644 --- a/myserver/configure.ac +++ b/myserver/configure.ac @@ -438,6 +438,7 @@ AC_CONFIG_FILES([ po/Makefile.in include/protocol/https/Makefile include/protocol/http/Makefile include/protocol/http/env/Makefile + include/protocol/gopher/Makefile include/filter/Makefile include/filter/gzip/Makefile include/plugin/Makefile @@ -494,6 +495,7 @@ AC_CONFIG_FILES([ po/Makefile.in src/protocol/https/Makefile src/protocol/http/Makefile src/protocol/http/env/Makefile + src/protocol/gopher/Makefile src/filter/Makefile src/filter/gzip/Makefile src/plugin/Makefile diff --git a/myserver/include/protocol/Makefile.am b/myserver/include/protocol/Makefile.am index aa23116..41dce02 100644 --- a/myserver/include/protocol/Makefile.am +++ b/myserver/include/protocol/Makefile.am @@ -1,3 +1,3 @@ protocolincludedir=$(includedir)/myserver/include/protocol protocolinclude_HEADERS = protocol_buffer.h protocol.h protocols_manager.h url.h -SUBDIRS = control ftp http https +SUBDIRS = control ftp gopher http https diff --git a/myserver/include/protocol/gopher/Makefile.am b/myserver/include/protocol/gopher/Makefile.am new file mode 100644 index 0000000..1995ecf --- /dev/null +++ b/myserver/include/protocol/gopher/Makefile.am @@ -0,0 +1,4 @@ +gopherincludedir=$(includedir)/myserver/include/protocol/gopher +gopherinclude_HEADERS = gopher.h gopher_content.h engine.h + + diff --git a/myserver/include/protocol/gopher/engine.h b/myserver/include/protocol/gopher/engine.h new file mode 100644 index 0000000..dc17d37 --- /dev/null +++ b/myserver/include/protocol/gopher/engine.h @@ -0,0 +1,64 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef GOPHER_ENGINE_H +#define GOPHER_ENGINE_H + +#include "stdafx.h" +#include <include/base/hash_map/hash_map.h> +#include <include/conf/vhost/vhost.h> +#include <include/base/base64/mime_utils.h> + +using namespace std; + +class GopherEngine; + +typedef void (GopherEngine::* MyMethodPtr)(const string&, const string&, GopherMenu&); + +class GopherEngine +{ +public: + GopherEngine (); + GopherContent &incoming (GopherRequest, Vhost *tmp); + +protected: + void dirManagement (const string &fname, const string &path, GopherMenu &tmp); + void fileManagement (const string &fname, const string &path ,GopherMenu &tmp); + + void infoFile (const string &fname, const string &path, GopherMenu &tmp); + void textFile (const string &fname, const string &path, GopherMenu &tmp); + void csoFile (const string &fname, const string &path, GopherMenu &tmp); + void binhexFile (const string &fname, const string &path, GopherMenu &tmp); + void dosbinFile (const string &fname, const string &path, GopherMenu &tmp); + void UUencodeFile (const string &fname, const string &path, GopherMenu &tmp); + void telnetFile (const string &fname, const string &path, GopherMenu &tmp); + void binFile (const string &fname, const string &path, GopherMenu &tmp); + void imageFile (const string &fname, const string &path, GopherMenu &tmp); + void gifFile (const string &fname, const string &path, GopherMenu &tmp); + + MimeRecord* getMIME (string &filename); + + string abs_path; + string hostname; + string port; + Vhost *Host; + HashMap<string,MyMethodPtr> handlers; + + // Class Const +}; +#endif diff --git a/myserver/include/protocol/gopher/gopher.h b/myserver/include/protocol/gopher/gopher.h new file mode 100644 index 0000000..5df31be --- /dev/null +++ b/myserver/include/protocol/gopher/gopher.h @@ -0,0 +1,102 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef GOPHER_H +# define GOPHER_H +# include "stdafx.h" +# include <include/protocol/protocol.h> +# include <sstream> +# include <include/protocol/gopher/gopher_content.h> + +# include <string> +# include <vector> +# include <memory> + +class Gopher : public Protocol +{ +public: + Gopher (); + virtual ~Gopher (); + + virtual char* registerName (char* out,int len) + { + return registerNameImpl (out, len); + } + + static char* registerNameImpl (char*, int len); + + int controlConnection (ConnectionPtr a, + char *b1, + char *b2, + int bs1, + int bs2, + u_long nbtr, + u_long id); + + + static int loadProtocolStatic (); + static int unLoadProtocolStatic (); + + void reply (ConnectionPtr a, + GopherContent &data); +}; + + +/*! + *Adapter class to make Gopher reentrant. + */ + +class GopherProtocol : public Protocol +{ +public: + GopherProtocol () + { + protocolOptions = 0; + } + + virtual ~GopherProtocol () + {} + + virtual char* registerName (char* out, int len) + { + return Gopher::registerNameImpl (out, len); + } + + virtual int controlConnection (ConnectionPtr a, char *b1, char *b2, + int bs1, int bs2, u_long nbtr, u_long id) + { + Gopher Gopher; + int ret = 0; + + ret = Gopher.controlConnection (a, b1, b2, bs1, bs2, nbtr, id); + + return ret; + } + + virtual int loadProtocol () + { + return Gopher::loadProtocolStatic (); + } + + virtual int unLoadProtocol () + { + return Gopher::unLoadProtocolStatic (); + } +}; + +#endif diff --git a/myserver/include/protocol/gopher/gopher_content.h b/myserver/include/protocol/gopher/gopher_content.h new file mode 100644 index 0000000..1e4d5af --- /dev/null +++ b/myserver/include/protocol/gopher/gopher_content.h @@ -0,0 +1,266 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef GOPHER_CONTENT_H +#define GOPHER_CONTENT_H + +#include "stdafx.h" +#include <include/base/socket/socket.h> +#include <include/base/mem_buff/mem_buff.h> +#include <include/base/file/file.h> +#include <include/connection/connection.h> +#include <vector> +#include <string> + +using namespace std; + +class GopherContent +{ +public: + virtual void toProtocol (Socket *s) = 0; +}; + +class GopherRequest +{ +public: + GopherRequest (); + GopherRequest (string s){ data = s; } + GopherRequest (string s, ConnectionPtr conn) + { + data = s; + baseReq = conn; + } + void setConnection (ConnectionPtr conn){ baseReq = conn; } + string getRequest (){ return data; } + ConnectionPtr getConnection (){ return baseReq; } +protected: + string data; + ConnectionPtr baseReq; +}; + +class GopherItem: public GopherContent +{ + public: + GopherItem (); + GopherItem (char, const char[], const char[], const char[], const char[]); + + ~GopherItem (); + + void Type (char T){ type=T; } + char Type (){ return type; } + void Desc (string D){ desc=D; } + string Desc (){ return desc; } + void Rlocation (string R){ rlocation=R; } + string Rlocation (){ return rlocation; } + void Host (string H){ host = H; } + string Host (){ return host; } + void Port (string P){ port=P; } + string Port (){ return port; } + + void toProtocol (Socket *s); + + protected: + char type; + string desc; + string rlocation; + string host; + string port; + + void init (char, const char[], const char[], const char[], const char[]); + +}; + +class GopherMenu: public GopherContent +{ +public: + void addIntro (string tmp, string host, string port); + void addItem (GopherItem data); + + void toProtocol (Socket *s); + +private: + vector<GopherItem> Items; + +}; + + +class GopherInfo: public GopherItem +{ +public: + GopherInfo (); + GopherInfo (const char[], const char[], const char[], const char[]); + ~GopherInfo (); + + void Type (char T){ type='i'; } +}; + +class GopherFile: public GopherItem +{ +public: + GopherFile (); + GopherFile (const char[], const char[], const char[], const char[]); + ~GopherFile (); + + void Type (char T){ type='0'; } +}; + +class GopherDirectory: public GopherItem +{ +public: + GopherDirectory (); + GopherDirectory (const char[], const char[], const char[], const char[]); + ~GopherDirectory (); + + void Type (char T){ type='1'; } +}; + +class GopherCSO: public GopherItem +{ +public: + GopherCSO (); + GopherCSO (const char[], const char[], const char[], const char[]); + ~GopherCSO (); + + void Type (char T){ type='2'; } +}; +class GopherError: public GopherItem +{ +public: + GopherError (); + GopherError (const char[], const char[], const char[], const char[]); + ~GopherError (); + + void Type (char T){ type='3'; } +}; + +class GopherMacBinHex: public GopherItem +{ +public: + GopherMacBinHex (); + GopherMacBinHex (const char[], const char[], const char[], const char[]); + ~GopherMacBinHex (); + + void Type (char T){ type='4'; } +}; + +class GopherDosBin: public GopherItem +{ +public: + GopherDosBin (); + GopherDosBin (const char[], const char[], const char[], const char[]); + ~GopherDosBin (); + + void Type (char T){ type='5'; } +}; + +class GopherUnixUUencode: public GopherItem +{ +public: + GopherUnixUUencode (); + GopherUnixUUencode (const char[], const char[], const char[], const char[]); + ~GopherUnixUUencode (); + + void Type (char T){ type='6'; } +}; + +class GopherSearchServer: public GopherItem +{ +public: + GopherSearchServer (); + GopherSearchServer (const char[], const char[], const char[], const char[]); + ~GopherSearchServer (); + + void Type (char T){ type='7'; } +}; + +class GopherTelnet: public GopherItem +{ +public: + GopherTelnet (); + GopherTelnet (const char[], const char[], const char[], const char[]); + ~GopherTelnet (); + + void Type (char T){ type='8'; } +}; + +class GopherBin: public GopherItem +{ +public: + GopherBin (); + GopherBin (const char[], const char[], const char[], const char[]); + ~GopherBin (); + + void Type (char T){ type='9'; } +}; + +class GopherRendundantServer: public GopherItem +{ +public: + GopherRendundantServer (); + GopherRendundantServer (const char[], const char[], const char[], const char[]); + ~GopherRendundantServer (); + + void Type (char T){ type='+'; } +}; + +class GopherGif: public GopherItem +{ +public: + GopherGif (); + GopherGif (const char[], const char[], const char[], const char[]); + ~GopherGif (); + + void Type (char T){ type='g'; } +}; + +class GopherImage: public GopherItem +{ +public: + GopherImage (); + GopherImage (const char[], const char[], const char[], const char[]); + ~GopherImage (); + + void Type (char T){ type='I'; } +}; + +class GopherData: public GopherContent +{ +public: + GopherData (string); + + void toProtocol (Socket *s); + +private: + string buff; +}; + + +class GopherFileContent: public GopherContent +{ +public: + GopherFileContent (string s); + ~GopherFileContent (); + + void toProtocol (Socket *s); + +private: + File *sfile; + MemBuf buf; +}; + +#endif diff --git a/myserver/src/protocol/Makefile.am b/myserver/src/protocol/Makefile.am index 0917b3b..0f26c60 100644 --- a/myserver/src/protocol/Makefile.am +++ b/myserver/src/protocol/Makefile.am @@ -1,7 +1,7 @@ lib_LIBRARIES = libprotocol.a libprotocol_a_SOURCES = protocol_buffer.cpp protocol.cpp protocols_manager.cpp \ url.cpp -SUBDIRS = control ftp http https +SUBDIRS = control ftp gopher http https AM_CPPFLAGS = $(all_includes) install: diff --git a/myserver/src/protocol/gopher/Makefile.am b/myserver/src/protocol/gopher/Makefile.am new file mode 100644 index 0000000..a952fe3 --- /dev/null +++ b/myserver/src/protocol/gopher/Makefile.am @@ -0,0 +1,3 @@ +lib_LIBRARIES = libgopher.a +libgopher_a_SOURCES = gopher.cpp gopher_content.cpp engine.cpp +AM_CPPFLAGS = $(all_includes) diff --git a/myserver/src/protocol/gopher/engine.cpp b/myserver/src/protocol/gopher/engine.cpp new file mode 100644 index 0000000..67f110f --- /dev/null +++ b/myserver/src/protocol/gopher/engine.cpp @@ -0,0 +1,288 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + +#include <include/protocol/gopher/gopher_content.h> +#include <include/protocol/gopher/engine.h> +#include <include/conf/vhost/vhost.h> +#include <include/server/server.h> +#include <include/base/read_directory/read_directory.h> +#include <include/base/file/files_utility.h> +#include <include/base/file/file.h> +#include <include/base/mem_buff/mem_buff.h> + + +#include <iostream> +#include <fstream> +#include <sstream> + +GopherEngine::GopherEngine() +{ + string info = "info"; + string cso = "cso"; + string binhex = "binhex"; + string dosbin = "dosbin"; + string UUencode = "UUencode"; + string telnet = "telnet"; + string bin = "bin"; + string image = "image"; + string gif = "gif"; + string text = "text"; + handlers.put (info, &GopherEngine::infoFile); + handlers.put (text, &GopherEngine::textFile); + handlers.put (cso, &GopherEngine::csoFile); + handlers.put (binhex, &GopherEngine::binhexFile); + handlers.put (dosbin, &GopherEngine::dosbinFile); + handlers.put (UUencode, &GopherEngine::UUencodeFile); + handlers.put (telnet, &GopherEngine::telnetFile); + handlers.put (bin, &GopherEngine::binFile); + handlers.put (image, &GopherEngine::imageFile); + handlers.put (gif, &GopherEngine::gifFile); +} + +GopherContent &GopherEngine::incoming(GopherRequest req, Vhost *host) +{ + ReadDirectory fd; + GopherContent *Gud; + GopherMenu *Gu; + stringstream Port; + Port << host->getPort (); + port = Port.str (); + hostname = req.getConnection ()->getLocalIpAddr (); + abs_path = host->getDocumentRoot (); + Host = host; + + string path = abs_path; + path.append ("/"); + path.append (req.getRequest ()); + if(! fd.findfirst (path.c_str ())) + { + Gu = new GopherMenu; + if(FilesUtility::getPathRecursionLevel (path)>0) + { + do { + if(fd.name[0]!='.') + { + if (fd.attrib & FILE_ATTRIBUTE_DIRECTORY) + dirManagement (fd.name, req.getRequest (), *Gu); + else + fileManagement (fd.name, req.getRequest (), *Gu); + } + }while(!fd.findnext ()); + } + else + Gu->addIntro(string(_("Invalid requested Path\n")), hostname, port); + fd.findclose (); + } + else + { + Gud = (GopherContent*)new GopherFileContent (path); + return *Gud; + } + return *Gu; +} + +void GopherEngine::dirManagement (const string &fname, const string &path, GopherMenu &tmp) +{ + string file_path = path; + file_path.append ("/"); + file_path.append (fname); + tmp.addItem (GopherDirectory (fname.c_str (), + file_path.c_str (), + hostname.c_str (), + port.c_str ())); +} + +void GopherEngine::fileManagement (const string &fname, const string &path,GopherMenu &tmp) +{ + string ext; + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + string abs_name = abs_path; + if (abs_name != "") + abs_name.append ("/"); + abs_name.append (f_path); + + FilesUtility::getFileExt (ext,fname); + if (handlers.containsKey (ext.c_str ())) + (this->*handlers.get(ext.c_str ())) (fname, path, tmp); + else + { + MimeRecord *mime = getMIME (abs_name); + if (mime!=NULL) + { + string mymime = mime->mimeType; + mymime = mymime.substr (0,mymime.find ('/',0)); + if (handlers.containsKey (mymime.c_str ())) + (this->*handlers.get (mymime.c_str ()))(fname, path, tmp); + } + else + tmp.addItem (GopherFile (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); + } +} + +/*! + * Returns the MIME type passing its extension. + * Returns zero if the file is registered. + */ +MimeRecord* GopherEngine::getMIME (string &filename) +{ + const char *handler = NULL; + + if (Host->isMIME ()) + return Host->getMIME ()->getMIME (filename); + + return Server::getInstance ()->getMimeManager ()->getMIME (filename, handler); +} + +void GopherEngine::textFile(const string &fname, const string &path,GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherFile (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} +void GopherEngine::csoFile(const string &fname, const string &path,GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherCSO (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::binhexFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherMacBinHex (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::dosbinFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherDosBin (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::UUencodeFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherUnixUUencode (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::telnetFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherTelnet (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} +void GopherEngine::binFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherBin (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::imageFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherImage (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::gifFile (const string &fname, const string &path, GopherMenu &tmp) +{ + string f_path = path; + if (f_path != "") + f_path.append ("/"); + f_path.append (fname); + tmp.addItem (GopherGif (fname.c_str (), + f_path.c_str (), + hostname.c_str () , + port.c_str ())); +} + +void GopherEngine::infoFile (const string &fname, const string &path,GopherMenu &tmp) +{ + string file_path; + file_path.append (abs_path); + file_path.append ("/"); + file_path.append (path); + file_path.append ("/"); + file_path.append (fname); + + File f; + int state; + u_long fsize; + state = f.openFile (file_path.c_str (), File::READ); + if(!state) + { + MemBuf buff; + u_long real; + int sts; + fsize = f.getFileSize (); + buff.setLength (fsize); + f.read (buff.getBuffer (), fsize, &real); + if(real == fsize) + tmp.addIntro (buff.getBuffer (), hostname, port); + f.close (); + } +} diff --git a/myserver/src/protocol/gopher/gopher.cpp b/myserver/src/protocol/gopher/gopher.cpp new file mode 100644 index 0000000..bcc91db --- /dev/null +++ b/myserver/src/protocol/gopher/gopher.cpp @@ -0,0 +1,109 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + + +#include <iostream> + + +#include <include/protocol/gopher/gopher.h> +#include <include/protocol/gopher/gopher_content.h> +#include <include/protocol/gopher/engine.h> +#include <include/server/server.h> +#include <include/server/clients_thread.h> +#include <include/base/string/securestr.h> + + +/*! + * Constructor for the Gopher class + */ + +Gopher::Gopher () +{} + +/*! + * Destructor for the Gopher class. + */ +Gopher::~Gopher () +{} + +/*! + * Service method + */ + +char *Gopher::registerNameImpl (char* out, int len) +{ + if (out) + { + myserver_strlcpy (out, "GOPHER", len); + } + return (char*) "GOPHER"; +} + +/*! + * The loading unloading routine + */ + +int Gopher::loadProtocolStatic () +{} + +int Gopher::unLoadProtocolStatic () +{ + return 1; +} + +/*! + * Main protocol implementation stuff + */ + +int Gopher::controlConnection (ConnectionPtr pConnection, + char *b1, + char *b2, + int bs1, + int bs2, + u_long nbtr, + u_long id) +{ + char buffer[256]; + u_long nbr; + GopherEngine g; + + if (pConnection == NULL) + return ClientsThread::DELETE_CONNECTION; + Server *server = Server::getInstance (); + if (server == NULL) + return ClientsThread::DELETE_CONNECTION; + string command (b1); + string::size_type loc = command.find ('\n',0); + while( loc == string::npos ){ + pConnection->socket->read (buffer, sizeof (buffer), &nbr); + command+=buffer; + loc = command.find ('\n',0); + } + GopherContent &Gu = g.incoming (GopherRequest (command.substr (0, + ((int)loc)-1), + pConnection) + ,pConnection->host); + reply (pConnection,Gu); +} + +void Gopher::reply (ConnectionPtr pConnection, + GopherContent &data) +{ + data.toProtocol (pConnection->socket); + pConnection->socket->close (); +} diff --git a/myserver/src/protocol/gopher/gopher_content.cpp b/myserver/src/protocol/gopher/gopher_content.cpp new file mode 100644 index 0000000..e9ff615 --- /dev/null +++ b/myserver/src/protocol/gopher/gopher_content.cpp @@ -0,0 +1,363 @@ +/* -*- mode: c++ -*- */ +/* +MyServer +Copyright (C) 2002-2009 Free Software Foundation, Inc. +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 <http://www.gnu.org/licenses/>. +*/ + +#include <iostream> +#include <sstream> +#include <string> + +#include <include/protocol/gopher/gopher_content.h> +#include <include/base/string/stringutils.h> + + +void GopherMenu::addIntro (string freeText, string host, string port) +{ + size_t size = freeText.size (); + char myline[size]; + vector<GopherItem> tmp; + istream *res; + istringstream str (freeText); + while (!str.getline (myline, size).eof ()) + { + tmp.push_back (GopherInfo (myline, + "(None)", + host.c_str (), + port.c_str ())); + } + tmp.push_back (GopherInfo (myline, + "(None)", + host.c_str (), + port.c_str ())); + Items.insert (Items.begin (),tmp.begin (), tmp.end ()); +} + +void GopherMenu::addItem (GopherItem i) +{ + Items.push_back (i); +} + +void GopherMenu::toProtocol (Socket *s) +{ + for(int i=0;i<Items.size ();i++) + { + Items.at (i).toProtocol (s); + } + s->send (".\n", 3, 0); +} + +GopherItem::GopherItem (char t, + const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init (t, d, loc, h, p); +} + +GopherItem::GopherItem () +{ + init(0, "", "", "", ""); +} + +void GopherItem::init (char t, + const char d[], + const char loc[], + const char h[], + const char p[]) +{ + Type (t); + Desc (d); + Rlocation (loc); + Host (h); + Port (p); +} + +GopherItem::~GopherItem () +{} + +void GopherItem::toProtocol (Socket *s) +{ + string res; + res = "-"; + res[0]=type; + res.append (desc); + res.append ("\t"); + res.append (rlocation); + res.append ("\t"); + res.append (host); + res.append ("\t"); + res.append (port); + res.append ("\t\n"); + s->send (res.c_str (), res.length (), 0); +} + +GopherInfo::GopherInfo () +{ + init ('i', "", "", "", ""); +} + +GopherInfo::GopherInfo (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('i', d, loc, h, p); +} + +GopherInfo::~GopherInfo (){} + +GopherFile::GopherFile () +{ + init ('0', "", "", "", ""); +} + +GopherFile::GopherFile (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('0', d, loc, h, p); +} + +GopherFile::~GopherFile (){} + + + +GopherDirectory::GopherDirectory () +{ + init ('1', "", "", "", ""); +} + +GopherDirectory::GopherDirectory (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('1', d, loc, h, p); +} + +GopherDirectory::~GopherDirectory () +{} + +GopherCSO::GopherCSO () +{ + init ('2', "", "", "", ""); +} + +GopherCSO::~GopherCSO () +{} + +GopherCSO::GopherCSO (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('2', d, loc, h, p); +} + +GopherError::GopherError () +{ + init ('3', "", "", "", ""); +} + +GopherError::~GopherError () +{} + +GopherError::GopherError (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('3', d, loc, h, p); +} + +GopherMacBinHex::GopherMacBinHex () +{ + init ('4', "", "", "", ""); +} + +GopherMacBinHex::~GopherMacBinHex () +{} + +GopherMacBinHex::GopherMacBinHex (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('4', d, loc, h, p); +} + +GopherDosBin::GopherDosBin () +{ + init('5', "", "", "", ""); +} + +GopherDosBin::~GopherDosBin () +{} + +GopherDosBin::GopherDosBin (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('5', d, loc, h, p); +} + +GopherUnixUUencode::GopherUnixUUencode () +{ + init ('6', "", "", "", ""); +} + +GopherUnixUUencode::~GopherUnixUUencode () +{} + +GopherUnixUUencode::GopherUnixUUencode (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('6', d, loc, h, p); +} + +GopherSearchServer::GopherSearchServer () +{ + init ('7', "", "", "", ""); +} + +GopherSearchServer::~GopherSearchServer () +{} + +GopherSearchServer::GopherSearchServer (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('7', d, loc, h, p); +} + +GopherTelnet::GopherTelnet () +{ + init ('8', "", "", "", ""); +} + +GopherTelnet::~GopherTelnet () +{} + +GopherTelnet::GopherTelnet (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('8', d, loc, h, p); +} + +GopherBin::GopherBin () +{ + init ('9', "", "", "", ""); +} + +GopherBin::~GopherBin () +{} + +GopherBin::GopherBin (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('9', d, loc, h, p); +} + +GopherRendundantServer::GopherRendundantServer () +{ + init (0, "", "", "", ""); +} + +GopherRendundantServer::~GopherRendundantServer () +{} + +GopherRendundantServer::GopherRendundantServer (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init (0, d, loc, h, p); +} + +GopherGif::GopherGif () +{ + init ('g', "", "", "", ""); +} + +GopherGif::~GopherGif () +{} + +GopherGif::GopherGif (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('g', d, loc, h, p); +} + +GopherImage::GopherImage () +{ + init ('g', "", "", "", ""); +} + +GopherImage::~GopherImage () +{} + +GopherImage::GopherImage (const char d[], + const char loc[], + const char h[], + const char p[]) +{ + init ('I', d, loc, h, p); +} + + +GopherData::GopherData (string data) +{ + buff = data; +} + +void GopherData::toProtocol (Socket *s) +{ + string res = buff; + res.append ("\r\n.\r\n"); + s->send (res.c_str (), res.length (), 0); +} + + +GopherFileContent::GopherFileContent (string fnome) +{ + sfile = new File (); + sfile->openFile (fnome.c_str (), File::READ); + buf.setLength (4096); +} + +GopherFileContent::~GopherFileContent () +{ + sfile->close (); + delete sfile; +} + +void GopherFileContent::toProtocol (Socket *s) +{ + u_long tmp; + sfile->fastCopyToSocket (s, 0, &buf, &tmp); +} diff --git a/myserver/src/server/server.cpp b/myserver/src/server/server.cpp index 3b0c29a..da88639 100644 --- a/myserver/src/server/server.cpp +++ b/myserver/src/server/server.cpp @@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <include/protocol/http/http.h> #include <include/protocol/https/https.h> #include <include/protocol/control/control_protocol.h> +#include <include/protocol/gopher/gopher.h> #include <include/protocol/ftp/ftp.h> #include <include/base/string/stringutils.h> #include <include/base/socket/socket.h> @@ -360,6 +361,7 @@ void Server::loadPlugins () Protocol *protocolsSet[] = {new HttpProtocol (), new HttpsProtocol (), + new GopherProtocol (), new FtpProtocol (), new ControlProtocol (), NULL}; -- 1.6.3.3
