From 822f84f5dac64183c556bd86fea8cd7b0527f528 Mon Sep 17 00:00:00 2001 From: SomeDude Date: Mon, 28 Jul 2008 07:59:00 +0200 Subject: [PATCH] version 0.3.14 --- CMakeLists.txt | 25 +- fonts/font1.bmp | Bin 0 -> 45534 bytes fonts/font2.bmp | Bin 0 -> 52030 bytes fonts/font3.bmp | Bin 0 -> 13670 bytes fonts/font4.bmp | Bin 0 -> 26942 bytes fonts/font5.bmp | Bin 0 -> 29294 bytes fonts/font6.bmp | Bin 0 -> 10814 bytes fonts/font7.bmp | Bin 0 -> 29294 bytes include/freenet/captcha/alternatecaptcha1.h | 36 ++ include/freenet/captcha/freeimage/bitmap.h | 66 +++ include/freenet/captcha/freeimage/font.h | 33 ++ include/global.h | 2 +- readme.txt | 15 +- src/freenet/captcha/alternatecaptcha1.cpp | 148 +++++++ src/freenet/captcha/freeimage/bitmap.cpp | 661 ++++++++++++++++++++++++++++ src/freenet/captcha/freeimage/font.cpp | 92 ++++ src/freenet/introductionpuzzleinserter.cpp | 8 + src/http/fmshttprequesthandlerfactory.cpp | 2 +- src/http/pages/homepage.cpp | 2 +- src/http/pages/peerdetailspage.cpp | 2 +- src/optionssetup.cpp | 2 +- 21 files changed, 1082 insertions(+), 12 deletions(-) create mode 100644 fonts/font1.bmp create mode 100644 fonts/font2.bmp create mode 100644 fonts/font3.bmp create mode 100644 fonts/font4.bmp create mode 100644 fonts/font5.bmp create mode 100644 fonts/font6.bmp create mode 100644 fonts/font7.bmp create mode 100644 include/freenet/captcha/alternatecaptcha1.h create mode 100644 include/freenet/captcha/freeimage/bitmap.h create mode 100644 include/freenet/captcha/freeimage/font.h create mode 100644 src/freenet/captcha/alternatecaptcha1.cpp create mode 100644 src/freenet/captcha/freeimage/bitmap.cpp create mode 100644 src/freenet/captcha/freeimage/font.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 08eed47..27de288 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,9 @@ IF(APPLE) ENDIF(APPLE) OPTION(DO_CHARSET_CONVERSION "Do charset conversion on sent messages to UTF-8. This requires libiconv." ON) OPTION(I_HAVE_READ_THE_README "I have fully read and understood the readme.txt." OFF) +OPTION(ALTERNATE_CAPTCHA "Use alternate captcha. This requires the FreeImage library." OFF) -SET(FMS_SRC +SET(FMS_SRC src/base64.cpp src/bitmapvalidator.cpp src/board.cpp @@ -116,6 +117,13 @@ IF(DO_CHARSET_CONVERSION) SET(FMS_SRC ${FMS_SRC} src/charsetconverter.cpp) ENDIF(DO_CHARSET_CONVERSION) +IF(ALTERNATE_CAPTCHA) + SET(FMS_SRC ${FMS_SRC} + src/freenet/captcha/alternatecaptcha1.cpp + src/freenet/captcha/freeimage/bitmap.cpp + src/freenet/captcha/freeimage/font.cpp) +ENDIF(ALTERNATE_CAPTCHA) + IF(NOT I_HAVE_READ_THE_README) MESSAGE(FATAL_ERROR "You must fully read the readme.txt before continuing.") ENDIF(NOT I_HAVE_READ_THE_README) @@ -158,6 +166,12 @@ FIND_LIBRARY(POCO_UTIL_LIBRARY NAMES PocoUtil PocoUtilmt) FIND_LIBRARY(POCO_XML_LIBRARY NAMES PocoXML PocoXMLmt) FIND_LIBRARY(PTHREADS_LIBRARY NAMES pthread pthreads pthreadvc2) FIND_LIBRARY(ICONV_LIBRARY NAMES iconv iconv_s libiconv libiconv_s) +IF(ALTERNATE_CAPTCHA) + FIND_FILE(FREEIMAGE_LIBRARY NAMES libfreeimage.a PATHS /usr/lib/) + IF(NOT FREEIMAGE_LIBRARY) + FIND_LIBRARY(FREEIMAGE_LIBRARY NAMES FreeImage libFreeImage libfreeimage) + ENDIF(NOT FREEIMAGE_LIBRARY) +ENDIF(ALTERNATE_CAPTCHA) IF(POCO_FOUNDATION_LIBRARY) TARGET_LINK_LIBRARIES(fms ${POCO_FOUNDATION_LIBRARY}) @@ -214,6 +228,15 @@ IF(DO_CHARSET_CONVERSION) ENDIF(ICONV_LIBRARY) ENDIF(DO_CHARSET_CONVERSION) +IF(ALTERNATE_CAPTCHA) + IF(FREEIMAGE_LIBRARY) + TARGET_LINK_LIBRARIES(fms ${FREEIMAGE_LIBRARY}) + ADD_DEFINITIONS("-DALTERNATE_CAPTCHA") + ELSE(FREEIMAGE_LIBRARY) + MESSAGE(FATAL_ERROR "Could not find the FreeImage library. Set the location manually, or turn off the alternate captchas.") + ENDIF(FREEIMAGE_LIBRARY) +ENDIF(ALTERNATE_CAPTCHA) + # FreeBSD won't find Poco include files without this IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") INCLUDE_DIRECTORIES(AFTER /usr/local/include) diff --git a/fonts/font1.bmp b/fonts/font1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..47e5d467ecc8e6cd9e038e7281bceca77b054a88 GIT binary patch literal 45534 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 literal 0 HcmV?d00001 diff --git a/fonts/font3.bmp b/fonts/font3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4e2d868c5098b9140c484a4df671004dc170a287 GIT binary patch literal 13670 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 literal 0 HcmV?d00001 diff --git a/fonts/font4.bmp b/fonts/font4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5750ee221a8a30690f23eacc58ef5437d161208 GIT binary patch literal 26942 zcmeI4v2Pqnc88lDK$F;HDqu&P)S(Om_7FSE2AunUAYi};XLAtX9fCYf0}d2k>R{o> ze}Ka~*nk^$pyXhs4i#LuQ_(&Eo1Kh=?*OG!UR7-x9W z&yk@Zc+$HhbU38^SoIfjBFzCWhaI0Q}`b{>YelS-h3Tn?zL$jukb|^ZuW27a-QDCUp|0umPOIUPun&< z?TZipp(DO?q$g6&O@8huBcyrzaGXEVg;M51S>4n^QmQWJ=d;L=GKQDc&AH25=KPOC z4=)COP|K-D;QQpft@x_i^f;*3<(yCJoZplCpGybQKa`HESmwB0o+#sW*eSzvY|LTC zPRp}hPqb%aSu4}ZR4Lb*)z$HsoqwkCGu7e4SkN}*H2yrP!@d(_kPzSHsWLm2mp0Sq zd0o9(|5*AmM}TYaAu^~QLTf%hkbh|Zxn}Q@Z$eRYX{m*P__=bOa_w@xlV5}$ZR%oC z#p{@B)-~r@-@EkUW9VGdb3R|2y?m}teo$O5dz$kKQ*`N4Jja=9&i5aGFt$&w19uF6F@C{kT2NdAH~3xeVKk-zUZI(qnC~?7g|>@fY&x)TZv-lXG6v z)b^|!>6`85Z}EGQ10Bb0lGneeqBr~QQz`vtALcsQRqB%N%hYjAD=A88Bjq||UrqPj zuT*xSKHYogDx=up8Bgk;D1D}s7%5M^@5|INr?Alvc=}EsQ%U9p3(2YMdHlJ?&d$GhuAimim*g`QUX)$@L~W{$`(~>bpI^I_k-gvC zjDIeF__D_1^TlJNEsR21+RXRW{ZSqFXzl@+8(&qL`$2_P21?oQsl$$6Dtke7GH{>3 zwK-Or@;b$4x4IDhWLnAaDBh3kgm^EpTW|6@#nv|cpk4fOv1gq+x5n~QCFwm#(c{-m z|Npgi&5!#W&CUbI>7o2X`=8I#u4A8Ra(1dNZ02zjHkG-^wac6)-^r?SBEAfpEN$id z1m7-|qpe+vK|I$RybO~L9m&Qz=bWcGUtVb)>QH#wPm|cRk@I7*UAiZ`$4t|lAE}RB z`cQtT#g({Cy{UQpUB&Oxhw_7e+3xuF)X6S2ev9)r6yK#g8voe?dG=t&Fx7nghC%T= zv{3wQ=I=mkm$Jc^s%tXM<9D&xip9C@S9kI9{JqFNKgIZi zBiUNPmwlbJ6rQ;N>(BqT#y*!Jk+lC$Wl#6sBb9BhPW->*tWL+hg)z2)Rx-MUW=?d; zw)~>*qTA5ci0+NMUCeqMVkLj4OC^nelvZSU-q9jCuS5)TX2{)@bQ-T#{YX|{Je*^etF|b+y6=a>`D);!P1v)T^_%W7b$L5 z6hW$Vdh;b$5D*Q!TGazw{c#*Z<9M^ipz{F&;JoX76`pu!_c%3sOk z{FR*1!K>(pT}7*ZTSXh6z5JjmuB31OE;^sJ$U-USuWrlf@iRt#{8O>$qUCK)sh+um z&ZP+VlrAG>XagDT)TW0@5w}~RqwMx=)2G`yKKeb5Ksy4-rMemuY~y-WyfxFur)$t{ z4fOGIt&7_T{FBTP8_#dsi1WS=bH8YPYWYFhj}Ti-Z7aUL=2v{n@hrEJ5Ob*wo_m?8 z7LcQ-TF;cn#{DdE=nE@_z{jQyH||YGBkeDW<@`9PLNdo7`7=HOA8Q+V_(h2KwF~vR zbuY>pwR(s7p|X^oW@c|48?x zJhRgWgl!r*JE$%7VT3{%Tv^@;CgSRX$ewzATPgzp&BLmOhf$0nUOiI7MmF9BrDQuYh znAvB^Q%f7f&W~ND;y_<8d_txb7|QIkw&2Z&-Hux51aiT?eDGL1?)A; zxc};4;l={F9^r|Z^7bBDwq1Rh+TR6?#pAEU(sT{%DRuBJ z>G2O={I=#@z;jj3r_o*EI>B7Y>GS<5Sle48q{m1n~b@;PsL#@fcAO_lWW zJBrT%2l;#s|4lQl?AZ#w3>KGTCBBb?ip8+vGfFysFR%CPeKOwh$ z@%|50zKv(@`269O|7pZm$It$4{nr7IB4aTwInQw-e*ShsiA>pWA6|H$FCd{_T( z zuVzm|sVgK@!;CU zeivVM@T{Y>#X3kI(UBC%`_K5L@fVB8IUmHpYdJ06s*v-I?9NYBzmQ>!O?mp^{iiPr zHI(v8*=RfEPu|Bl0na&fp8g+BBJbz#S~fp_mWqKt5eLuSkn)9u_>Js~5Z}pj{2T-P zT+ScPs^VBS^3-+mmHHxo;+M*&{Ke~P)m9%bY(qHyKIw{|`~F|@rwVp1B}Ev&`v`r5 zpSRF``8?J``TOj@dF;pXmp=kr&n~P__mw8BiK}&X>m0vZaAD27uY@gme#h|NYJ4m$ zl_%v|WsPPnT%BS%?@A2_N zu%qekRq6k%t@HlpJZ0o#SjTanE}lN7$L~DH?;I)T9iHQJJLA{X-8^INejB{}-EMr< z&F^G94DpW>J3RkRMOXjvNAvN^dHor+lm8^P>-@ogl&;3Vj`@$5wcTU+`D1TnY#1-b zlC&w5*6T5&|K}m{O;fG>Wwv*zGHuLX_;I~HX5(j(zx;Ky`}~!w^^ugZL>NDe^xcJg zT6R0B+c)^x+U`E?=d3?py50G*b-<2V|J!_9Wy!oPwOA=_gksIZA;dOa>b%#R@u%W#9>`7_iumkK{9_7|6|Z(qRrdZ* z&)L%rK|pH!pu*n1;@ePIGk6};yZ8S9(4Z1mTk)T&(+cS>8O~J3R*1Vx&g23 z>hHNtt(aAN{*|Yll%MNm34iBxUQKWCDn82N2t1C!Pc#C250c;THbK{Mt+a}HUB<=U z-|O0)+tOiwo91tK`2Fy@TK$_HBeBK{C{;&23STbQ{I$xoMcrHY)961LXgyLJzJ9Tf z!J?-L&;7jj#rUhZ?#*OpkEhPpQRn9gZ|kBesB<3wzj~v7s4e)J)MMb6mQ()htg?S| zgZkG$R`&Z}rx)yZF%k=@K5`1WwlL8|Ml2w`FD!% z|7ORV!`ki}{664TzKZ;HsqZt7lvmroxUTJc^6)cap^Am3W#aREj~(9s&5mEbuU7nx z`IEEx`(wQPh<`PXJpW$DuJ%X%?$JogHYM-n zl=rsbmx_-+ze6y-))-4UkIwsjH8F|rZ7s#KC$n!q%Hs(9Tt=XN;DLq*^0N+Jm!hq) z+&6Q*vOw6go9x;a?LOP~zF4KtwG1n*0ri?MxzMGgtPSuBrHk6kw)WVUpkznjk3&r7 zDzo3>bgBY&_>U^{o>EEV$w+Ex${(ui&l!BjY9>E;)+~FrR32fiLfU4mo_6ego#OKQ z5gvBo_&Y19J@_a=Y>bqiS}E4U+gg_Kw&ucnFlEb@BZZ@VQtOxUGkn|l@FyXTr?Mtj z`eaX}A1TlC-B8M&@KikGHZ013UF)74ys==NZRBb;c`QN!!+`49+t~_%VMOSK{+d zr#Oms>Q?eR=BT#VwPIHBI$_*652e~EgN}>5>bZV$!GsU787ES|e&KDL#A8Rhq|e^v z`)GR{fuCXoMhY5w0?&Hvsd=J8>Q^U~)a5eB3^^Z?`fYe(r+#T)I5y-wCI#Qs^CV5rRe+Nx~qJgQ5#@|SM(80o= zzwGASmz4HWIjFUki649r-xELeci#KYdg=VdEqq&L>n81O@Jp@1iqChKkRavw|D;;? zw~wd)yn~)<>=&;ENrDvq>niSB%C2Omj#-aC3UN(;sQ}|wu}&uA%j#}^p}sHV$M==F zheLvt_+#l%x*;K!i2qIsf1;G{8;@lS%Bv}xzuWNi|AqYF`MZINE51?TMtmBV$kpN- zKNqhK=lr{HJFg)xcGVvLCaCkYtFBldn5#G9Qz^mEd9I(Aa%TK;9^Vb=;JJRM3S{?I ha%Sv>&H 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 literal 0 HcmV?d00001 diff --git a/fonts/font6.bmp b/fonts/font6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96fc7e11a709850b8644922df6ad45b6d694521b GIT binary patch literal 10814 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 uw+Yk_YiT(q{ow@n+vFcDcTdQlF-f+ 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 literal 0 HcmV?d00001 diff --git a/include/freenet/captcha/alternatecaptcha1.h b/include/freenet/captcha/alternatecaptcha1.h new file mode 100644 index 0000000..a47f2c3 --- /dev/null +++ b/include/freenet/captcha/alternatecaptcha1.h @@ -0,0 +1,36 @@ +#ifndef _alternate_captcha1_ +#define _alternate_captcha1_ + +#ifdef ALTERNATE_CAPTCHA + +#include + +#include "icaptcha.h" +#include "freeimage/bitmap.h" +#include "freeimage/font.h" + +class AlternateCaptcha1:public ICaptcha +{ +public: + AlternateCaptcha1(); + + void Generate(); + + const bool GetPuzzle(std::vector &puzzle); + const bool GetSolution(std::vector &solution); + +private: + void LoadFonts(); + const std::string GenerateRandomString(const int len); + + static bool m_fontsloaded; + static std::vector m_fonts; + + std::vector m_puzzle; + std::vector m_solution; + +}; + +#endif // ALTERNATE_CAPTCHA + +#endif // _alternate_captcha1_ diff --git a/include/freenet/captcha/freeimage/bitmap.h b/include/freenet/captcha/freeimage/bitmap.h new file mode 100644 index 0000000..9e00af3 --- /dev/null +++ b/include/freenet/captcha/freeimage/bitmap.h @@ -0,0 +1,66 @@ +#ifndef _freeimage_bitmap_ +#define _freeimage_bitmap_ + +#include + +#include +#include + +namespace FreeImage +{ + +class Bitmap +{ +public: + Bitmap(); + Bitmap(const Bitmap &bmp); + Bitmap(const std::string &typestr, const std::string &filename); + Bitmap(FIBITMAP *bmp); + Bitmap(const int width, const int height, const int bpp); + ~Bitmap(); + + const bool Create(const int width, const int height, const int bpp); + + inline const unsigned int Height() const { return m_bmp ? FreeImage_GetHeight(m_bmp) : 0 ; } + inline const unsigned int Width() const { return m_bmp ? FreeImage_GetWidth(m_bmp) : 0 ; } + inline const unsigned int BPP() const { return m_bmp ? FreeImage_GetBPP(m_bmp) : 0 ; } + void ConvertBPP(const int bpp); + + void Clear(const RGBQUAD color); + void ClearTransparent(); + + const bool Save(const std::string &filename) const; + const bool SaveToMemory(const std::string &typestr, std::vector &data) const; + const bool Load(const std::string &typestr, const std::string &filename); + const bool LoadFromMemory(const std::string &typestr, std::vector &data); + + void SetTransparent(); + + void PutPixel(const int x, const int y, RGBQUAD color); + RGBQUAD GetPixel(const int x, const int y) const; + const int GetPixelIndex(const int x, const int y) const; + void Line(const int x1, const int y1, const int x2, const int y2, const RGBQUAD color); + void FastLine(const int x1, const int y1, const int x2, const int y2, const RGBQUAD color); + //void Arc(const int cx, const int cy, const int r, const float start, const float end, const RGBQUAD color); + void Rect(const int x1, const int y1, const int w, const int h, const bool filled, const RGBQUAD color); + void Rotate(const double angle, const int shiftx, const int shifty, const int originx, const int originy); + void HorizontalOffset(const int y, const double shift); + void VerticalOffset(const int x, const double shift); + + void Blit(const Bitmap &bmp, const int destx, const int desty, const int sourcex, const int sourcey, const int w, const int h, const int alpha); + void BlitTrans(const Bitmap &bmp, const int destx, const int desty, const int sourcex, const int sourcey, const int w, const int h); + + Bitmap &operator=(const Bitmap &rhs); + +private: + void Destroy(); + void AALine(const int x1, const int y1, const int x2, const int y2, const RGBQUAD color); + double LineFunction(const double slopex, const double slopey, const int startx, const int starty, const double testx, const double texty); + + FIBITMAP *m_bmp; + +}; + +} + +#endif // _freeimage_bitmap_ diff --git a/include/freenet/captcha/freeimage/font.h b/include/freenet/captcha/freeimage/font.h new file mode 100644 index 0000000..047cd19 --- /dev/null +++ b/include/freenet/captcha/freeimage/font.h @@ -0,0 +1,33 @@ +#ifndef _freeimage_font_ +#define _freeimage_font_ + +#include "bitmap.h" + +namespace FreeImage +{ + +class Font +{ +public: + Font(); + Font(const Bitmap &bmp); + ~Font(); + + const bool Load(const Bitmap &bmp); + + const Bitmap &Char(const int num); + + const int FontWidth() const { return m_fontwidth; } + const int FontHeight() const { return m_fontheight; } + +private: + int m_fontwidth; + int m_fontheight; + Bitmap m_blank; + std::vector m_chars; + +}; + +} + +#endif // _freeimage_font_ diff --git a/include/global.h b/include/global.h index 868e753..7104808 100644 --- a/include/global.h +++ b/include/global.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR "0" #define VERSION_MINOR "3" -#define VERSION_RELEASE "13" +#define VERSION_RELEASE "14" #define FMS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE typedef Poco::ScopedLock Guard; diff --git a/readme.txt b/readme.txt index 4ac04fc..6f278bf 100644 --- a/readme.txt +++ b/readme.txt @@ -11,7 +11,9 @@ If you want to use the bundled SQLite3 library, add a -D USE_BUNDLED_SQLITE=ON to the cmake command. Use of the bundled SQLite3 library is on by default when compiling on a Mac. To turn off charset conversion to UTF-8 when sending messages, add a -D DO_CHARSET_CONVERSION=OFF. Compiling with charset -conversion turned on is recommended. +conversion turned on is recommended. If you would like to compile using the +alternate captchas, add a -D ALTERNATE_CAPTCHA=ON to the cmake command line. +This option requires the FreeImage library to be installed. UPGRADING --------- @@ -22,11 +24,12 @@ keep the same database unless otherwise noted. INSTALLATION ------------ -Place the binary and any templates in a directory of your choice. Windows -users may need to download the runtime DLLs available from the fms Freesite and -place in the fms directory if they are not already installed on the system. On -the first run, a database file will also be created in this directory. Make -sure the user that runs FMS has read/write access to this directory. +Place the binary, any templates, and the fonts directory in a directory of your +choice. Windows users may need to download the runtime DLLs available from the +fms Freesite and place in the fms directory if they are not already installed +on the system. On the first run, a database file will also be created in this +directory. Make sure the user that runs FMS has read/write access to this +directory. RUNNING ------- diff --git a/src/freenet/captcha/alternatecaptcha1.cpp b/src/freenet/captcha/alternatecaptcha1.cpp new file mode 100644 index 0000000..07f4dde --- /dev/null +++ b/src/freenet/captcha/alternatecaptcha1.cpp @@ -0,0 +1,148 @@ +#include "../../../include/freenet/captcha/alternatecaptcha1.h" + +#include +#include + +#include + +#ifdef ALTERNATE_CAPTCHA + +bool AlternateCaptcha1::m_fontsloaded(false); +std::vector AlternateCaptcha1::m_fonts; + +AlternateCaptcha1::AlternateCaptcha1() +{ + if(m_fontsloaded==false) + { + FreeImage_Initialise(true); + LoadFonts(); + m_fontsloaded=true; + } +} + +void AlternateCaptcha1::Generate() +{ + std::string puzzlestring=GenerateRandomString(5); + FreeImage::Bitmap tempchar(50,50,32); + tempchar.SetTransparent(); + FreeImage::Bitmap bmp(110,50,32); + bmp.SetTransparent(); + + m_solution.clear(); + m_puzzle.clear(); + + // draw the text + if(m_fonts.size()>0) + { + for(int i=0; i &puzzle) +{ + puzzle=m_puzzle; + return true; +} + +const bool AlternateCaptcha1::GetSolution(std::vector &solution) +{ + solution=m_solution; + return true; +} + +void AlternateCaptcha1::LoadFonts() +{ + FreeImage::Bitmap bmp; + Poco::Path path("fonts"); + Poco::DirectoryIterator di(path); + Poco::DirectoryIterator end; + + while(di!=end) + { + if(di.name().find("bmp")!=std::string::npos) + { + bmp.Load("bmp",di.path().toString()); + m_fonts.push_back(FreeImage::Font(bmp)); + } + ++di; + } + +} + +#endif // ALTERNATE_CAPTCHA diff --git a/src/freenet/captcha/freeimage/bitmap.cpp b/src/freenet/captcha/freeimage/bitmap.cpp new file mode 100644 index 0000000..4c90fc1 --- /dev/null +++ b/src/freenet/captcha/freeimage/bitmap.cpp @@ -0,0 +1,661 @@ +#include "../../../../include/freenet/captcha/freeimage/bitmap.h" + +#include + +namespace FreeImage +{ + +Bitmap::Bitmap() +{ + m_bmp=0; +} + +Bitmap::Bitmap(const Bitmap &bmp) +{ + m_bmp=0; + *this=bmp; +} + +Bitmap::Bitmap(const std::string &typestr, const std::string &filename) +{ + m_bmp=0; + Load(typestr,filename); +} + +Bitmap::Bitmap(FIBITMAP *bmp):m_bmp(bmp) +{ + +} + +Bitmap::Bitmap(const int width, const int height, const int bpp) +{ + m_bmp=FreeImage_Allocate(width,height,bpp,0,0,0); +} + +Bitmap::~Bitmap() +{ + Destroy(); +} + +void Bitmap::AALine(const int x1, const int y1, const int x2, const int y2, const RGBQUAD color) +{ + RGBQUAD tempcol; + int height=Height(); + int width=Width(); + int fromx=x1; + int fromy=y1; + int tox=x2; + int toy=y2; + double sx=x2-x1; + double sy=y2-y1; + + if(fabs(sx)<=0.8 && fabs(sy)<=0.8) + { + return; + } + + double hypot=sqrt((sx*sx)+(sy*sy)); + sx/=hypot; + sy/=hypot; + + fromx<0 ? fromx=0 : false; + fromx>=width ? fromx=width-1 : false; + tox<0 ? tox=0 : false; + tox>=width ? tox=width-1 : false; + fromy<0 ? fromy=0 : false; + fromy>=height ? fromy=height-1 : false; + toy<0 ? toy=0 : false; + toy>=height ? toy=height-1 : false; + + int lx=fromx; + int rx=tox; + if(rxminval) + { + FreeImage_GetPixelColor(m_bmp,i,(height-1)-j,&tempcol); + tempcol.rgbRed=((1.0-temp)*((double)tempcol.rgbRed)+temp*((double)color.rgbRed)); + tempcol.rgbGreen=((1.0-temp)*((double)tempcol.rgbGreen)+temp*((double)color.rgbGreen)); + tempcol.rgbBlue=((1.0-temp)*((double)tempcol.rgbBlue)+temp*((double)color.rgbBlue)); + FreeImage_SetPixelColor(m_bmp,i,(height-1)-j,&tempcol); + } + + } + } + +} + +void Bitmap::Blit(const Bitmap &bmp, const int destx, const int desty, const int sourcex, const int sourcey, const int w, const int h, const int alpha) +{ + if(m_bmp && bmp.m_bmp) + { + int width=w; + int height=h; + if(destx+width-1>=Width()) + { + width=Width()-destx+1; + } + if(desty+height-1>=Height()) + { + height=Height()-desty+1; + } + FIBITMAP *temp=FreeImage_Copy(bmp.m_bmp,sourcex,sourcey,sourcex+width-1,sourcey+height-1); + FreeImage_Paste(m_bmp,temp,destx,desty,alpha); + FreeImage_Unload(temp); + } +} + +void Bitmap::BlitTrans(const Bitmap &bmp, const int destx, const int desty, const int sourcex, const int sourcey, const int w, const int h) +{ + if(m_bmp && bmp.m_bmp) + { + RGBQUAD sourcecol; + RGBQUAD destcol; + int sourcew=bmp.Width(); + int sourceh=bmp.Height(); + int destw=Width(); + int desth=Height(); + int dx=destx; + int dy=desty; + double alpha=0.0; + for(int y=sourcey; y=0 && y=0 && x=0 && dx=0 && dy0) // some translucency + { + FreeImage_GetPixelColor(m_bmp,dx,(desth-1)-dy,&destcol); + alpha=(double)sourcecol.rgbReserved/255.0; + sourcecol.rgbRed=(sourcecol.rgbRed*alpha)+(destcol.rgbRed*(1.0-alpha)); + sourcecol.rgbGreen=(sourcecol.rgbGreen*alpha)+(destcol.rgbGreen*(1.0-alpha)); + sourcecol.rgbBlue=(sourcecol.rgbBlue*alpha)+(destcol.rgbBlue*(1.0-alpha)); + sourcecol.rgbReserved=width ? fromx=width-1 : false; + tox<0 ? tox=0 : false; + tox>=width ? tox=width-1 : false; + fromy<0 ? fromy=0 : false; + fromy>=height ? fromy=height-1 : false; + toy<0 ? toy=0 : false; + toy>=height ? toy=height-1 : false; + + int dx=tox-fromx; + int dy=toy-fromy; + + if(dx==0 && dy==0) + { + return; + } + + int xinc1=1; + if(dx<0) + { + xinc1=-1; + dx=-dx; + } + int yinc1=1; + if(dy<0) + { + yinc1=-1; + dy=-dy; + } + + int x=fromx; + int y=fromy; + int xinc2=xinc1; + int yinc2=yinc1; + + double den; + double num; + int numadd; + int numpixels; + + if(dx>=dy) + { + xinc1=0; + yinc2=0; + den=dx+0.0; + num=0.5*dx; + numadd=dy; + numpixels=dx; + } + else + { + xinc2=0; + yinc1=0; + den=dy+0.0; + num=0.5*dy; + numadd=dx; + numpixels=dy; + } + + int cpixel; + for(cpixel=0; cpixel<=numpixels; cpixel++) + { + FreeImage_SetPixelColor(m_bmp,x,(height-1)-y,&color); + num+=numadd; + if(num>=den) + { + num=-den; + x+=xinc1; + y+=yinc1; + } + x+=xinc2; + y+=yinc2; + } + } +} + +RGBQUAD Bitmap::GetPixel(const int x, const int y) const +{ + RGBQUAD color; + color.rgbRed=0; + color.rgbGreen=0; + color.rgbBlue=0; + color.rgbReserved=0; + + if(m_bmp && x>=0 && x=0 && y &data) +{ + bool loaded=false; + Destroy(); + if(data.size()>0) + { + FREE_IMAGE_FORMAT type=FIF_BMP; + if(typestr.find("png")!=std::string::npos) + { + type=FIF_PNG; + } + + FIMEMORY *mem=FreeImage_OpenMemory((BYTE *)&data[0],data.size()); + m_bmp=FreeImage_LoadFromMemory(type,mem,0); + if(m_bmp) + { + loaded=true; + } + FreeImage_CloseMemory(mem); + } + return loaded; +} + +Bitmap &Bitmap::operator=(const Bitmap &rhs) +{ + if(this!=&rhs) + { + Destroy(); + if(rhs.Width()>0 && rhs.Height()>0) + { + m_bmp=FreeImage_Allocate(rhs.Width(),rhs.Height(),rhs.BPP(),0,0,0); + //FIBITMAP *temp=FreeImage_Copy(rhs.m_bmp,0,0,rhs.Width()-1,rhs.Height()-1); + //FreeImage_Paste(m_bmp,rhs.m_bmp,0,0,-1); + //FreeImage_Unload(temp); + Blit(rhs,0,0,0,0,rhs.Width(),rhs.Height(),-1); + } + } + return *this; +} + +void Bitmap::PutPixel(const int x, const int y, RGBQUAD color) +{ + if(m_bmp && x>=0 && x=0 && y=0 && y=0 && x &data) const +{ + bool saved=false; + if(m_bmp) + { + FREE_IMAGE_FORMAT type=FIF_BMP; + if(typestr.find("png")!=std::string::npos) + { + type=FIF_PNG; + } + FIMEMORY *mem=FreeImage_OpenMemory(0,0); + if(FreeImage_SaveToMemory(type,m_bmp,mem,0)) + { + FreeImage_SeekMemory(mem,0,SEEK_END); + data.resize(FreeImage_TellMemory(mem)); + FreeImage_SeekMemory(mem,0,SEEK_SET); + FreeImage_ReadMemory(&data[0],1,data.size(),mem); + saved=true; + } + FreeImage_CloseMemory(mem); + } + return saved; +} + +void Bitmap::SetTransparent() +{ + if(m_bmp) + { + FreeImage_SetTransparent(m_bmp,true); + } +} + +void Bitmap::VerticalOffset(const int x, const double shift) +{ + if(m_bmp) + { + int width=Width(); + int height=Height(); + int starty=width-1; + int endy=ceil(shift); + int dy=-1; + int offset1=-(floor(shift)); + int offset2=-(ceil(shift)); + RGBQUAD color1; + RGBQUAD color2; + RGBQUAD newcolor; + double part2=shift-floor(shift); + double part1=1.0-part2; + + if(shift<0) + { + starty=0; + endy=width-1-ceil(abs(shift)); + dy=1; + offset1=-ceil(shift); + offset2=-floor(shift); + part2=abs(shift-ceil(shift)); + part1=1.0-part2; + } + + FreeImage_GetPixelColor(m_bmp,x,(height-1)-(starty+offset1),&color1); + for(int y=starty+dy; y!=endy; y+=dy) + { + FreeImage_GetPixelColor(m_bmp,x,(height-1)-(y+offset2),&color2); + + newcolor.rgbRed=(color1.rgbRed*part1)+(color2.rgbRed*part2); + newcolor.rgbGreen=(color1.rgbGreen*part1)+(color2.rgbGreen*part2); + newcolor.rgbBlue=(color1.rgbBlue*part1)+(color2.rgbBlue*part2); + + FreeImage_SetPixelColor(m_bmp,x,(height-1)-y,&newcolor); + + color1=color2; + } + } +} + +} // namespace FreeImage diff --git a/src/freenet/captcha/freeimage/font.cpp b/src/freenet/captcha/freeimage/font.cpp new file mode 100644 index 0000000..0f9541c --- /dev/null +++ b/src/freenet/captcha/freeimage/font.cpp @@ -0,0 +1,92 @@ +#include "../../../../include/freenet/captcha/freeimage/font.h" + +namespace FreeImage +{ + +Font::Font() +{ + m_fontwidth=0; + m_fontheight=0; +} + +Font::Font(const Bitmap &bmp) +{ + m_fontwidth=0; + m_fontheight=0; + Load(bmp); +} + +Font::~Font() +{ + +} + +const Bitmap &Font::Char(const int num) +{ + if(num>=0 && num<256 && m_chars.size()>num) + { + return m_chars[num]; + } + else + { + return m_blank; + } +} + +const bool Font::Load(const Bitmap &bmp) +{ + m_fontwidth=bmp.Width()/16; + m_fontheight=bmp.Height()/14; + + m_chars.clear(); + m_chars.resize(256); + + int charnum=32; + for(int yy=0; yyxx && found==false; x--) + { + for(int y=yy; ym_fontwidth ? width=m_fontwidth : false; + m_chars[charnum].Create(width,m_fontheight,32); + m_chars[charnum].Blit(bmp,0,0,xx,yy,width,m_fontheight,-1); + m_chars[charnum].SetTransparent(); + RGBQUAD col=m_chars[charnum].GetPixel(m_chars[charnum].Width()-1,0); + for(int y=0; y @@ -71,7 +74,12 @@ void IntroductionPuzzleInserter::CheckForNeededInsert() void IntroductionPuzzleInserter::GenerateCaptcha(std::string &encodeddata, std::string &solution) { +#ifdef ALTERNATE_CAPTCHA + AlternateCaptcha1 captcha; + m_log->trace("IntroductionPuzzleInserter::GenerateCaptcha using alternate captcha generator"); +#else SimpleCaptcha captcha; +#endif std::vector puzzle; std::vector puzzlesolution; diff --git a/src/http/fmshttprequesthandlerfactory.cpp b/src/http/fmshttprequesthandlerfactory.cpp index e91fb51..6adb09f 100644 --- a/src/http/fmshttprequesthandlerfactory.cpp +++ b/src/http/fmshttprequesthandlerfactory.cpp @@ -23,7 +23,7 @@ FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory() { // set template std::string templatestr="Home

Could not open template.htm! Place in program directory and restart!


[CONTENT]"; - FILE *infile=fopen("template.htm","r+b"); + FILE *infile=fopen("template.htm","rb"); if(infile) { fseek(infile,0,SEEK_END); diff --git a/src/http/pages/homepage.cpp b/src/http/pages/homepage.cpp index 417e1af..d251fd5 100644 --- a/src/http/pages/homepage.cpp +++ b/src/http/pages/homepage.cpp @@ -71,7 +71,7 @@ const std::string HomePage::GeneratePage(const std::string &method, const std::m if(showgenericupdate) { - content+="Check for new versions at the FMS Freesite
"; + content+="Check for new versions at the FMS Freesite
"; } content+="Use these pages to administer your FMS installation."; diff --git a/src/http/pages/peerdetailspage.cpp b/src/http/pages/peerdetailspage.cpp index 9e70ca8..4148c57 100644 --- a/src/http/pages/peerdetailspage.cpp +++ b/src/http/pages/peerdetailspage.cpp @@ -20,7 +20,7 @@ const std::string PeerDetailsPage::GeneratePage(const std::string &method, const std::string dateadded=""; std::string addedmethod=""; std::string usk=""; - std::string fcphost=""; + std::string fcphost="127.0.0.1"; std::string hidden=""; int freesiteedition=-1; std::string publishtrustlist=""; diff --git a/src/optionssetup.cpp b/src/optionssetup.cpp index 6cb16b4..ef7d939 100644 --- a/src/optionssetup.cpp +++ b/src/optionssetup.cpp @@ -68,7 +68,7 @@ void SetupDefaultOptions() upd.Reset(); st.Bind(0,"FMSVersionEdition"); - st.Bind(1,"12"); + st.Bind(1,"15"); st.Step(); st.Reset(); upd.Bind(0,"Program"); -- 2.7.4