From cfcb654e53b847d67e7532f1f5078e4817f371bb Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Wed, 17 Feb 2010 17:05:00 +0000 Subject: [PATCH] added into the repository: src/threadcontroller.cpp this file was out of controll by subversion (I forgot to add it) added: the update can only download files from urles which begin with: http://downloads.sourceforge.net/ ftp://ttmath.org/ this is in the case of someone hacked the server with *.ini file git-svn-id: svn://ttmath.org/publicrep/ttcalc/trunk@293 e52654a7-88a9-db11-a3e9-0013d4bc506e --- src/Makefile.dep | 31 ++++---- src/compileconfig.h | 4 +- src/mainwindow.cpp | 23 +----- src/misc.cpp | 78 ++++++++++++++++++++ src/misc.h | 47 ++++++++++++ src/threadcontroller.cpp | 151 +++++++++++++++++++++++++++++++++++++++ src/ttcalc_update.ini | 4 +- src/update.cpp | 20 +++++- 8 files changed, 317 insertions(+), 41 deletions(-) create mode 100644 src/misc.cpp create mode 100644 src/misc.h create mode 100644 src/threadcontroller.cpp diff --git a/src/Makefile.dep b/src/Makefile.dep index e93dc30..3caadad 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -1,21 +1,24 @@ -o = resource.o calculation.o convert.o download.o functions.o iniparser.o languages.o mainwindow.o pad.o parsermanager.o programresources.o tabs.o threadcontroller.o update.o variables.o winmain.o - -calculation.o: calculation.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h +# add "resource.o" to "o" as well +o = resource.o calculation.o convert.o download.o functions.o iniparser.o languages.o mainwindow.o misc.o pad.o parsermanager.o programresources.o tabs.o threadcontroller.o update.o variables.o winmain.o + +calculation.o: calculation.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h convert.o: convert.cpp convert.h compileconfig.h bigtypes.h download.o: download.cpp compileconfig.h download.h -functions.o: functions.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -iniparser.o: iniparser.cpp compileconfig.h iniparser.h -languages.o: languages.cpp compileconfig.h languages.h bigtypes.h -mainwindow.o: mainwindow.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h update.h download.h -pad.o: pad.cpp programresources.h compileconfig.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h pad.h -parsermanager.o: parsermanager.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h -programresources.o: programresources.cpp compileconfig.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -tabs.o: tabs.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -threadcontroller.o: threadcontroller.cpp threadcontroller.h stopcalculating.h compileconfig.h -update.o: update.cpp compileconfig.h update.h download.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h messages.h resource.h winmain.h tabs.h pad.h -variables.o: variables.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +functions.o: functions.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +iniparser.o: iniparser.cpp compileconfig.h iniparser.h +languages.o: languages.cpp compileconfig.h languages.h bigtypes.h +mainwindow.o: mainwindow.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h update.h download.h misc.h +misc.o: misc.cpp +pad.o: pad.cpp programresources.h compileconfig.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h pad.h +parsermanager.o: parsermanager.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h +programresources.o: programresources.cpp compileconfig.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +tabs.o: tabs.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +threadcontroller.o: threadcontroller.cpp threadcontroller.h stopcalculating.h compileconfig.h +update.o: update.cpp compileconfig.h update.h download.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h messages.h resource.h winmain.h tabs.h pad.h misc.h +variables.o: variables.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h update.h download.h + .SUFFIXES: .cpp .o .cpp.o: diff --git a/src/compileconfig.h b/src/compileconfig.h index 9b0baf2..e51a82f 100644 --- a/src/compileconfig.h +++ b/src/compileconfig.h @@ -55,8 +55,8 @@ */ #define TTCALC_MAJOR_VER 0 #define TTCALC_MINOR_VER 9 -#define TTCALC_REVISION_VER 1 -#define TTCALC_PRERELEASE_VER 0 +#define TTCALC_REVISION_VER 2 +#define TTCALC_PRERELEASE_VER 1 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2f05d2c..de85214 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -41,33 +41,14 @@ #include "update.h" #include "pad.h" #include "bigtypes.h" +#include "misc.h" + namespace MainWindowFunctions { -int ToLower(int c) -{ - if( c>='A' && c<='Z' ) - return c - 'A' + 'a'; - -return c; -} - - -/*! - this function compares two strings - (case insensitive) -*/ -bool EqualStrings(const char * str1, const char * str2) -{ - for( ; ToLower(*str1) == ToLower(*str2) ; ++str1, ++str2 ) - if( *str1 == 0 ) - return true; // *str2 will be 0 too - -return false; -} /*! diff --git a/src/misc.cpp b/src/misc.cpp new file mode 100644 index 0000000..b7db328 --- /dev/null +++ b/src/misc.cpp @@ -0,0 +1,78 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + + +int ToLower(int c) +{ + if( c>='A' && c<='Z' ) + return c - 'A' + 'a'; + +return c; +} + + +/*! + this function compares two strings + (case insensitive) +*/ +bool EqualStrings(const char * str1, const char * str2) +{ + for( ; ToLower(*str1) == ToLower(*str2) ; ++str1, ++str2 ) + if( *str1 == 0 ) + return true; // *str2 will be 0 too + +return false; +} + + +/*! + returning true if short_str is a substring of long_str (no case-sensitive) +*/ +bool IsSubStringNoCase(const char * short_str, const char * long_str) +{ + while( *short_str && *long_str && ToLower(*short_str) == ToLower(*long_str) ) + { + ++short_str; + ++long_str; + } + + if( *short_str == 0 ) + return true; + +return false; +} diff --git a/src/misc.h b/src/misc.h new file mode 100644 index 0000000..06629d3 --- /dev/null +++ b/src/misc.h @@ -0,0 +1,47 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#ifndef headerfilemisc +#define headerfilemisc + +int ToLower(int c); +bool EqualStrings(const char * str1, const char * str2); +bool IsSubStringNoCase(const char * short_str, const char * long_str); + + +#endif diff --git a/src/threadcontroller.cpp b/src/threadcontroller.cpp new file mode 100644 index 0000000..370f3c6 --- /dev/null +++ b/src/threadcontroller.cpp @@ -0,0 +1,151 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2008, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "threadcontroller.h" +#include + + + +ThreadController::ThreadController() +{ + calculations = 0; + ready_for_stop = 0; + exit_thread = false; +} + + +ThreadController::~ThreadController() +{ + if(calculations) CloseHandle(calculations); + if(ready_for_stop) CloseHandle(ready_for_stop); +} + + +bool ThreadController::Init() volatile +{ + char * buffer = new char[300]; + + // with 'GetTickCount()' we're generating an unique identifier of our event + // (there can be another window of ttcalc) + sprintf((char*)buffer,"TTCalcEventForManagingThreads9928%u", + (unsigned int)GetTickCount()); + + // 'calculations' will be for auto-reseting and initialized as non-signaled + if( (calculations = CreateEvent(0,false,false,(char*)buffer))==NULL) + { + delete [] buffer; + return false; + } + + sprintf((char*)buffer,"TTCalcEventReadyForStop5567%u", + (unsigned int)GetTickCount()); + + // 'ready_for_stop' will be for manual-reseting and initialized as signaled + // 'manual-reset' means that we must call ResetEvent() function (from WinAPI) + // to manually reset the state to nonsignaled + if( (ready_for_stop = CreateEvent(0,true,true,(char*)buffer))==NULL) + { + delete [] buffer; + return false; + } + + delete [] buffer; + +return stop_calculating.Init(); +} + + +void ThreadController::ReadyForStop() volatile +{ + SetEvent( ready_for_stop ); +} + + +void ThreadController::StopCalculatingAndExitThread() volatile +{ + WaitForSingleObject(ready_for_stop,INFINITE); + + stop_calculating.Stop(); + exit_thread = true; + SetEvent(calculations); +} + + +void ThreadController::StopCalculating() volatile +{ + WaitForSingleObject(ready_for_stop, INFINITE); + + stop_calculating.Stop(); +} + + +void ThreadController::StartCalculating() volatile +{ + SetEvent(calculations); +} + + +volatile bool ThreadController::WaitForCalculatingAndBlockForStop() volatile +{ + WaitForSingleObject(calculations,INFINITE); + ResetEvent(ready_for_stop); + + stop_calculating.Start(); + +return !exit_thread; +} + + +const volatile ttmath::StopCalculating * ThreadController::GetStopObject() volatile const +{ + return &stop_calculating; +} + + +bool ThreadController::WasStopSignal() volatile const +{ + return stop_calculating.WasStopSignal(); +} + + +// private +ThreadController::ThreadController(const ThreadController &) +{ +} + + + diff --git a/src/ttcalc_update.ini b/src/ttcalc_update.ini index 562823a..005a7db 100644 --- a/src/ttcalc_update.ini +++ b/src/ttcalc_update.ini @@ -1,7 +1,7 @@ # this file is downloaded from a webserver during checking for an update [normal] -url = http://downloads.sourceforge.net/project/ttcalc/ttcalc/ttcalc-0.9.1/ttcalc-0.9.1-setup.exe?use_mirror=dfn +url = http://downloads.sourceforge.net/project/ttcalc/ttcalc/ttcalc-0.9.1/ttcalc-0.9.1-setup.exe filename = ttcalc-0.9.1-setup.exe version.major = 0 version.minor = 9 @@ -9,7 +9,7 @@ version.revision = 1 version.prerelease = 0 [portable] -url = http://downloads.sourceforge.net/project/ttcalc/ttcalc/ttcalc-0.9.1/ttcalc-portable-0.9.1-bin.tar.gz?use_mirror=dfn +url = http://downloads.sourceforge.net/project/ttcalc/ttcalc/ttcalc-0.9.1/ttcalc-portable-0.9.1-bin.tar.gz filename = ttcalc-portable-0.9.1-bin.tar.gz version.major = 0 version.minor = 9 diff --git a/src/update.cpp b/src/update.cpp index f69e062..7a4b222 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2006-2009, Tomasz Sowa + * Copyright (c) 2006-2010, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,6 +48,8 @@ #include "resource.h" #include "languages.h" #include "winmain.h" +#include "misc.h" + namespace Update @@ -258,6 +260,20 @@ void DownloadProgram::Close() +/* + we check whether the download url is correct + this is in the case of someone hacked the server with *.ini file +*/ +bool IsServerCorrect(const std::string & url) +{ + if( IsSubStringNoCase("http://downloads.sourceforge.net/", url.c_str()) || + IsSubStringNoCase("ftp://ttmath.org/", url.c_str()) ) + return true; + +return false; +} + + /* this method is called from the other thread too @@ -298,7 +314,7 @@ DownloadIni down_ini; IniParser::Error err = iparser.ReadFromFile( down_ini.GetFileName() ); - if( err == IniParser::err_ok ) + if( err == IniParser::err_ok && IsServerCorrect(url_) ) { major_ = atoi(ini_value[0].c_str()); minor_ = atoi(ini_value[1].c_str());