summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2015-04-19 21:08:54 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2015-04-19 21:08:54 +0200
commitd6e6f65a1cf8723a398689b549dd970121655053 (patch)
treeba06d30c8528222abea291d6ffa2858e056f8824
parentee14ccb3e571dc5feeb1bf5d2ae0e28eea1fa905 (diff)
downloadaCms-d6e6f65a1cf8723a398689b549dd970121655053.tar.gz
aCms-d6e6f65a1cf8723a398689b549dd970121655053.tar.bz2
integrated libcaptcha and working on captcha in login form
-rw-r--r--3rdParty/CMakeLists.txt3
-rw-r--r--3rdParty/captcha/LICENSE22
-rw-r--r--3rdParty/captcha/Makefile209
-rw-r--r--3rdParty/captcha/captcha.c193
-rw-r--r--3rdParty/captcha/font.h58
-rw-r--r--3rdParty/captcha/logo.gifbin0 -> 17646 bytes
-rw-r--r--3rdParty/captcha/test.c18
-rw-r--r--3rdParty/captcha/unfont.c58
-rw-r--r--CMakeLists.txt2
-rw-r--r--LINKS5
-rw-r--r--src/master.hpp2
-rw-r--r--src/user.cpp10
-rw-r--r--src/user.hpp3
-rw-r--r--src/user_content.hpp2
-rw-r--r--templates/login.tmpl1
-rw-r--r--templates/master.tmpl1
16 files changed, 586 insertions, 1 deletions
diff --git a/3rdParty/CMakeLists.txt b/3rdParty/CMakeLists.txt
new file mode 100644
index 0000000..55b2953
--- /dev/null
+++ b/3rdParty/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+
+add_subdirectory(captcha)
diff --git a/3rdParty/captcha/LICENSE b/3rdParty/captcha/LICENSE
new file mode 100644
index 0000000..c5995d5
--- /dev/null
+++ b/3rdParty/captcha/LICENSE
@@ -0,0 +1,22 @@
+ http://brokestream.com/captcha.html
+
+ Copyright (C) 2009 Ivan Tikhonov
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Ivan Tikhonov, kefeer@brokestream.com
+
diff --git a/3rdParty/captcha/Makefile b/3rdParty/captcha/Makefile
new file mode 100644
index 0000000..17b9314
--- /dev/null
+++ b/3rdParty/captcha/Makefile
@@ -0,0 +1,209 @@
+# CMAKE generated file: DO NOT EDIT!
+# Generated by "Unix Makefiles" Generator, CMake Version 3.2
+
+# Default target executed when no arguments are given to make.
+default_target: all
+.PHONY : default_target
+
+# Allow only one "make -f Makefile2" at a time, but pass parallelism.
+.NOTPARALLEL:
+
+#=============================================================================
+# Special targets provided by cmake.
+
+# Disable implicit rules so canonical targets will work.
+.SUFFIXES:
+
+# Remove some rules from gmake that .SUFFIXES does not remove.
+SUFFIXES =
+
+.SUFFIXES: .hpux_make_needs_suffix_list
+
+# Suppress display of executed commands.
+$(VERBOSE).SILENT:
+
+# A target that is always out of date.
+cmake_force:
+.PHONY : cmake_force
+
+#=============================================================================
+# Set environment variables for the build.
+
+# The shell in which to execute make rules.
+SHELL = /bin/sh
+
+# The CMake executable.
+CMAKE_COMMAND = /usr/bin/cmake
+
+# The command to remove a file.
+RM = /usr/bin/cmake -E remove -f
+
+# Escaping for special characters.
+EQUALS = =
+
+# The top-level source directory on which CMake was run.
+CMAKE_SOURCE_DIR = /home/abaumann/strusCms
+
+# The top-level build directory on which CMake was run.
+CMAKE_BINARY_DIR = /home/abaumann/strusCms
+
+#=============================================================================
+# Targets provided globally by CMake.
+
+# Special rule for the target edit_cache
+edit_cache:
+ @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
+ /usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
+.PHONY : edit_cache
+
+# Special rule for the target edit_cache
+edit_cache/fast: edit_cache
+.PHONY : edit_cache/fast
+
+# Special rule for the target rebuild_cache
+rebuild_cache:
+ @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
+ /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
+.PHONY : rebuild_cache
+
+# Special rule for the target rebuild_cache
+rebuild_cache/fast: rebuild_cache
+.PHONY : rebuild_cache/fast
+
+# The main all target
+all: cmake_check_build_system
+ cd /home/abaumann/strusCms && $(CMAKE_COMMAND) -E cmake_progress_start /home/abaumann/strusCms/CMakeFiles /home/abaumann/strusCms/3rdParty/captcha/CMakeFiles/progress.marks
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/all
+ $(CMAKE_COMMAND) -E cmake_progress_start /home/abaumann/strusCms/CMakeFiles 0
+.PHONY : all
+
+# The main clean target
+clean:
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/clean
+.PHONY : clean
+
+# The main clean target
+clean/fast: clean
+.PHONY : clean/fast
+
+# Prepare targets for installation.
+preinstall: all
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/preinstall
+.PHONY : preinstall
+
+# Prepare targets for installation.
+preinstall/fast:
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/preinstall
+.PHONY : preinstall/fast
+
+# clear depends
+depend:
+ cd /home/abaumann/strusCms && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
+.PHONY : depend
+
+# Convenience name for target.
+3rdParty/captcha/CMakeFiles/captcha.dir/rule:
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/CMakeFiles/captcha.dir/rule
+.PHONY : 3rdParty/captcha/CMakeFiles/captcha.dir/rule
+
+# Convenience name for target.
+captcha: 3rdParty/captcha/CMakeFiles/captcha.dir/rule
+.PHONY : captcha
+
+# fast build rule for target.
+captcha/fast:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/captcha.dir/build.make 3rdParty/captcha/CMakeFiles/captcha.dir/build
+.PHONY : captcha/fast
+
+# Convenience name for target.
+3rdParty/captcha/CMakeFiles/unfont.dir/rule:
+ cd /home/abaumann/strusCms && $(MAKE) -f CMakeFiles/Makefile2 3rdParty/captcha/CMakeFiles/unfont.dir/rule
+.PHONY : 3rdParty/captcha/CMakeFiles/unfont.dir/rule
+
+# Convenience name for target.
+unfont: 3rdParty/captcha/CMakeFiles/unfont.dir/rule
+.PHONY : unfont
+
+# fast build rule for target.
+unfont/fast:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/unfont.dir/build.make 3rdParty/captcha/CMakeFiles/unfont.dir/build
+.PHONY : unfont/fast
+
+captcha.o: captcha.c.o
+.PHONY : captcha.o
+
+# target to build an object file
+captcha.c.o:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/captcha.dir/build.make 3rdParty/captcha/CMakeFiles/captcha.dir/captcha.c.o
+.PHONY : captcha.c.o
+
+captcha.i: captcha.c.i
+.PHONY : captcha.i
+
+# target to preprocess a source file
+captcha.c.i:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/captcha.dir/build.make 3rdParty/captcha/CMakeFiles/captcha.dir/captcha.c.i
+.PHONY : captcha.c.i
+
+captcha.s: captcha.c.s
+.PHONY : captcha.s
+
+# target to generate assembly for a file
+captcha.c.s:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/captcha.dir/build.make 3rdParty/captcha/CMakeFiles/captcha.dir/captcha.c.s
+.PHONY : captcha.c.s
+
+unfont.o: unfont.c.o
+.PHONY : unfont.o
+
+# target to build an object file
+unfont.c.o:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/unfont.dir/build.make 3rdParty/captcha/CMakeFiles/unfont.dir/unfont.c.o
+.PHONY : unfont.c.o
+
+unfont.i: unfont.c.i
+.PHONY : unfont.i
+
+# target to preprocess a source file
+unfont.c.i:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/unfont.dir/build.make 3rdParty/captcha/CMakeFiles/unfont.dir/unfont.c.i
+.PHONY : unfont.c.i
+
+unfont.s: unfont.c.s
+.PHONY : unfont.s
+
+# target to generate assembly for a file
+unfont.c.s:
+ cd /home/abaumann/strusCms && $(MAKE) -f 3rdParty/captcha/CMakeFiles/unfont.dir/build.make 3rdParty/captcha/CMakeFiles/unfont.dir/unfont.c.s
+.PHONY : unfont.c.s
+
+# Help Target
+help:
+ @echo "The following are some of the valid targets for this Makefile:"
+ @echo "... all (the default if no target is provided)"
+ @echo "... clean"
+ @echo "... depend"
+ @echo "... edit_cache"
+ @echo "... rebuild_cache"
+ @echo "... captcha"
+ @echo "... unfont"
+ @echo "... captcha.o"
+ @echo "... captcha.i"
+ @echo "... captcha.s"
+ @echo "... unfont.o"
+ @echo "... unfont.i"
+ @echo "... unfont.s"
+.PHONY : help
+
+
+
+#=============================================================================
+# Special targets to cleanup operation of make.
+
+# Special rule to run CMake to check the build system integrity.
+# No rule that depends on this can have commands that come from listfiles
+# because they might be regenerated.
+cmake_check_build_system:
+ cd /home/abaumann/strusCms && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
+.PHONY : cmake_check_build_system
+
diff --git a/3rdParty/captcha/captcha.c b/3rdParty/captcha/captcha.c
new file mode 100644
index 0000000..7881b90
--- /dev/null
+++ b/3rdParty/captcha/captcha.c
@@ -0,0 +1,193 @@
+
+const int gifsize;
+void captcha(unsigned char im[70*200], unsigned char l[6]);
+void makegif(unsigned char im[70*200], unsigned char gif[gifsize]);
+
+#include <unistd.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <string.h>
+
+static int8_t *lt[];
+const int gifsize=17646;
+
+void makegif(unsigned char im[70*200], unsigned char gif[gifsize]) {
+ // tag ; widthxheight ; GCT:0:0:7 ; bgcolor + aspect // GCT
+ // Image Separator // left x top // widthxheight // Flags
+ // LZW code size
+ memcpy(gif,"GIF89a" "\xc8\0\x46\0" "\x83" "\0\0"
+ "\x00\x00\x00"
+ "\x10\x10\x10"
+ "\x20\x20\x20"
+ "\x30\x30\x30"
+ "\x40\x40\x40"
+ "\x50\x50\x50"
+ "\x60\x60\x60"
+ "\x70\x70\x70"
+ "\x80\x80\x80"
+ "\x90\x90\x90"
+ "\xa0\xa0\xa0"
+ "\xb0\xb0\xb0"
+ "\xc0\xc0\xc0"
+ "\xd0\xd0\xd0"
+ "\xe0\xe0\xe0"
+ "\xff\xff\xff"
+ "," "\0\0\0\0" "\xc8\0\x46\0" "\0" "\x04",13+48+10+1);
+
+ int x,y;
+ unsigned char *i=im;
+ unsigned char *p=gif+13+48+10+1;
+ for(y=0;y<70;y++) {
+ *p++=250; // Data length 5*50=250
+ for(x=0;x<50;x++)
+ {
+ unsigned char a=i[0]>>4,b=i[1]>>4,c=i[2]>>4,d=i[3]>>4;
+
+ p[0]=16|(a<<5); // bbb10000
+ p[1]=(a>>3)|64|(b<<7); // b10000xb
+ p[2]=b>>1; // 0000xbbb
+ p[3]=1|(c<<1); // 00xbbbb1
+ p[4]=4|(d<<3); // xbbbb100
+ i+=4;
+ p+=5;
+ }
+ }
+
+ // Data length // End of LZW (b10001) // Terminator // GIF End
+ memcpy(gif+gifsize-4,"\x01" "\x11" "\x00" ";",4);
+}
+
+static const int8_t sw[200]={0, 4, 8, 12, 16, 20, 23, 27, 31, 35, 39, 43, 47, 50, 54, 58, 61, 65, 68, 71, 75, 78, 81, 84, 87, 90, 93, 96, 98, 101, 103, 105, 108, 110, 112, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127, 127, 127, 127, 127, 127, 127, 126, 126, 125, 124, 123, 122, 121, 120, 119, 117, 115, 114, 112, 110, 108, 105, 103, 101, 98, 96, 93, 90, 87, 84, 81, 78, 75, 71, 68, 65, 61, 58, 54, 50, 47, 43, 39, 35, 31, 27, 23, 20, 16, 12, 8, 4, 0, -4, -8, -12, -16, -20, -23, -27, -31, -35, -39, -43, -47, -50, -54, -58, -61, -65, -68, -71, -75, -78, -81, -84, -87, -90, -93, -96, -98, -101, -103, -105, -108, -110, -112, -114, -115, -117, -119, -120, -121, -122, -123, -124, -125, -126, -126, -127, -127, -127, -127, -127, -127, -127, -126, -126, -125, -124, -123, -122, -121, -120, -119, -117, -115, -114, -112, -110, -108, -105, -103, -101, -98, -96, -93, -90, -87, -84, -81, -78, -75, -71, -68, -65, -61, -58, -54, -50, -47, -43, -39, -35, -31, -27, -23, -20, -16, -12, -8, -4};
+
+
+#define MAX(x,y) ((x>y)?(x):(y))
+
+static int letter(int n, int pos, unsigned char im[70*200], unsigned char swr[200], uint8_t s1, uint8_t s2) {
+ int8_t *p=lt[n];
+ unsigned char *r=im+200*16+pos;
+ unsigned char *i=r;
+ int sk1=s1+pos;
+ int sk2=s2+pos;
+ int mpos=pos;
+ int row=0;
+ for(;*p!=-101;p++) {
+ if(*p<0) {
+ if(*p==-100) { r+=200; i=r; sk1=s1+pos; row++; continue; }
+ i+=-*p;
+ continue;
+ }
+
+ if(sk1>=200) sk1=sk1%200;
+ int skew=sw[sk1]/16;
+ sk1+=(swr[pos+i-r]&0x1)+1;
+
+ if(sk2>=200) sk2=sk2%200;
+ int skewh=sw[sk2]/70;
+ sk2+=(swr[row]&0x1);
+
+ unsigned char *x=i+skew*200+skewh;
+ mpos=MAX(mpos,pos+i-r);
+
+ if((x-im)<70*200) *x=(*p)<<4;
+ i++;
+ }
+ return mpos;
+}
+
+#define NDOTS 100
+
+uint32_t dr[NDOTS];
+
+static void line(unsigned char im[70*200], unsigned char swr[200], uint8_t s1) {
+ int x;
+ int sk1=s1;
+ for(x=0;x<199;x++) {
+ if(sk1>=200) sk1=sk1%200;
+ int skew=sw[sk1]/16;
+ sk1+=swr[x]&0x3+1;
+ unsigned char *i= im+(200*(45+skew)+x);
+ i[0]=0; i[1]=0; i[200]=0; i[201]=0;
+ }
+}
+
+static void dots(unsigned char im[70*200]) {
+ int n;
+ for(n=0;n<NDOTS;n++) {
+ uint32_t v=dr[n];
+ unsigned char *i=im+v%(200*67);
+
+ i[0]=0xff;
+ i[1]=0xff;
+ i[2]=0xff;
+ i[200]=0xff;
+ i[201]=0xff;
+ i[202]=0xff;
+ }
+}
+static void blur(unsigned char im[70*200]) {
+ unsigned char *i=im;
+ int x,y;
+ for(y=0;y<68;y++) {
+ for(x=0;x<198;x++) {
+ unsigned int c11=*i,c12=i[1],c21=i[200],c22=i[201];
+ *i++=((c11+c12+c21+c22)/4);
+ }
+ }
+}
+
+static void filter(unsigned char im[70*200]) {
+ unsigned char om[70*200];
+ unsigned char *i=im;
+ unsigned char *o=om;
+
+ memset(om,0xff,sizeof(om));
+
+ int x,y;
+ for(y=0;y<70;y++) {
+ for(x=4;x<200-4;x++) {
+ if(i[0]>0xf0 && i[1]<0xf0) { o[0]=0; o[1]=0; }
+ else if(i[0]<0xf0 && i[1]>0xf0) { o[0]=0; o[1]=0; }
+
+ i++;
+ o++;
+ }
+ }
+
+ memmove(im,om,sizeof(om));
+}
+
+static const char *letters="abcdafahijklmnopqrstuvwxyz";
+
+void captcha(unsigned char im[70*200], unsigned char l[6]) {
+ unsigned char swr[200];
+ uint8_t s1,s2;
+
+ int f=open("/dev/urandom",O_RDONLY);
+ read(f,l,5); read(f,swr,200); read(f,dr,sizeof(dr)); read(f,&s1,1); read(f,&s2,1);
+ close(f);
+
+ memset(im,0xff,200*70); s1=s1&0x7f; s2=s2&0x3f; l[0]%=25; l[1]%=25; l[2]%=25; l[3]%=25; l[4]%=25; l[5]=0;
+ int p=30; p=letter(l[0],p,im,swr,s1,s2); p=letter(l[1],p,im,swr,s1,s2); p=letter(l[2],p,im,swr,s1,s2); p=letter(l[3],p,im,swr,s1,s2); letter(l[4],p,im,swr,s1,s2);
+ dots(im); blur(im); filter(im); line(im,swr,s1);
+ l[0]=letters[l[0]]; l[1]=letters[l[1]]; l[2]=letters[l[2]]; l[3]=letters[l[3]]; l[4]=letters[l[4]];
+}
+
+#ifdef CAPTCHA
+
+int main() {
+ char l[6];
+ unsigned char im[70*200];
+ unsigned char gif[gifsize];
+
+ captcha(im,l);
+ makegif(im,gif);
+
+ write(1,gif,gifsize);
+ write(2,l,5);
+
+ return 0;
+}
+
+#endif
+
+#include "f.h"
diff --git a/3rdParty/captcha/font.h b/3rdParty/captcha/font.h
new file mode 100644
index 0000000..bd05d8f
--- /dev/null
+++ b/3rdParty/captcha/font.h
@@ -0,0 +1,58 @@
+int width=1327;
+int height=52;
+
+char colors[9]={0xc,0xd,0x5,0,0x3,0xb,0x1,0x7,0x9};
+
+static char *im[] = {
+" a a a a a a a a a a a a a a a a a a a a a a a a a ",
+" a a a a a a a a a a a a a a a a a a a a a a a a a ",
+" a bcde a a a a a a a a a a a a a a a a a a a a a a a a ",
+" a fgdddh a a a a a a a a a a fhf a a a a a a a a a a a a a a ",
+" a hddddde a a fed a a biegdgcb a a bhgi a cgdef a cdgcb a igb a feddc a a a a a a a a a a a a a a ",
+" a beddddddc a a beddd a a hddddddde a a bhddde a hdddddf a cddddg a bcdddf a cddddc a a a a a a a a a a a a a a ",
+" a gdddddddi a a ieddddd a a eddddddddg a a hdddddc a gdddddc a gdddddb a bcdddddf a fgdddddh a a a a a a a a a a a a a a ",
+" a gdddddddb a a eddddddd a a cddddddddde a a gddddddh a ddddddc a dddddd a bgddddddf a hdddddddh a a a a a a a a a a a a a a ",
+" a bedddddg a a dddddddd a a bddebigddddf a a eddddddh a cdddddf a cdddde a edddddddf a ddddddddi a a a a a a a a a a a a a a ",
+" a cddddc a a igdddddd a a iddb bcdgi a a bhdddddi a hddei a hgdcb a feddddddf a hdddddddi a a a a a a a a a a a a a a ",
+" a ddddi a a bcdddd a a cdd a a cddddi a b a a bdddddf a igddddi a a a a a a a a cdc a a a a a a ",
+" a ddddf a a gddd a a gdg a a fddddi a a a iddddf a fddddf a a a a a a a a bdddh a a a a a a ",
+" a ddddf a a eddd a a gdd a a ddddi a a a ddddf a ddddf a a a a a a a a hdddi a a a a a a ",
+" a ddddi a a gddd a a ddd a a ddddf a a a ddddf a ddddf a a a a a a a a edddb a a a a a a ",
+" a ddddf a a dddd a a dddb a a ddddf a a a ddddf a ddddf a a a a a a a a fdddd a a a a a a ",
+" a ddddf a a bdddd a a dddi a a ddddf a a a ddddf a ddddf a a a a a a a a edddd a a a a a a ",
+" a ddddf a a bdddd a a dddh a a ddddf a a a ddddf a ddddf a a a a fh a hf a a a cddddg a bigdb fcgc a a b a a a ",
+" fhcegdddgehb a ddddebicegddgeci a bhegddgehb a fcegddgcibbdddd a bcggdgeib a dddc a fhegddgehb bhchf a ddddf a fedi a bhedb a ddddf a ddddf a fcd hgdei a bhedb bhgddeh a bhegddgci a feddhfcedddgci a fcgddgcf cde a bcde iegdde a bhgdgeifiib a edddddh a feddddf fcddddg a bigeb bgddddgei a cddgggeech hdddddddddf eddddddgef a a bb bbfffb ffffffffb a ",
+" feddddddddddddi a ddddddddddddddddgb a iddddddddddcb a beddddddddddedddd a cdddddddddi a bhddddi bfb a feddddddddddcbbcddddd a ddddf fcgdgh a iedddi a hddddf a ddddf a ddddf a hdddb fcggdgh fedddddc a cdddd bedddddddh a hdddddddddgh a feddddddddddddddc a beddddddddgfbcddg a fedddd hdddddddc a bgdddddddddc a bgddddddgf a beddddddf hgddddddh a gdddddddddg gddddddddi a cdddddddgh iddddddddgf igddddddgb a bb bicgdgcb a edddddddddde gddddddddg a bgddddddddddddddddh ",
+" hddddddeifieddddb a dddddcb bficddddgb a bedddcbbhdddddgb a bgddddcf bfedddddd a fgddef bhgdddi a edddddddddddddi a idddcb biedddddddddddg a ddddf bedddddde a fgdddddh a hgdddddf a ddddf eddddddddde a ddddf a fgddddf igdddddddi bcddddddddh a hgddddd hddddddddddb a fgddgib bfcdddeb a bcdddddddghfb bedddc a bgddgcf feddddde a idddddd eddddddddg a gdcb bfedddg a edddddddddddddcb a cdddddddf cddddddddf a edddddddddc eddddddddb a bcdddddb bcddddde iddddc a eddddddddgh gdddddddddg a hddddddddddc eddddddddi a gddddddddddddddddde ",
+" idddddde edddh a ddddg bgdddc a bgdddi hdddddg a bgddddh fddddd a idddgb eddg a edddddddddddddi a fdddc cdddddfbiedi a ddddf hdddddddddi a gddddddh a bdddddddf a ddddf cdddddddghb a ddddf a beddddddhbedddgddddddh bhdddddddddddf a gddddddbigdcfb feddddi a fdddeb bgdddb a gddddddde hdddh a bgdde eddddc a dddddddfedddddddddg a idg idddb a gdddddddddddddc a fgddddddf iddddddddf a iedddddcb biddddgf a cdddd fddddi iddi a gddddddddgf hdddddddddc a fcddddddf fddddghb a dddddeifb eddddddgb ",
+" cdddddgb idddg a edddc bddddf a bgdddi cdddddb a eddddi fdddd a iddddb fdddi a fb hddddc bfb a bddddb gddddb a ddddffedcf bigddde a gddddddi a fedddddf a ddddf idddgi a ddddf a edddddddgddcf fdddddddeibb hddddc a bedddddggh eddde a fdddgb bdddc a gdddddddf hdddb a bgdddb hddddc a edddddddddddddddddi a edi fgdi a iddddhb a fgddddf bhedddddf a hdddd hddc a gdddb fddde de a bhddddddb bcddddcib a fddddd iddgb a idddcb cdddddh ",
+" hddddgb bdddd a ddddi hdddc a cddde gddde a iddddh fdddd a bddddi dddg a ddddf a gdddh hddddh a ddddedgf gdddb a fdddddi a iddddf a ddddf bgddh a ddddf a bedddddddhb edddddi cdddg a gddddh bdddg a ddddi cdddf a fcdddddf gdde a edddc fddddh a hddddddhb fhegef a dd bgc a ddddf a iddddf iddddf a ddddi idc a hdddf bddddb idf a bedddde bddcb a hddddb iddb a eddf idddddf ",
+" igdcb ddddb a gdddf bdddd a bddddf bede a gddddb fdddd a cddddb edddf a ddddf a ddddi fdddde a dddddc fdddf a hddddf a gdddf a ddddf cdeb a ddddf a fddddde iddddh fdddd a hdddd gddd a hdddg bdddg a hddddf cdddf a iddddf bddddi a edddde a ddf bf a gdddf a fddddf ddddf a cdddg cdf a bdddh fddddh gg a eddddc hdh a gdddi cdc a gdf bgddddf ",
+" ddddf a edddf edddf a hdddg a fdddde fdddd a ddddd bgdddc a ddddf a ddddf ddddg a ddddf dddh a ddddb a edddf a ddddf cdc a ddddf a eddddh bdddd fdddd a idddd gdddb a gdddc gdddi a iddddf idddc a edddd bddddi a hddddi a bddgb a gdddf a bddddf ddddf a fddddi dg a cddg hdddde cf a eddddf fdi a hddde gdb a b cddddh ",
+" ddddf a gdddf hdddh a cdddc a cddddb fdddd a idddddef bfgddddg a ddddf a ddddf ddddd a ddddb dddh a gddd a cdddf a ddddf cgf a ddddf a hddddf dddd fdddg a fdddd edddb a fddddf cddde a fddddf fddddb a gdddg ddddi a fddddb a bdddgi a ddddf a ddddf ddddf a gddde idh a fdddi gdddddb a cdddg fdh a bddddb fdg a iddddc ",
+" ddddf a ddddf iddde a edddi a eddde fdddd a cddddddddddddddddddd a ddddf a ddddi bddddg a ddddf dddh a gdddb a cdddf a ddddf feg a ddddf a fddddf dddd fddde a fdddd cdddf a hddddb idddd a fddddf bddddf a dddde ddddf a bdddd a ddddddci a ddddf a ddddf ddddf a hddddb edb a ddde idebdddh c a edddgffdh a cdddh hdh a bgdddg ",
+" bcddddf a ddddf fdddg a gdddf a ddddh fdddd a edddddddddddddddddde a ddddf a edddc iddddh a ddddf dddh a gdddb a cdddf a ddddf feddg a ddddf a bddddf bdddd fdddc a fdddd edddf a eddddb fdddd a bddddf ddddf a ddddc ddddf a dddd a cdddddddghb a ddddf a ddddf ddddf a bddddh bde a edddb gdf edde g a bgdddddh a fddde gdf a eddddb ",
+" bicgddddddf a ddddf fdddg a ddddf a ddddf fdddd a gdddgb a ddddf a bgdddb cddddb a ddddb dddi a ddddf a cdddf a ddddfidddddf a ddddf a bddddf fdddd fdddc a fdddd gdddf a gdddd fdddg a bddddf ddddf a ddddi ddddf a ddddb a bddddddddddi a ddddf a ddddf ddddf a edddg hdf a idddi fde hdddb fg a bgddddi a gdddb bde a iddddi ",
+" bhegddddggddddf a ddddf fdddd a ddddf a ddddf fdddd a ddddf a ddddf a fdddeb hddddf a ddddb dddi a ddddf a edddf a ddddddgdddde a ddddf a ddddb idddd fdddc a fdddd ddddf a ddddd fdddg a bddddf ddddf a ddddf ddddf a ddddb a bgdddddddddh a gdddf a ddddf ddddf a iddddi dg a bddde cdi bdddh ce a fddddg a hdddh hdi a bddddc ",
+" bcdddddcib ddddf a ddddf idddd a ddddf a ddddf fdddd a ddddf a ddddf a hdddgib bhdddgf a dddd dddf a ddddf a edddf a dddddi fgdddi a ddddf a ddddb fdddd fddde a fdddd ddddf a dddddb fdddd a ddddf ddddb a ddddf ddddf a ddddb a fcddddddddh a edddf a ddddf ddddf a bdddde hdh a edddb gg dddg gh a dddddh a bddde gg a edddgb ",
+" bgddddh ddddf a ddddf hddde a ddddi a gdddi fdddd a gdddi a ddddf a bdddddddddddcb a dddg dddb a ddddf a gdddf a ddddc edddf a ddddf a ddddb fdddd fdddd a fdddd gdddf a gddddb idddg a ddddf ddddb a gdddf ddddf a ddddf a icddddddb a cdddf a ddddf ddddf a cddddf gdb a idddc bdh cdddi idb a iddddddf a cdddb idh a iddddf ",
+" bgddddb ddddf a ddddf edddh a gdddc a edddh fdddd a edddh a ddddf a bddddddgeci a dddg dddb a ddddf a gdddb a ddddf bgdddb a ddddf a bdddg bdddd fdddd a fdddd edddf a cddddf cddde a ddddb dddd a edddi ddddf a ddddf a bhddddh a edddf a ddddf ddddf a fddddg idc a gdddb hg fdddg ge a idcbedddgb a fdddebgdb a bddddh ",
+" cddddc ddddf a ddddf ddddf a cddddb a hddde fdddd a hdddc a ddddf a bcdf a ddde ddd a ddddf a gdddb a ddddf fdddgb a ddddf a fdddb dddd fdddd a fdddd edddf a iddddi edddh a dddi ddde a hdddc ddddf a ddddf a bedde a edddf a gdddf bddddf a gddddc gdf a hdddgbgc gdddbidi a fde bgdddgb a gddddde a gddde ",
+" dddddf ddddf a ddddf iddde a fddddh a bddddb bdddd a bddddf a ddddf a bgdd a ddde ddd a ddddf a gdddb a ddddf eddde a ddddf a dddf dddd fdddd a fddddb cdddf a gdddc ddddf a ddde dddi a fdddd ddddf a ddddf a ddd a gdddi a gdddf cddddf a hddddddde a bddddddf hdddgdg a fdeb bgdddgb a idddddi a cddddb bede ",
+" dddddb bddddf a ddddi edddf a eddddb a edddc dddd a cdddgb a ddddf a edddghb a ddde ddd a ddddf a gdddb a ddddf fddddh a ddddf a bddde bddddb idddd a fddddb cdddf a iddde bddde a ddddb dddb a gdddh fddddf a ddddf a hc gdd a ddddc a cdddh hdddddf a bdddddddi a edddde bdddddi a idgb fddddgb a gdddg a hddddi idddd ",
+" gdddd idddddi i a dddde fdddc a fdddde i a bddddf dddd a bgdddgb bf a ddddf a dddddddgehifb a ddde bdddb a bddddh a gdddb a ddddf eddddh a ddddf a hddddb fddddf hddddb a fddddi cdddi a edddb hdddf a ddddf cddd a iddddb iddddf a ddddf a gdc gde a ddddg a hddddb bcddddddf a edddddg a iddddc eddddb a iddh iddddgf a cdddh a idddde feddddc ",
+" cddddeb fedddddddibec a bdddddi fgdde a hddddeb ige a hdddgb bddddb a fddddgb bgg a ddddh a cdddddddddddddgecf a dddg bdddf a bddddg a gddd a bddddf bdddddh a ddddh a eddddi cddddc cddddh a hddddc edddh a bgdde bdddh a ddddf hdddh a edddgb cddddf a ddddi a ddde ddi a gddddf a bddddgf bfcddhcddddeb a idddddh a bddddf idddg a cdddb hdddddi a idddb a idddddh bfihgdddddg ",
+" bddddddggdddgfiddddddgb a hddddddhb biedddeb a cddddgi ieddf a cdddgf cddddi a fdddddhb fhddi a bcdddddhb a fhgddddddddddddddgf a idddd fdddc a hdddddi a gddd a beddddh iddddddef a cdddddb a bedddddgf idddddde fgddddgb a bgddddgf fcdddddei a bgddeb bgddc a ddddc iddde a bedddgib bhdddddf a beddddgb a gdddeb cde a eddddgb icge a edddddddddeb ddddddh a dddddb a eddd eddc a beddddb bddddddc a bdde a gddddddddddddddddddi ",
+" fgddddddddc idddddf a bddcbfgdddddddddh a cddddddgggddddf a cddddeib bfgdddddddc a fgdddddgggddddh a cdddddddddddgf a bddddddddddddddddi a hdddddcb beddddh a hdddddddde a gddg a gddddddddge dddddddddde a igdddddddgi a fddddddddde eddddddddc gddddddddi a gdddddddde eddddddddde a bgddghb idddh a dddddefb idddg a igdddddgddddddddf a eddddddddddb a hddddghfbbiedgb a iddddddddddc a fdddddddgi ddddddd a cdddg a fddh bggb a iegddddddgf fgdddddddgeb a ddi a ddddddddddddddddddd ",
+" bhedddehb idgei a if hegddgcib a igdddddddddeb a igddddddddedddddddgb a bcdddddddddgi a hgddddddddgehb a igdeibbfhedddddddddb a cdddddddde gddddddgef a icggddggec a gdde a hgddddddddh eddddddggci a cgdddddddgf a bgdddddddgi gdddddddgc gddddddddh a ddddddddde cgddddddddg a hdddddddddef a ddddchdddggdddgb a fhegddci bddddf a cgddddddddeb a bdddddddddddeb a cddddddddc a bcgdgei egehifb a bgddh a ff a eddddddddde fcegdddggec a dg a hchifbb bbficgdddgf ",
+" a a fhegdgehf a iegddehb fgdgchf a bhedddgci a a hgddi fhedddddc a a a dddc a a a a a bheddddef a ddddf icgddeh a ddddb a a ceihegddgcf a iegddgcf a a fgc a a bbbb a bdh a ",
+" a a a b a a a iddde fgddg a a a dddh a a a a a a ddddf a ddddb a a a a a a a a hdf a ",
+" a a a a a a gdddi ddd a a a dddf a a a a a a ddddf a ddddb a a a a a a a a gd a ",
+" a a a a a a ddddi bddg a a a fdddccddc a a a a a a ddddf a ddddb a a a a a a a a hdgh fde a ",
+" a a a a a a edddg hddc a a a edddddde a a a a a a ddddh a bddddb a a a a a a a a fddddgibfgdi a ",
+" a a a a a a fddddc fdddb a a a dddddddb a a a a a a dddde a iddddf a a a a a a a a eddddddddde a ",
+" a a a a a a fgdddghfb bbficegddeb a a a gdddddf a a a a a a hdddddi a gddddc a a a a a a a a dddddddddgb a ",
+" a a a a a a iedddddddddddddgi a a a beddef a a a a a a cddddddddddc a hcgddddddgei a a a a a a a a hdddddddgb a ",
+" a a a a a a iheggddggehf a a a a a a a a a egdddddddddc a bgddddddddddh a a a a a a a a ieddgeh a ",
+" a a a a a a a a a a a a a a a b a a a a a a a a a a ",
+" a a a a a a a a a a a a a a a a a a a a a a a a a "};
diff --git a/3rdParty/captcha/logo.gif b/3rdParty/captcha/logo.gif
new file mode 100644
index 0000000..fd9c504
--- /dev/null
+++ b/3rdParty/captcha/logo.gif
Binary files differ
diff --git a/3rdParty/captcha/test.c b/3rdParty/captcha/test.c
new file mode 100644
index 0000000..e46308c
--- /dev/null
+++ b/3rdParty/captcha/test.c
@@ -0,0 +1,18 @@
+const int gifsize;
+void captcha(unsigned char im[70*200], unsigned char l[6]);
+void makegif(unsigned char im[70*200], unsigned char gif[gifsize]);
+
+int main() {
+ char l[6];
+ unsigned char im[70*200];
+ unsigned char gif[gifsize];
+
+ captcha(im,l);
+ makegif(im,gif);
+
+ write(1,gif,gifsize);
+ write(2,l,5);
+
+ return 0;
+}
+
diff --git a/3rdParty/captcha/unfont.c b/3rdParty/captcha/unfont.c
new file mode 100644
index 0000000..724f7a8
--- /dev/null
+++ b/3rdParty/captcha/unfont.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include "font.h"
+
+void copy(int s, int e, int idx) {
+ int r,i;
+ for(i=s;i<e;i++) {
+ for(r=0;r<50;r++) {
+ if(im[r][i]!=' ') goto findend;
+ }
+ }
+
+ findend: s=i;
+
+ for(i=e;i>s;i--) {
+ for(r=0;r<50;r++) {
+ if(im[r][i]!=' ') goto go;
+ }
+ }
+
+ go: e=i+1;
+
+ printf("static int8_t lt%u[]={",idx);
+
+ for(r=0;r<50;r++) {
+ int l=0;
+ for(i=s;i<e;i++) {
+ char c=im[r][i];
+ if(c==' ') { l++; }
+ else {
+ if(l) { printf("-%u,",l); l=0; }
+ printf("%u,",colors[c-'a']);
+ }
+ }
+ printf("-100,");
+ }
+ printf("-101};\n");
+
+}
+
+int main() {
+ int i,st=0,idx=0;
+ for(i=0;i<width;i++) {
+ if(im[0][i]=='a') {
+ copy(st+1,i-1,idx);
+ idx++;
+ st=i;
+ }
+ }
+
+ printf("static int8_t *lt[]={");
+ for(i=0;i<idx;i++) {
+ printf("lt%d,",(i==6||i==4)?0:i);
+ }
+ printf("};\n\n");
+ return 0;
+}
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d07a8e..864be72 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,8 @@ find_path(CPPCMS_INC cppcms/application.h)
find_path(BOOSTER_INC booster/shared_ptr.h)
find_path(CPPDB_INC cppdb/frontend.h)
+add_subdirectory(3rdParty)
+
include_directories(${CPPCMS_INC})
include_directories(${BOOSTER_INC})
include_directories(${CPPDB_INC})
diff --git a/LINKS b/LINKS
index e0c13fc..3d68afd 100644
--- a/LINKS
+++ b/LINKS
@@ -7,3 +7,8 @@ other projects using CppCms:
https://github.com/allan-simon/tatoebacpp
11z-zpr-netspy
+
+captcha generator (standalone, sweat, no Imagemagick or fonts needed):
+
+http://brokestream.com/captcha.html
+http://www.cthulhulives.org/toybox/PROPDOCS/PropFonts.html \ No newline at end of file
diff --git a/src/master.hpp b/src/master.hpp
index d29073e..90bd985 100644
--- a/src/master.hpp
+++ b/src/master.hpp
@@ -15,7 +15,7 @@ class master : public cppcms::application {
public:
master( strusCms &cms );
- virtual void ini( content::master &c );
+ void ini( content::master &c );
};
}
diff --git a/src/user.cpp b/src/user.cpp
index 649c40e..8f18706 100644
--- a/src/user.cpp
+++ b/src/user.cpp
@@ -81,6 +81,12 @@ bool user::check_login( std::string user, std::string password )
return true;
}
+void user::ini( content::user &c )
+{
+ master::ini( c );
+ c.captcha = ">> CAPTCHA <<";
+}
+
} // namespace apps
namespace content {
@@ -93,14 +99,18 @@ login_form::login_form( apps::strusCms &cms )
username.error_message( "The login is illegal" );
password.message( "Your password" );
password.error_message( "Your password is illegal" );
+ captcha.message( "Enter the correct captcha" );
+ captcha.error_message( "Captcha didn't match" );
submit.value( "Log in" );
add( username );
add( password );
+ add( captcha );
add( submit );
username.non_empty( );
password.non_empty( );
+ captcha.non_empty( );
}
bool login_form::validate( )
diff --git a/src/user.hpp b/src/user.hpp
index 9f35a0d..f255fbf 100644
--- a/src/user.hpp
+++ b/src/user.hpp
@@ -3,6 +3,8 @@
#include "master.hpp"
+#include "user_content.hpp"
+
namespace apps {
class user : public master {
@@ -13,6 +15,7 @@ class user : public master {
private:
void login( );
void logout( );
+ void ini( content::user &c );
};
}
diff --git a/src/user_content.hpp b/src/user_content.hpp
index 4b260f5..887c61a 100644
--- a/src/user_content.hpp
+++ b/src/user_content.hpp
@@ -11,6 +11,7 @@ struct login_form : public cppcms::form {
apps::strusCms &cms;
cppcms::widgets::text username;
cppcms::widgets::password password;
+ cppcms::widgets::text captcha;
cppcms::widgets::submit submit;
public:
@@ -21,6 +22,7 @@ struct login_form : public cppcms::form {
struct user : public master {
login_form login;
+ std::string captcha;
public:
user( apps::strusCms &cms );
diff --git a/templates/login.tmpl b/templates/login.tmpl
index f89cf93..e965ba1 100644
--- a/templates/login.tmpl
+++ b/templates/login.tmpl
@@ -12,6 +12,7 @@
<table>
<% form as_table login %>
</table>
+ <%= captcha %>
</form>
</div>
<% end template %>
diff --git a/templates/master.tmpl b/templates/master.tmpl
index 6a42731..fb871d0 100644
--- a/templates/master.tmpl
+++ b/templates/master.tmpl
@@ -22,6 +22,7 @@
<ul>
<li><a href="http://project-strus.net">Strus</a><br/>a collection of C++ libraries for building a full-text search engine</li>
<li><a href="http://cppcms.com/wikipp/en/page/main">CppCMS</a><br/>a C++ web programming framework</li>
+ <li><a href="http://brokestream.com/captcha.html"</li>libcaptcha</a><br/>a C standalone Captcha generator</li>
</ul>
</div>