webinterface.cpp
来自「wxWidgets写的电驴」· C++ 代码 · 共 378 行
CPP
378 行
//// This file is part of the aMule Project.// // Copyright (c) 2004-2006 shakraw ( shakraw@users.sourceforge.net )// Copyright (c) 2003-2006 Kry ( elkry@sourceforge.net / http://www.amule.org )// Copyright (c) 2003-2006 aMule Team ( admin@amule.org / http://www.amule.org )//// Any parts of this program derived from the xMule, lMule or eMule project,// or contributed by third-party developers are copyrighted by their// respective authors.//// 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 St, Fifth Floor, Boston, MA 02110-1301, USA//#ifdef HAVE_CONFIG_H #include "config.h" // For VERSION#endif#ifndef __WXMSW__ #include <unistd.h>#endif#include <wx/filename.h> // Needed for wxFileName#include <wx/stdpaths.h>#include <cstdio>#ifdef __WXMAC__ #include <CoreFoundation/CFBundle.h> #include <ApplicationServices/ApplicationServices.h> #include <wx/mac/corefoundation/cfstring.h>#endif#include <ec/ECFileConfig.h> // Needed for CECFileConfig#include <common/MD5Sum.h>#include "OtherFunctions.h"#include "WebInterface.h"#include "WebServer.h"//-------------------------------------------------------------------IMPLEMENT_APP(CamulewebApp)//-------------------------------------------------------------------void CamulewebApp::Post_Shell() { m_webserver->StopServer(); delete m_webserver; m_webserver = 0;}bool CamulewebApp::OnInit() { return CaMuleExternalConnector::OnInit();}int CamulewebApp::OnRun() { ConnectAndRun(wxT("aMuleweb"), wxT(VERSION)); return 0;}bool CamulewebApp::CheckDirForTemplate(wxString& dir, const wxString& tmpl){ DebugShow(wxT("checking for directory '") + dir + wxT("'...")); if (wxFileName::DirExists(dir)) { DebugShow(wxT(" yes\n")); dir = JoinPaths(dir, tmpl); DebugShow(wxT("checking for directory '") + dir + wxT("'...")); if (wxFileName::DirExists(dir)) { DebugShow(wxT(" yes\n")); wxString tmplPath = JoinPaths(dir, wxT("login.php")); DebugShow(wxT("checking for file '") + tmplPath + wxT("'...")); if (wxFileName::FileExists(tmplPath)) { DebugShow(wxT(" yes\n")); // dir is already set to the directory component of the template path return true; } else { DebugShow(wxT(" no\n")); } } else { DebugShow(wxT(" no\n")); } } else { DebugShow(wxT(" no\n")); } return false;}bool CamulewebApp::GetTemplateDir(const wxString& templateName, wxString& templateDir){ wxString dir; DebugShow(wxT("looking for template: ") + templateName + wxT("\n"));#ifdef __WXMAC__ CFURLRef amuleBundleUrl; OSStatus status = LSFindApplicationForInfo( kLSUnknownCreator, // This magic string is the bundle identifier in aMule.app's Info.plist CFSTR("org.amule.aMule"), NULL, NULL, &amuleBundleUrl ); if (status == noErr && amuleBundleUrl) { CFBundleRef amuleBundle = CFBundleCreate(NULL, amuleBundleUrl); CFRelease(amuleBundleUrl); if (amuleBundle) { CFURLRef webserverDirUrl = CFBundleCopyResourceURL( amuleBundle, CFSTR("webserver"), NULL, NULL ); CFRelease(amuleBundle); if (webserverDirUrl) { CFURLRef absoluteURL = CFURLCopyAbsoluteURL(webserverDirUrl); CFRelease(webserverDirUrl); if (absoluteURL) { CFStringRef pathString = CFURLCopyFileSystemPath(absoluteURL, kCFURLPOSIXPathStyle); CFRelease(absoluteURL); dir = wxMacCFStringHolder(pathString).AsString(wxLocale::GetSystemEncoding()); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } } } } }#endif dir = GetConfigDir() + wxT("webserver"); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } dir = wxT(WEBSERVERDIR); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } #ifdef __WXGTK__ // Returns 'aMule' when we use 'amule' elsewhere dir = wxStandardPaths::Get().GetDataDir(); dir = dir.BeforeLast(wxFileName::GetPathSeparator()); dir = JoinPaths(dir, JoinPaths(wxT("amule"), wxT("webserver"))); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; }#endif // template not found. reverting to default const wxChar* const defaultTemplateName = wxT("php-default"); if ( templateName == defaultTemplateName ) { return false; } Show(wxT("Template ") + templateName + wxT(" not found, reverting to default\n\n")); return GetTemplateDir(defaultTemplateName, templateDir);}void CamulewebApp::OnInitCmdLine(wxCmdLineParser& amuleweb_parser){ CaMuleExternalConnector::OnInitCmdLine(amuleweb_parser); amuleweb_parser.AddOption(wxT("t"), wxT("template"), _("Loads template <str>"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("s"), wxT("server-port"), _("Webserver HTTP port"), wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("z"), wxT("enable-gzip"), _("Use gzip compression"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("Z"), wxT("disable-gzip"), wxT("Do not use gzip compression"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("A"), wxT("admin-pass"), _("Full access password for webserver"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("G"), wxT("guest-pass"), _("Guest password for webserver"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("a"), wxT("allow-guest"), _("Allow guest access"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("d"), wxT("deny-guest"), _("Deny guest access"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("L"), wxT("load-settings"), _("Load/save webserver settings from/to remote aMule"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxEmptyString, wxT("amule-config-file"), _("aMule config file path. DO NOT USE DIRECTLY!"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); /* * In this mode, internal PHP interpreter is activated, and * amuleweb will forward there requests for .php pages */ amuleweb_parser.AddSwitch(wxEmptyString, wxT("no-php"), _("Disable PHP interpreter (deprecated)"), wxCMD_LINE_PARAM_OPTIONAL); /* * Reload .php page each time it's requested - don't cache * compilation results. Used for script development. */ amuleweb_parser.AddSwitch(wxT("N"), wxT("no-script-cache"), _("Recompile PHP pages on each request"), wxCMD_LINE_PARAM_OPTIONAL);}bool CamulewebApp::OnCmdLineParsed(wxCmdLineParser& parser){ wxString aMuleConfigFile; if (parser.Found(wxT("amule-config-file"), &aMuleConfigFile)) { aMuleConfigFile = FinalizeFilename(aMuleConfigFile); if (!::wxFileExists(aMuleConfigFile)) { fprintf(stderr, "FATAL ERROR: %s does not exist.\n", (const char*)unicode2char(aMuleConfigFile)); return false; } CECFileConfig cfg(aMuleConfigFile); LoadAmuleConfig(cfg); // do not process any other command-line parameters, use defaults instead if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { // no reason to run webserver without a template fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); return true; } m_TemplateFileName = JoinPaths(m_TemplateDir, wxT("aMule.tmpl")); m_Verbose = false; m_KeepQuiet = true; m_LoadSettingsFromAmule = true; return true; } if (CaMuleExternalConnector::OnCmdLineParsed(parser)) { if ( parser.Found(wxT("no-php")) ) { fprintf(stderr, "WARNING: --no-php switch have no effect. Long live PHP\n"); } parser.Found(wxT("template"), &m_TemplateName); if (m_TemplateName.IsEmpty()) { m_TemplateName = wxT("php-default"); } if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { // no reason to run webserver without a template fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); return true; } m_TemplateFileName = JoinPaths(m_TemplateDir, wxT("aMule.tmpl")); DebugShow(wxT("*** Using template: ") + m_TemplateFileName + wxT("\n")); long port; if (parser.Found(wxT("server-port"), &port)) { m_WebserverPort = port; } if (parser.Found(wxT("enable-gzip"))) { m_UseGzip = true; } if (parser.Found(wxT("disable-gzip"))) { m_UseGzip = false; } if (parser.Found(wxT("allow-guest"))) { m_AllowGuest = true; } if (parser.Found(wxT("deny-guest"))) { m_AllowGuest = false; } wxString tmp; if ( parser.Found(wxT("admin-pass"), &tmp) ) { if (tmp.IsEmpty()) { m_AdminPass.Clear(); } else { m_AdminPass.Decode(MD5Sum(tmp).GetHash()); } } if ( parser.Found(wxT("guest-pass"), &tmp) ) { if (tmp.IsEmpty()) { m_GuestPass.Clear(); } else { m_GuestPass.Decode(MD5Sum(tmp).GetHash()); } } m_LoadSettingsFromAmule = parser.Found(wxT("load-settings")); return true; } else { return false; }}const wxString CamulewebApp::GetGreetingTitle(){ return _("aMule Web Server");}void CamulewebApp::Pre_Shell() { //Creating the web server if ( m_TemplateOk ) { m_webserver = new CScriptWebServer(this, m_TemplateDir); } else { m_webserver = new CNoTemplateWebServer(this); } m_webserver->StartServer();}void CamulewebApp::LoadAmuleConfig(CECFileConfig& cfg){ CaMuleExternalConnector::LoadAmuleConfig(cfg); m_UseGzip = (cfg.Read(wxT("/WebServer/UseGzip"), 0l) == 1l); m_AllowGuest = (cfg.Read(wxT("/WebServer/UseLowRightsUser"), 0l) == 1l); cfg.ReadHash(wxT("/WebServer/Password"), &m_AdminPass); cfg.ReadHash(wxT("/WebServer/PasswordLow"), &m_GuestPass); m_WebserverPort = cfg.Read(wxT("/WebServer/Port"), -1l); m_PageRefresh = cfg.Read(wxT("/WebServer/PageRefreshTime"), 120l); m_TemplateName = cfg.Read(wxT("/WebServer/Template"), wxT("default"));}void CamulewebApp::LoadConfigFile(){ CaMuleExternalConnector::LoadConfigFile(); if (m_configFile) { wxString tmp; m_WebserverPort = m_configFile->Read(wxT("/Webserver/Port"), -1l); m_TemplateName = m_configFile->Read(wxT("/Webserver/Template"), wxEmptyString); m_configFile->Read(wxT("/Webserver/UseGzip"), &m_UseGzip, false); m_configFile->Read(wxT("/Webserver/AllowGuest"), &m_AllowGuest, false); m_configFile->ReadHash(wxT("/Webserver/AdminPassword"), &m_AdminPass); m_configFile->ReadHash(wxT("/Webserver/GuestPassword"), &m_GuestPass); }}void CamulewebApp::SaveConfigFile(){ CaMuleExternalConnector::SaveConfigFile(); if (m_configFile) { m_configFile->Write(wxT("/Webserver/Port"), m_WebserverPort); m_configFile->Write(wxT("/Webserver/Template"), m_TemplateName); m_configFile->Write(wxT("/Webserver/UseGzip"), m_UseGzip); m_configFile->Write(wxT("/Webserver/AllowGuest"), m_AllowGuest); m_configFile->WriteHash(wxT("/Webserver/AdminPassword"), m_AdminPass); m_configFile->WriteHash(wxT("/Webserver/GuestPassword"), m_GuestPass); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?