Compare commits
263 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 495499d12f | |||
| 8d9a021eab | |||
| be6e09c5af | |||
| 293e426ed4 | |||
| 60f2337b73 | |||
| ce8152de2f | |||
| 496a1979d2 | |||
| fd698ca7b9 | |||
| b4b368d324 | |||
| 825694c880 | |||
| 32750a7d50 | |||
| 0045c6c72c | |||
| 4809016b78 | |||
| 6e2ba65524 | |||
| 8033ac66c4 | |||
| 9ef3736989 | |||
| 099dd55d0c | |||
| 53b4175d00 | |||
| 8aa6f08e08 | |||
| c5024598cb | |||
| dfcf6b29c0 | |||
| 7f48d1eb2e | |||
| eaa97995d2 | |||
| 14f997b844 | |||
| 26e87b20b1 | |||
| 5cdf6eff36 | |||
| 4ed535a3b7 | |||
| da15323c2f | |||
| bd1f717b4c | |||
| 72013046fc | |||
| 14ae19143f | |||
| d8260d8383 | |||
| 9174555ff8 | |||
| 0c6ddc2218 | |||
| 43b4075b16 | |||
| 8f8e44fee5 | |||
| 260c12894d | |||
| adf273479a | |||
| 54480da405 | |||
| 90261b2005 | |||
| cc71c225a3 | |||
| e739f30088 | |||
| 51d95b49a0 | |||
| b5c155b927 | |||
| 5a5fe1b0cc | |||
| 1c4e010fc1 | |||
| d8d523d983 | |||
| 1c2589a2f2 | |||
| 1ec61ffa11 | |||
| ca0a5c9cbe | |||
| 8dd31e737f | |||
| e98cca7fbc | |||
| 9830b0a50f | |||
| f76a0ca3e9 | |||
| 5a6d1991ac | |||
| 329e2d8001 | |||
| 403cca5aad | |||
| b8ff5d4cfc | |||
| 54e6c07efc | |||
| d11cda3577 | |||
| abafb80caf | |||
| e0dd85ca99 | |||
| 2c38fe180e | |||
| 0d0f12b394 | |||
| 86d6c96aeb | |||
| b605fb0a77 | |||
| ec773e5f29 | |||
| 9d5d088b4a | |||
| 1b858f5782 | |||
| 5b845f1d03 | |||
| db9d381a43 | |||
| 0df088e1e2 | |||
| 67099d5d06 | |||
| 07e8e0c63c | |||
| ecc89d8596 | |||
| c94b0311b6 | |||
| fc33b4f882 | |||
| 1da1eef768 | |||
| baf10a9ba9 | |||
| bcea4f9464 | |||
| 920290e9dc | |||
| 1d83cf42a1 | |||
| 09bfdf9e77 | |||
| e83fd91423 | |||
| 70421b7bd1 | |||
| 71ae70f670 | |||
| b1b3cea64e | |||
| 2712c57f15 | |||
| 0b528c7225 | |||
| b7007da5a9 | |||
| 489310ba1c | |||
| 6c2c12fe5e | |||
| e61f0db57e | |||
| 3e3546a2fd | |||
| d2fa3b7171 | |||
| 0e9f587591 | |||
| 9208b15167 | |||
| a45fb30e0a | |||
| 97c7edafd6 | |||
| 1a51b1adc7 | |||
| 9d2be5c50d | |||
| f381f24402 | |||
| f6db85fcdb | |||
| 9687d5cd66 | |||
| 6e2d00bc5b | |||
| 5aaab89cd8 | |||
| 7407d24586 | |||
| c9931da5ba | |||
| 4311f06ade | |||
| 8b64b5d372 | |||
| 631ca4f8a3 | |||
| 424618de38 | |||
| b2d3ca9543 | |||
| cb33f20a24 | |||
| 973d804db2 | |||
| 84eaa6b7b6 | |||
| f967a428ce | |||
| 543d464cbc | |||
| 43470b2a41 | |||
| fa05e25a9d | |||
| fe2f1605f1 | |||
| 48b5c167bf | |||
| 08a0a36dfd | |||
| d135c31ca0 | |||
| dce68221ad | |||
| 93273bd470 | |||
| 92f7c11999 | |||
| 024ce8e73c | |||
| 7902389ef1 | |||
| 1e9ab2f805 | |||
| 0550212b64 | |||
| c7b6ca67a2 | |||
| 9dae2de2fa | |||
| 968593106e | |||
| 302cb0130d | |||
| 89efaa790f | |||
| 60f0e62c23 | |||
| f113e2ef31 | |||
| 39923d6617 | |||
| 72be443414 | |||
| 392e8060ba | |||
| 8c01b0f6c0 | |||
| b984475e49 | |||
| 4f114ea33c | |||
| 5b8a9c0108 | |||
| ee6500ac65 | |||
| 3b2a1c3f25 | |||
| 4d87359aca | |||
| c37c1ff812 | |||
| 1812a2e9ad | |||
| ccc02f41bf | |||
| eaf10c70b7 | |||
| 06f42dd9cb | |||
| 1d6ff73aad | |||
| 700a6fe643 | |||
| 0a7432b059 | |||
| b369fda1d9 | |||
| c49c35cfbd | |||
| fb4742e165 | |||
| fce45b93a2 | |||
| 18ecd46a01 | |||
| af8fbdae72 | |||
| c84997be30 | |||
| 06551d6084 | |||
| 84145d7cc8 | |||
| 426beae796 | |||
| aadf12c7b3 | |||
| 1b60935d08 | |||
| d68731fd55 | |||
| ba63c8c661 | |||
| 15487b347f | |||
| e7e90c6527 | |||
| ca5421347a | |||
| c8a57f2046 | |||
| 583df13139 | |||
| 5049961e17 | |||
| 18492e5d61 | |||
| d4d9f89d1d | |||
| ecf19034ae | |||
| 00521c490e | |||
| 3071df227a | |||
| 915cabdf97 | |||
| 61ac29b2de | |||
| ab84a5169e | |||
| 3fad25b8c8 | |||
| 8154c403d8 | |||
| bb83aed20d | |||
| 600c9fc907 | |||
| 5d09eb149c | |||
| e854fe3681 | |||
| 36c8822e6c | |||
| 9b29cce1a4 | |||
| 508f06339e | |||
| 0a9cdd2f15 | |||
| 7f77b6e3ec | |||
| 9507b0b1ba | |||
| ad9d6f4301 | |||
| b721fb6860 | |||
| 5f46cd2ea5 | |||
| 35efed9fef | |||
| 08e53919e2 | |||
| 933c8841ff | |||
| 518281e101 | |||
| 515d4bab0d | |||
| 8e72a820dd | |||
| f1f0fa34cb | |||
| 5010ef93e8 | |||
| e6679a3192 | |||
| 7cf8d5d2d3 | |||
| 14198eca41 | |||
| c6473f20dc | |||
| 9c34cb5862 | |||
| 149fd1629f | |||
| c48241f78a | |||
| a1bee81a5b | |||
| 1b053c03ba | |||
| 33057acd62 | |||
| 07511a2eb0 | |||
| 69c634d53f | |||
| 7bc17a9202 | |||
| d94a08b991 | |||
| a8b8c1feec | |||
| a589e5a090 | |||
| 8b1db3304f | |||
| 23aedd68b0 | |||
| f48f08a98b | |||
| 81dd88d25a | |||
| c92081d6e1 | |||
| d6e80f5a23 | |||
| 37cf71234c | |||
| 3b655f39e1 | |||
| eec0ddf466 | |||
| ca4e53bb0f | |||
| d9f2e91806 | |||
| 7bfed62526 | |||
| b63ac98f40 | |||
| 1e7d297c0e | |||
| f3cd3b88b9 | |||
| 9a199cd834 | |||
| c3fac2e83f | |||
| c7f6d2727c | |||
| 9901c63ede | |||
| 76897b8a83 | |||
| 217cf1420b | |||
| 6897192364 | |||
| 031ace3fe5 | |||
| e4683b9a05 | |||
| 93da32cfb3 | |||
| 62a0e52092 | |||
| 262ba10443 | |||
| 50cb88c5ed | |||
| 76e32703ac | |||
| d9f5fbaf04 | |||
| 16bb238518 | |||
| 759135fd7d | |||
| 56075857f2 | |||
| 8d3c7500d8 | |||
| 1e3f5e8695 | |||
| 08f5865c72 | |||
| ff3c141138 | |||
| fe31e0e849 | |||
| 2a26968c6c | |||
| fe8774953a |
137
Makefile
137
Makefile
@@ -1,61 +1,128 @@
|
|||||||
# Makefile for GNU make
|
# Makefile for GNU make
|
||||||
|
|
||||||
|
|
||||||
ifndef CXX
|
ifndef CXX
|
||||||
CXX = g++
|
CXX = g++
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef CXXFLAGS
|
ifndef CXXFLAGS
|
||||||
CXXFLAGS = -fPIC -Wall -pedantic -O2 -I/usr/local/include -I/home/tomek/roboczy/winix -I/home/tomek/roboczy/ezc/src -L/usr/local/lib -DEZC_USE_WINIX_LOGGER
|
CXXFLAGS = -fPIC -Wall -O2 -pthread -I/usr/local/include -I/home/tomek/roboczy/prog/winix -I/home/tomek/roboczy/prog/ezc/src -I/home/tomek/roboczy/prog/tito/src -I/home/tomek/roboczy/prog/pikotools -DEZC_USE_WINIX_LOGGER -DEZC_HAS_SPECIAL_STREAM
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef LDFLAGS
|
||||||
|
LDFLAGS = -L/usr/local/lib
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
export CXX
|
export CXX
|
||||||
export CXXFLAGS
|
export CXXFLAGS
|
||||||
|
export LDFLAGS
|
||||||
|
|
||||||
|
|
||||||
|
all: winix.so plugins winix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
all: winix
|
winix.so: FORCE
|
||||||
|
@cd core ; $(MAKE) -e
|
||||||
|
@cd db ; $(MAKE) -e
|
||||||
|
@cd functions ; $(MAKE) -e
|
||||||
|
@cd notify ; $(MAKE) -e
|
||||||
|
@cd templates ; $(MAKE) -e
|
||||||
|
@cd ../ezc/src ; $(MAKE) -e
|
||||||
|
@cd ../tito/src ; $(MAKE) -e
|
||||||
|
@cd ../pikotools ; $(MAKE) -e
|
||||||
|
$(CXX) -shared -rdynamic -Wl,-whole-archive -o winix.so $(CXXFLAGS) core/*.o db/*.o functions/*.o templates/*.o notify/*.o ../ezc/src/ezc.a ../tito/src/tito.a ../pikotools/utf8/utf8.a ../pikotools/space/space.a ../pikotools/mainparser/mainparser.a ../pikotools/date/date.a $(LDFLAGS) -lfcgi -lpq -lz -lfetch -lpthread -Wl,-no-whole-archive
|
||||||
|
|
||||||
winix: FORCE
|
|
||||||
@cd core ; $(MAKE) -e
|
winix: winix.so FORCE
|
||||||
@cd content ; $(MAKE) -e
|
|
||||||
@cd confparser ; $(MAKE) -e
|
|
||||||
@cd templates ; $(MAKE) -e
|
|
||||||
@cd templatesnotify ; $(MAKE) -e
|
|
||||||
@cd ../ezc/src ; $(MAKE) -e
|
|
||||||
$(CXX) -shared -o winix.so $(CXXFLAGS) core/*.o content/*.o templates/*.o templatesnotify/*.o confparser/*.o ../ezc/src/ezc.a -lfcgi -lpq -lz -lpthread
|
|
||||||
@cd main ; $(MAKE) -e
|
@cd main ; $(MAKE) -e
|
||||||
# use the full path with winix.so
|
# use the full path with winix.so
|
||||||
$(CXX) -o winix $(CXXFLAGS) main/*.o /home/tomek/roboczy/winix/winix.so
|
$(CXX) -o winix $(CXXFLAGS) $(LDFLAGS) main/*.o /home/tomek/roboczy/prog/winix/winix.so
|
||||||
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@cd core ; $(MAKE) -e clean
|
plugins: FORCE
|
||||||
@cd content ; $(MAKE) -e clean
|
@cd plugins/stats ; $(MAKE) -e
|
||||||
@cd confparser ; $(MAKE) -e clean
|
@cd plugins/thread ; $(MAKE) -e
|
||||||
@cd templates ; $(MAKE) -e clean
|
@cd plugins/ticket ; $(MAKE) -e
|
||||||
@cd templatesnotify ; $(MAKE) -e clean
|
@cd plugins/gallery ; $(MAKE) -e
|
||||||
@cd ../ezc/src ; $(MAKE) -e clean
|
@cd plugins/group ; $(MAKE) -e
|
||||||
@cd main ; $(MAKE) -e clean
|
@cd plugins/menu ; $(MAKE) -e
|
||||||
rm -f winix.so
|
@cd plugins/export ; $(MAKE) -e
|
||||||
rm -f winix
|
|
||||||
|
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
|
|
||||||
depend:
|
clean:
|
||||||
@cd core ; $(MAKE) -e depend
|
@cd core ; $(MAKE) -e clean
|
||||||
@cd content ; $(MAKE) -e depend
|
@cd db ; $(MAKE) -e clean
|
||||||
@cd confparser ; $(MAKE) -e depend
|
@cd functions ; $(MAKE) -e clean
|
||||||
@cd templates ; $(MAKE) -e depend
|
@cd templates ; $(MAKE) -e clean
|
||||||
@cd templatesnotify ; $(MAKE) -e depend
|
@cd notify ; $(MAKE) -e clean
|
||||||
@cd ../ezc/src ; $(MAKE) -e depend
|
@cd plugins/stats ; $(MAKE) -e clean
|
||||||
@cd main ; $(MAKE) -e depend
|
@cd plugins/thread ; $(MAKE) -e clean
|
||||||
|
@cd plugins/ticket ; $(MAKE) -e clean
|
||||||
|
@cd plugins/gallery ; $(MAKE) -e clean
|
||||||
|
@cd plugins/group ; $(MAKE) -e clean
|
||||||
|
@cd plugins/menu ; $(MAKE) -e clean
|
||||||
|
@cd plugins/export ; $(MAKE) -e clean
|
||||||
|
@cd ../ezc/src ; $(MAKE) -e clean
|
||||||
|
@cd ../tito/src ; $(MAKE) -e clean
|
||||||
|
@cd ../pikotools ; $(MAKE) -e clean
|
||||||
|
@cd main ; $(MAKE) -e clean
|
||||||
|
rm -f winix.so
|
||||||
|
rm -f winix
|
||||||
|
|
||||||
#install: all
|
|
||||||
# mkdir -p bin
|
|
||||||
# rm -f bin/winix.so
|
|
||||||
# rm -f bin/winix
|
|
||||||
# cp winix.so bin/
|
depend:
|
||||||
# cp winix bin/
|
@cd core ; $(MAKE) -e depend
|
||||||
|
@cd db ; $(MAKE) -e depend
|
||||||
|
@cd functions ; $(MAKE) -e depend
|
||||||
|
@cd templates ; $(MAKE) -e depend
|
||||||
|
@cd notify ; $(MAKE) -e depend
|
||||||
|
@cd plugins/stats ; $(MAKE) -e depend
|
||||||
|
@cd plugins/thread ; $(MAKE) -e depend
|
||||||
|
@cd plugins/ticket ; $(MAKE) -e depend
|
||||||
|
@cd plugins/gallery ; $(MAKE) -e depend
|
||||||
|
@cd plugins/group ; $(MAKE) -e depend
|
||||||
|
@cd plugins/menu ; $(MAKE) -e depend
|
||||||
|
@cd plugins/export ; $(MAKE) -e depend
|
||||||
|
@cd ../ezc/src ; $(MAKE) -e depend
|
||||||
|
@cd ../tito/src ; $(MAKE) -e depend
|
||||||
|
@cd ../pikotools ; $(MAKE) -e depend
|
||||||
|
@cd main ; $(MAKE) -e depend
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
install: all
|
||||||
|
# binaries
|
||||||
|
mkdir -p /usr/local/winix/bin
|
||||||
|
cp winix.so /usr/local/winix/bin
|
||||||
|
# use the full path with winix.so (we have to recompile winix with a new path to winix.so)
|
||||||
|
$(CXX) -o /usr/local/winix/bin/winix $(CXXFLAGS) main/*.o /usr/local/winix/bin/winix.so
|
||||||
|
# etc configs
|
||||||
|
mkdir -p /usr/local/winix/etc
|
||||||
|
cp -rf etc/ /usr/local/winix/etc/
|
||||||
|
find /usr/local/winix/etc/ -type d -name ".svn" | xargs -I foo rm -fr foo
|
||||||
|
# html templates
|
||||||
|
mkdir -p /usr/local/winix/html
|
||||||
|
cp -rf html/ /usr/local/winix/html/
|
||||||
|
find /usr/local/winix/html/ -type d -name ".svn" | xargs -I foo rm -fr foo
|
||||||
|
# txt templates
|
||||||
|
mkdir -p /usr/local/winix/txt
|
||||||
|
cp -rf txt/ /usr/local/winix/txt/
|
||||||
|
find /usr/local/winix/txt/ -type d -name ".svn" | xargs -I foo rm -fr foo
|
||||||
|
# locales
|
||||||
|
mkdir -p /usr/local/winix/locale
|
||||||
|
cp -rf locale/ /usr/local/winix/locale/
|
||||||
|
find /usr/local/winix/locale/ -type d -name ".svn" | xargs -I foo rm -fr foo
|
||||||
|
# plugins
|
||||||
|
mkdir -p /usr/local/winix/plugins
|
||||||
|
find plugins/ -name "*.so" | xargs -I foo cp foo /usr/local/winix/plugins/
|
||||||
|
# removed provileges for others
|
||||||
|
find /usr/local/winix -exec chmod o-r,o-x,o-w "{}" "+"
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
# DO NOT DELETE
|
|
||||||
|
|
||||||
confparser.o: confparser.h
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
o = confparser.o
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "confparser.h"
|
|
||||||
|
|
||||||
|
|
||||||
ConfParser::ConfParser()
|
|
||||||
{
|
|
||||||
separator = '=';
|
|
||||||
commentary = '#';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ConfParser::Status ConfParser::Parse(const char * file_name)
|
|
||||||
{
|
|
||||||
line = 1;
|
|
||||||
table.clear();
|
|
||||||
|
|
||||||
file.clear();
|
|
||||||
file.open( file_name );
|
|
||||||
|
|
||||||
if( !file )
|
|
||||||
return cant_open_file;
|
|
||||||
|
|
||||||
ReadChar();
|
|
||||||
status = ParseFile();
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ConfParser::Status ConfParser::ParseFile()
|
|
||||||
{
|
|
||||||
while( lastc != -1 )
|
|
||||||
{
|
|
||||||
if( ReadVariable() )
|
|
||||||
{
|
|
||||||
if( lastc != separator )
|
|
||||||
return syntax_error;
|
|
||||||
|
|
||||||
ReadChar(); // skipping separator
|
|
||||||
|
|
||||||
if( !ReadValue() )
|
|
||||||
return syntax_error;
|
|
||||||
|
|
||||||
//table.insert( std::make_pair(variable, value) );
|
|
||||||
table[variable] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( lastc == commentary )
|
|
||||||
SkipLine();
|
|
||||||
|
|
||||||
if( lastc != -1 && lastc != '\n' )
|
|
||||||
return syntax_error;
|
|
||||||
|
|
||||||
ReadChar(); // skipping '\n' if was
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::IsVariableChar(int c)
|
|
||||||
{
|
|
||||||
if( (c>='a' && c<='z') ||
|
|
||||||
(c>='A' && c<='Z') ||
|
|
||||||
(c>='0' && c<='9') ||
|
|
||||||
c=='.' || c==',' || c=='_' )
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::IsValueSimpleChar(int c)
|
|
||||||
{
|
|
||||||
//if( c==-1 || c=='\n' || IsWhite(c) || c==commentary )
|
|
||||||
if( c==-1 || c=='\n' || c==commentary )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::ReadVariable()
|
|
||||||
{
|
|
||||||
variable.clear();
|
|
||||||
|
|
||||||
SkipWhite();
|
|
||||||
|
|
||||||
while( IsVariableChar(lastc) )
|
|
||||||
{
|
|
||||||
variable += lastc;
|
|
||||||
ReadChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
SkipWhite();
|
|
||||||
|
|
||||||
return !variable.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::ReadValue()
|
|
||||||
{
|
|
||||||
value.clear();
|
|
||||||
|
|
||||||
SkipWhite();
|
|
||||||
|
|
||||||
|
|
||||||
if( lastc == '"' )
|
|
||||||
// quoted value
|
|
||||||
return ReadValueQuoted();
|
|
||||||
else
|
|
||||||
return ReadValueSimple();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::ReadValueQuoted()
|
|
||||||
{
|
|
||||||
ReadChar(); // skipping the first quote
|
|
||||||
|
|
||||||
while( lastc != '\n' && lastc != '"' && lastc != -1 )
|
|
||||||
{
|
|
||||||
if( lastc == '\\' )
|
|
||||||
ReadChar();
|
|
||||||
|
|
||||||
value += lastc;
|
|
||||||
ReadChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( lastc != '"' )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ReadChar(); // skipping the last quote
|
|
||||||
|
|
||||||
SkipWhite();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::ReadValueSimple()
|
|
||||||
{
|
|
||||||
while( IsValueSimpleChar(lastc) )
|
|
||||||
{
|
|
||||||
value += lastc;
|
|
||||||
ReadChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
Trim(value);
|
|
||||||
SkipWhite();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ConfParser::ReadChar()
|
|
||||||
{
|
|
||||||
lastc = file.get();
|
|
||||||
|
|
||||||
if( lastc == '\n' )
|
|
||||||
++line;
|
|
||||||
|
|
||||||
return lastc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ConfParser::IsWhite(int c)
|
|
||||||
{
|
|
||||||
if( c==' ' || c=='\t' || c==13 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ConfParser::SkipWhite()
|
|
||||||
{
|
|
||||||
while( IsWhite(lastc) )
|
|
||||||
ReadChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ConfParser::SkipLine()
|
|
||||||
{
|
|
||||||
while( lastc != -1 && lastc != '\n' )
|
|
||||||
ReadChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ConfParser::Trim(std::string & s)
|
|
||||||
{
|
|
||||||
std::string::size_type i;
|
|
||||||
|
|
||||||
if( s.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// looking for white characters at the end
|
|
||||||
for(i=s.size()-1 ; i>0 && IsWhite(s[i]) ; --i);
|
|
||||||
|
|
||||||
if( i==0 && IsWhite(s[i]) )
|
|
||||||
{
|
|
||||||
// the whole string has white characters
|
|
||||||
s.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// deleting white characters at the end
|
|
||||||
if( i != s.size() - 1 )
|
|
||||||
s.erase(i+1, std::string::npos);
|
|
||||||
|
|
||||||
// looking for white characters at the beginning
|
|
||||||
for(i=0 ; i<s.size() && IsWhite(s[i]) ; ++i);
|
|
||||||
|
|
||||||
// deleting white characters at the beginning
|
|
||||||
if( i != 0 )
|
|
||||||
s.erase(0, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfileconfparser
|
|
||||||
#define headerfileconfparser
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
|
|
||||||
class ConfParser
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
enum Status { ok, cant_open_file, syntax_error };
|
|
||||||
|
|
||||||
ConfParser();
|
|
||||||
Status Parse(const char * file_name);
|
|
||||||
|
|
||||||
|
|
||||||
// last status
|
|
||||||
Status status;
|
|
||||||
|
|
||||||
// line in which there is a syntax_error
|
|
||||||
int line;
|
|
||||||
|
|
||||||
typedef std::map<std::string, std::string> Table;
|
|
||||||
Table table;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// last read variable, value
|
|
||||||
std::string variable, value;
|
|
||||||
|
|
||||||
// separator between a variable and a value, usually '='
|
|
||||||
int separator;
|
|
||||||
|
|
||||||
// commentary char
|
|
||||||
int commentary;
|
|
||||||
|
|
||||||
// last read char
|
|
||||||
int lastc;
|
|
||||||
|
|
||||||
// current file
|
|
||||||
std::ifstream file;
|
|
||||||
|
|
||||||
|
|
||||||
Status ParseFile();
|
|
||||||
|
|
||||||
bool IsVariableChar(int c);
|
|
||||||
bool IsValueSimpleChar(int c);
|
|
||||||
|
|
||||||
bool ReadVariable();
|
|
||||||
bool ReadValue();
|
|
||||||
bool ReadValueQuoted();
|
|
||||||
bool ReadValueSimple();
|
|
||||||
|
|
||||||
int ReadChar();
|
|
||||||
bool IsWhite(int c);
|
|
||||||
void SkipWhite();
|
|
||||||
void SkipLine();
|
|
||||||
void Trim(std::string & s);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,416 +0,0 @@
|
|||||||
# DO NOT DELETE
|
|
||||||
|
|
||||||
adduser.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
adduser.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
adduser.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
adduser.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
adduser.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
adduser.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
adduser.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
adduser.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
adduser.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
adduser.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
adduser.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
adduser.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
adduser.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
adduser.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
adduser.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
adduser.o: ../core/loadavg.h
|
|
||||||
cat.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
cat.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
cat.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
cat.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
cat.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
cat.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
cat.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
cat.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
cat.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
cat.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
cat.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
cat.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
cat.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
cat.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
cat.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
cat.o: ../core/loadavg.h
|
|
||||||
content.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
content.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
content.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
content.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
content.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
content.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
content.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
content.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
content.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
content.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
content.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
content.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
content.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
content.o: ../core/dirs.h ../core/users.h ../core/groups.h
|
|
||||||
content.o: ../core/functions.h ../core/lastcontainer.h ../core/mounts.h
|
|
||||||
content.o: ../core/mount.h ../core/loadavg.h ../core/misc.h ../core/plugin.h
|
|
||||||
content.o: ../core/request.h ../core/data.h ../core/pluginmsg.h
|
|
||||||
createthread.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
createthread.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
createthread.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
createthread.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
createthread.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
createthread.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
createthread.o: ../core/group.h ../core/thread.h ../core/error.h
|
|
||||||
createthread.o: ../core/log.h ../core/dircontainer.h ../core/ugcontainer.h
|
|
||||||
createthread.o: ../core/ticket.h ../core/request.h ../core/requesttypes.h
|
|
||||||
createthread.o: ../core/session.h ../core/rebus.h ../core/plugindata.h
|
|
||||||
createthread.o: ../core/function.h ../core/compress.h
|
|
||||||
createthread.o: ../core/acceptencodingparser.h ../core/acceptbaseparser.h
|
|
||||||
createthread.o: ../core/htmlfilter.h ../core/postmultiparser.h
|
|
||||||
createthread.o: ../core/error.h ../core/mount.h ../core/data.h ../core/dirs.h
|
|
||||||
createthread.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
createthread.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
createthread.o: ../core/loadavg.h
|
|
||||||
createticket.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
createticket.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
createticket.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
createticket.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
createticket.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
createticket.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
createticket.o: ../core/group.h ../core/thread.h ../core/error.h
|
|
||||||
createticket.o: ../core/log.h ../core/dircontainer.h ../core/ugcontainer.h
|
|
||||||
createticket.o: ../core/ticket.h ../core/request.h ../core/requesttypes.h
|
|
||||||
createticket.o: ../core/session.h ../core/rebus.h ../core/plugindata.h
|
|
||||||
createticket.o: ../core/function.h ../core/compress.h
|
|
||||||
createticket.o: ../core/acceptencodingparser.h ../core/acceptbaseparser.h
|
|
||||||
createticket.o: ../core/htmlfilter.h ../core/postmultiparser.h
|
|
||||||
createticket.o: ../core/error.h ../core/mount.h ../core/data.h ../core/dirs.h
|
|
||||||
createticket.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
createticket.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
createticket.o: ../core/loadavg.h
|
|
||||||
default.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
default.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
default.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
default.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
default.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
default.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
default.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
default.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
default.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
default.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
default.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
default.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
default.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
default.o: ../core/dirs.h ../core/users.h ../core/groups.h
|
|
||||||
default.o: ../core/functions.h ../core/lastcontainer.h ../core/mounts.h
|
|
||||||
default.o: ../core/mount.h ../core/loadavg.h
|
|
||||||
download.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
download.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
download.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
download.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
download.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
download.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
download.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
download.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
download.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
download.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
download.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
download.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
download.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
download.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
download.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
download.o: ../core/loadavg.h
|
|
||||||
editticket.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
editticket.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
editticket.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
editticket.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
editticket.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
editticket.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
editticket.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
editticket.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
editticket.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
editticket.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
editticket.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
editticket.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
editticket.o: ../core/postmultiparser.h ../core/error.h ../core/mount.h
|
|
||||||
editticket.o: ../core/data.h ../core/dirs.h ../core/users.h ../core/groups.h
|
|
||||||
editticket.o: ../core/functions.h ../core/lastcontainer.h ../core/mounts.h
|
|
||||||
editticket.o: ../core/mount.h ../core/loadavg.h
|
|
||||||
emacs.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
emacs.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
emacs.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
emacs.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
emacs.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
emacs.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
emacs.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
emacs.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
emacs.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
emacs.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
emacs.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
emacs.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
emacs.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
emacs.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
emacs.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
emacs.o: ../core/loadavg.h ../core/notify.h
|
|
||||||
emacs.o: ../templatesnotify/templatesnotify.h ../core/mount.h
|
|
||||||
emacs.o: ../templates/misc.h ../core/misc.h
|
|
||||||
last.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
last.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
last.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
last.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
last.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
last.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
last.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
last.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
login.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
login.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
login.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
login.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
login.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
login.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
login.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
login.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
login.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
login.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
login.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
login.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
login.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
login.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
login.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
login.o: ../core/loadavg.h
|
|
||||||
logout.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
logout.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
logout.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
logout.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
logout.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
logout.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
logout.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
logout.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
logout.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
logout.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
logout.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
logout.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
logout.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
logout.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
logout.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
logout.o: ../core/loadavg.h
|
|
||||||
ls.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
ls.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
ls.o: ../templates/localefilter.h ../core/locale.h ../confparser/confparser.h
|
|
||||||
ls.o: ../templates/ckeditorgetparser.h ../core/httpsimpleparser.h
|
|
||||||
ls.o: ../core/log.h ../core/thread.h ../core/ticket.h ../core/db.h
|
|
||||||
ls.o: ../core/item.h ../core/user.h ../core/group.h ../core/thread.h
|
|
||||||
ls.o: ../core/error.h ../core/log.h ../core/dircontainer.h
|
|
||||||
ls.o: ../core/ugcontainer.h ../core/ticket.h ../core/request.h
|
|
||||||
ls.o: ../core/requesttypes.h ../core/session.h ../core/rebus.h
|
|
||||||
ls.o: ../core/plugindata.h ../core/function.h ../core/compress.h
|
|
||||||
ls.o: ../core/acceptencodingparser.h ../core/acceptbaseparser.h
|
|
||||||
ls.o: ../core/htmlfilter.h ../core/postmultiparser.h
|
|
||||||
misc_item.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
misc_item.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
misc_item.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
misc_item.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
misc_item.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
misc_item.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
misc_item.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
misc_item.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
misc_item.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
misc_item.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
misc_item.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
misc_item.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
misc_item.o: ../core/postmultiparser.h ../core/misc.h
|
|
||||||
misc_specialfile.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
misc_specialfile.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
misc_specialfile.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
misc_specialfile.o: ../confparser/confparser.h
|
|
||||||
misc_specialfile.o: ../templates/ckeditorgetparser.h
|
|
||||||
misc_specialfile.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
misc_specialfile.o: ../core/ticket.h ../core/db.h ../core/item.h
|
|
||||||
misc_specialfile.o: ../core/user.h ../core/group.h ../core/thread.h
|
|
||||||
misc_specialfile.o: ../core/error.h ../core/log.h ../core/dircontainer.h
|
|
||||||
misc_specialfile.o: ../core/ugcontainer.h ../core/ticket.h ../core/request.h
|
|
||||||
misc_specialfile.o: ../core/requesttypes.h ../core/session.h ../core/rebus.h
|
|
||||||
misc_specialfile.o: ../core/plugindata.h ../core/function.h
|
|
||||||
misc_specialfile.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
misc_specialfile.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
misc_specialfile.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
misc_specialfile.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
misc_specialfile.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
misc_specialfile.o: ../core/loadavg.h
|
|
||||||
mkdir.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
mkdir.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
mkdir.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
mkdir.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
mkdir.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
mkdir.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
mkdir.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
mkdir.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
mkdir.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
mkdir.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
mkdir.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
mkdir.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
mkdir.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
mkdir.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
mkdir.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
mkdir.o: ../core/loadavg.h ../core/notify.h
|
|
||||||
mkdir.o: ../templatesnotify/templatesnotify.h ../core/mount.h
|
|
||||||
mkdir.o: ../templates/misc.h
|
|
||||||
mv.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
mv.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
mv.o: ../templates/localefilter.h ../core/locale.h ../confparser/confparser.h
|
|
||||||
mv.o: ../templates/ckeditorgetparser.h ../core/httpsimpleparser.h
|
|
||||||
mv.o: ../core/log.h ../core/thread.h ../core/ticket.h ../core/db.h
|
|
||||||
mv.o: ../core/item.h ../core/user.h ../core/group.h ../core/thread.h
|
|
||||||
mv.o: ../core/error.h ../core/log.h ../core/dircontainer.h
|
|
||||||
mv.o: ../core/ugcontainer.h ../core/ticket.h ../core/request.h
|
|
||||||
mv.o: ../core/requesttypes.h ../core/session.h ../core/rebus.h
|
|
||||||
mv.o: ../core/plugindata.h ../core/function.h ../core/compress.h
|
|
||||||
mv.o: ../core/acceptencodingparser.h ../core/acceptbaseparser.h
|
|
||||||
mv.o: ../core/htmlfilter.h ../core/postmultiparser.h ../core/data.h
|
|
||||||
mv.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
mv.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
mv.o: ../core/loadavg.h
|
|
||||||
node.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
node.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
node.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
node.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
node.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
node.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
node.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
node.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
node.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
node.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
node.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
node.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
node.o: ../core/postmultiparser.h
|
|
||||||
priv.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
priv.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
priv.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
priv.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
priv.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
priv.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
priv.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
priv.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
priv.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
priv.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
priv.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
priv.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
priv.o: ../core/postmultiparser.h ../core/error.h ../core/data.h
|
|
||||||
priv.o: ../core/dirs.h ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
priv.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
priv.o: ../core/loadavg.h
|
|
||||||
reload.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
reload.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
reload.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
reload.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
reload.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
reload.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
reload.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
reload.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
reload.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
reload.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
reload.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
reload.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
reload.o: ../core/postmultiparser.h ../core/error.h ../core/notify.h
|
|
||||||
reload.o: ../templatesnotify/templatesnotify.h ../core/mount.h
|
|
||||||
reload.o: ../templates/misc.h
|
|
||||||
rm.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
rm.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
rm.o: ../templates/localefilter.h ../core/locale.h ../confparser/confparser.h
|
|
||||||
rm.o: ../templates/ckeditorgetparser.h ../core/httpsimpleparser.h
|
|
||||||
rm.o: ../core/log.h ../core/thread.h ../core/ticket.h ../core/db.h
|
|
||||||
rm.o: ../core/item.h ../core/user.h ../core/group.h ../core/thread.h
|
|
||||||
rm.o: ../core/error.h ../core/log.h ../core/dircontainer.h
|
|
||||||
rm.o: ../core/ugcontainer.h ../core/ticket.h ../core/request.h
|
|
||||||
rm.o: ../core/requesttypes.h ../core/session.h ../core/rebus.h
|
|
||||||
rm.o: ../core/plugindata.h ../core/function.h ../core/compress.h
|
|
||||||
rm.o: ../core/acceptencodingparser.h ../core/acceptbaseparser.h
|
|
||||||
rm.o: ../core/htmlfilter.h ../core/postmultiparser.h ../core/error.h
|
|
||||||
rm.o: ../core/data.h ../core/dirs.h ../core/users.h ../core/groups.h
|
|
||||||
rm.o: ../core/functions.h ../core/lastcontainer.h ../core/mounts.h
|
|
||||||
rm.o: ../core/mount.h ../core/loadavg.h
|
|
||||||
run.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
run.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
run.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
run.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
run.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
run.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
run.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
run.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
run.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
run.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
run.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
run.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
run.o: ../core/postmultiparser.h ../core/error.h
|
|
||||||
subject.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
subject.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
subject.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
subject.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
subject.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
subject.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
subject.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
subject.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
subject.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
subject.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
subject.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
subject.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
subject.o: ../core/postmultiparser.h
|
|
||||||
thread.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
thread.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
thread.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
thread.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
thread.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
thread.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
thread.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
thread.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
thread.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
thread.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
thread.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
thread.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
thread.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
thread.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
thread.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
thread.o: ../core/loadavg.h ../core/mount.h
|
|
||||||
ticket.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
ticket.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
ticket.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
ticket.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
ticket.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
ticket.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
ticket.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
ticket.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
ticket.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
ticket.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
ticket.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
ticket.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
ticket.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
ticket.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
ticket.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
ticket.o: ../core/loadavg.h ../core/mount.h
|
|
||||||
uname.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
uname.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
uname.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
uname.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
uname.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
uname.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
uname.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
uname.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
upload.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
upload.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
upload.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
upload.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
upload.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
upload.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
upload.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
upload.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
upload.o: ../core/request.h ../core/requesttypes.h ../core/session.h
|
|
||||||
upload.o: ../core/rebus.h ../core/plugindata.h ../core/function.h
|
|
||||||
upload.o: ../core/compress.h ../core/acceptencodingparser.h
|
|
||||||
upload.o: ../core/acceptbaseparser.h ../core/htmlfilter.h
|
|
||||||
upload.o: ../core/postmultiparser.h ../core/data.h ../core/dirs.h
|
|
||||||
upload.o: ../core/users.h ../core/groups.h ../core/functions.h
|
|
||||||
upload.o: ../core/lastcontainer.h ../core/mounts.h ../core/mount.h
|
|
||||||
upload.o: ../core/loadavg.h ../core/misc.h
|
|
||||||
who.o: content.h ../core/item.h ../templates/templates.h
|
|
||||||
who.o: ../templates/patterncacher.h ../templates/misc.h
|
|
||||||
who.o: ../templates/localefilter.h ../core/locale.h
|
|
||||||
who.o: ../confparser/confparser.h ../templates/ckeditorgetparser.h
|
|
||||||
who.o: ../core/httpsimpleparser.h ../core/log.h ../core/thread.h
|
|
||||||
who.o: ../core/ticket.h ../core/db.h ../core/item.h ../core/user.h
|
|
||||||
who.o: ../core/group.h ../core/thread.h ../core/error.h ../core/log.h
|
|
||||||
who.o: ../core/dircontainer.h ../core/ugcontainer.h ../core/ticket.h
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
o = adduser.o cat.o content.o createthread.o createticket.o default.o download.o editticket.o emacs.o last.o login.o logout.o ls.o misc_item.o misc_specialfile.o mkdir.o mv.o node.o priv.o reload.o rm.o run.o subject.o thread.o ticket.o uname.o upload.o who.o
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::CheckAddUserVars(const std::string * login, const std::string * pass, const std::string * conf_pass)
|
|
||||||
{
|
|
||||||
if( !login || !pass || !conf_pass )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( login->empty() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_LOGIN_EMPTY;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *pass != *conf_pass )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PASSWORDS_DIFFERENT;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( pass->size() < 5 )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PASSWORD_TOO_SHORT;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( data.users.IsUser(*login) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_USER_EXISTS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunAddUser()
|
|
||||||
{
|
|
||||||
User user;
|
|
||||||
|
|
||||||
std::string * login = request.PostVar("login");
|
|
||||||
std::string * pass = request.PostVar("password");
|
|
||||||
std::string * conf_pass = request.PostVar("confirmpassword");
|
|
||||||
std::string * email = request.PostVar("email");
|
|
||||||
|
|
||||||
if( !CheckAddUserVars(login, pass, conf_pass) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
user.name = *login;
|
|
||||||
|
|
||||||
if( email )
|
|
||||||
user.email = *email;
|
|
||||||
|
|
||||||
request.status = db.AddUser(user, *pass);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
if( data.users.AddUser(user) )
|
|
||||||
{
|
|
||||||
if( !request.session->puser )
|
|
||||||
LoginUser(user.id, false);
|
|
||||||
|
|
||||||
log << log2 << "Content: added a new user: " << user.name << logend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: I can't add to data.users: " << user.name
|
|
||||||
<< " but the user was added to the db correctly" << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
RedirectTo(request.item);
|
|
||||||
else
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunAddUser()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunCat()
|
|
||||||
{
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: cat function requires an item" << logend;
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( !request.HasReadAccess(request.item) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.send_as_attachment = request.IsParam("attachment");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,633 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/misc.h"
|
|
||||||
#include "../core/plugin.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::Init()
|
|
||||||
{
|
|
||||||
templates.ReadTemplates();
|
|
||||||
templates.CreateFunctions();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::DirsHaveReadExecPerm()
|
|
||||||
{
|
|
||||||
std::vector<Item*>::iterator i;
|
|
||||||
|
|
||||||
for(i = request.dir_table.begin() ; i!=request.dir_table.end() ; ++i)
|
|
||||||
{
|
|
||||||
if( !request.HasReadExecAccess(**i) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::SetDefaultFunctionForFile()
|
|
||||||
{
|
|
||||||
if( request.item.auth != Item::auth_none )
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_DOWNLOAD);
|
|
||||||
else
|
|
||||||
if( request.HasReadExecAccess(request.item) )
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_RUN);
|
|
||||||
else
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_CAT);
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
log << log3 << "Content: default function: " << request.pfunction->item.url << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::SetDefaultFunctionForDir()
|
|
||||||
{
|
|
||||||
long default_item = request.dir_table.back()->default_item;
|
|
||||||
|
|
||||||
if( default_item != -1 )
|
|
||||||
{
|
|
||||||
log << log3 << "Content: Default item: id: " << default_item << logend;
|
|
||||||
RedirectTo(default_item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( data.mounts.pmount->type == Mount::thread )
|
|
||||||
{
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_THREAD);
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
log << log3 << "Content: default function: " << request.pfunction->item.url << logend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( data.mounts.pmount->type == Mount::ticket )
|
|
||||||
{
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_TICKET);
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
log << log3 << "Content: default function: " << request.pfunction->item.url << logend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// cms
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_LS);
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
log << log3 << "Content: default function: " << request.pfunction->item.url << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::SetDefaultFunction()
|
|
||||||
{
|
|
||||||
if( request.is_item )
|
|
||||||
{
|
|
||||||
SetDefaultFunctionForFile();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetDefaultFunctionForDir();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MakeStandardFunction()
|
|
||||||
{
|
|
||||||
if( request.role == Request::authorizer )
|
|
||||||
{
|
|
||||||
// in authorizer mode only cat function is available
|
|
||||||
// (and must be default)
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
log << log1 << "Content: in authorizer mode only 'cat' funtion is available and must "
|
|
||||||
"be default (not in the url)" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.pfunction = data.functions.GetFunction(FUN_CAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !request.pfunction )
|
|
||||||
SetDefaultFunction();
|
|
||||||
|
|
||||||
if( !request.redirect_to.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( !request.pfunction )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_NO_FUNCTION;
|
|
||||||
log << log1 << "Content: no function (neither cat nor ls)" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( request.pfunction->code == FUN_LOGOUT )
|
|
||||||
FunLogout();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CAT )
|
|
||||||
FunCat();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_LS )
|
|
||||||
FunLs();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_EMACS )
|
|
||||||
FunEmacs();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_MKDIR )
|
|
||||||
FunMkdir();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_DEFAULT )
|
|
||||||
FunDefault();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_PRIV )
|
|
||||||
FunPriv();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_RM )
|
|
||||||
FunRm();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_RUN )
|
|
||||||
FunRun();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_NODE )
|
|
||||||
FunNode();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_WHO )
|
|
||||||
FunWho();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_LAST )
|
|
||||||
FunLast();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_THREAD )
|
|
||||||
FunThread();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_RELOAD )
|
|
||||||
FunReload();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CREATETHREAD )
|
|
||||||
FunCreateThread();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_UPLOAD )
|
|
||||||
FunUpload();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CREATETICKET )
|
|
||||||
FunCreateTicket();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_EDITTICKET )
|
|
||||||
FunEditTicket();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_TICKET )
|
|
||||||
FunTicket();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CKEDITOR )
|
|
||||||
FunEmacs();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_LOGIN )
|
|
||||||
FunLogin();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_UPTIME )
|
|
||||||
{ /* do nothing */ }
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_MV )
|
|
||||||
FunMv();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_UNAME )
|
|
||||||
FunUname();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CHMOD )
|
|
||||||
FunPriv();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_CHOWN )
|
|
||||||
FunPriv();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_DOWNLOAD )
|
|
||||||
FunDownload();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_ADDUSER )
|
|
||||||
FunAddUser();
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_SUBJECT )
|
|
||||||
FunSubject();
|
|
||||||
else
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MakePost()
|
|
||||||
{
|
|
||||||
if( request.role == Request::authorizer )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !request.pfunction )
|
|
||||||
SetDefaultFunction();
|
|
||||||
|
|
||||||
if( !request.pfunction )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_NO_FUNCTION;
|
|
||||||
log << log1 << "Content: MakePost: no function" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch( request.pfunction->code )
|
|
||||||
{
|
|
||||||
case FUN_RUN:
|
|
||||||
PostFunRun();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_EMACS:
|
|
||||||
PostFunEmacs();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_MKDIR:
|
|
||||||
PostFunMkdir();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_DEFAULT:
|
|
||||||
PostFunDefault();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_PRIV:
|
|
||||||
case FUN_CHMOD:
|
|
||||||
case FUN_CHOWN:
|
|
||||||
PostFunPriv();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_LOGIN:
|
|
||||||
PostFunLogin();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_CREATETHREAD:
|
|
||||||
PostFunCreateThread();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_UPLOAD:
|
|
||||||
PostFunUpload();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_CREATETICKET:
|
|
||||||
PostFunCreateTicket();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_EDITTICKET:
|
|
||||||
PostFunEditTicket();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_CKEDITOR:
|
|
||||||
PostFunEmacs();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_ADDUSER:
|
|
||||||
PostFunAddUser();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_MV:
|
|
||||||
PostFunMv();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUN_SUBJECT:
|
|
||||||
PostFunSubject();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
log << log1 << "Content: unknown post function" << logend;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MakePage()
|
|
||||||
{
|
|
||||||
bool sent = false;
|
|
||||||
|
|
||||||
if( !request.redirect_to.empty() ||
|
|
||||||
!request.x_sendfile.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
if( request.is_item && request.item.auth == Item::auth_none &&
|
|
||||||
request.item.content_type == Item::ct_raw && request.status == WINIX_ERR_OK && request.pfunction )
|
|
||||||
{
|
|
||||||
if( request.pfunction->code == FUN_CAT )
|
|
||||||
{
|
|
||||||
request.page << request.item.content;
|
|
||||||
sent = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( request.pfunction->code == FUN_RUN )
|
|
||||||
{
|
|
||||||
templates.GenerateRunRaw();
|
|
||||||
sent = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !sent )
|
|
||||||
{
|
|
||||||
templates.Generate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::Make()
|
|
||||||
{
|
|
||||||
if( request.dir_table.empty() )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: there is no a root dir (dir_table is empty)" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// request.status can be changed by function_parser
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
if( DirsHaveReadExecPerm() )
|
|
||||||
{
|
|
||||||
if( request.method == Request::post )
|
|
||||||
MakePost();
|
|
||||||
|
|
||||||
if( request.redirect_to.empty() && request.status == WINIX_ERR_OK )
|
|
||||||
MakeStandardFunction();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( request.session->spam_score > 0 )
|
|
||||||
log << log1 << "Content: spam score: " << request.session->spam_score << logend;
|
|
||||||
|
|
||||||
if( request.IsParam("noredirect") )
|
|
||||||
request.redirect_to.clear();
|
|
||||||
|
|
||||||
if( !request.redirect_to.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.dir_table.empty() )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: there is no a root dir (dir_table is empty -- after calling some standard functions)" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.Call(WINIX_CONTENT_MAKE);
|
|
||||||
MakePage();
|
|
||||||
|
|
||||||
//request.PrintGetTable();
|
|
||||||
//request.PrintEnv();
|
|
||||||
//request.PrintIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad
|
|
||||||
// !! moze zwracac jakas wartosc?
|
|
||||||
void Content::RedirectTo(const Item & item, const char * postfix)
|
|
||||||
{
|
|
||||||
std::string path;
|
|
||||||
|
|
||||||
request.redirect_to = data.base_url;
|
|
||||||
|
|
||||||
|
|
||||||
if( item.type == Item::dir )
|
|
||||||
{
|
|
||||||
// item_id is pointing to a directory
|
|
||||||
data.dirs.MakePath(item.id, path);
|
|
||||||
request.redirect_to += path;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( !data.dirs.MakePath(item.parent_id, path) )
|
|
||||||
log << log1 << "Content: Can't redirect: no dirs for item id: " << item.id << logend;
|
|
||||||
|
|
||||||
request.redirect_to += path;
|
|
||||||
request.redirect_to += item.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( postfix )
|
|
||||||
request.redirect_to += postfix;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RedirectTo(long item_id, const char * postfix)
|
|
||||||
{
|
|
||||||
std::string path;
|
|
||||||
Item * pdir;
|
|
||||||
|
|
||||||
request.redirect_to = data.base_url;
|
|
||||||
pdir = data.dirs.GetDir(item_id);
|
|
||||||
|
|
||||||
|
|
||||||
if( pdir )
|
|
||||||
{
|
|
||||||
// item_id is pointing to a directory
|
|
||||||
data.dirs.MakePath(pdir->id, path);
|
|
||||||
request.redirect_to += path;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// !! zrobic nowy interfejs
|
|
||||||
// !! GetItem pozamieniac na GetFile
|
|
||||||
db.GetItem(request.item_table, item_id);
|
|
||||||
|
|
||||||
if( !request.item_table.empty() )
|
|
||||||
{
|
|
||||||
if( !data.dirs.MakePath(request.item_table[0].parent_id, path) )
|
|
||||||
log << log1 << "Content: Can't redirect: no dirs for item id: " << request.item_table[0].id << ", requested directory id: " << request.item_table[0].parent_id << logend;
|
|
||||||
|
|
||||||
request.redirect_to += path + request.item_table[0].url;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: Can't redirect: no such item: id: " << item_id << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( postfix )
|
|
||||||
request.redirect_to += postfix;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RedirectToLastDir()
|
|
||||||
{
|
|
||||||
RedirectTo( *request.dir_table.back() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadAdditionalInfo()
|
|
||||||
{
|
|
||||||
if( request.dir_table.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( data.mounts.pmount->type == Mount::thread )
|
|
||||||
{
|
|
||||||
if( db.GetThreadByDirId(request.dir_table.back()->id, request.thread) == WINIX_ERR_OK )
|
|
||||||
request.is_thread = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( data.mounts.pmount->type == Mount::ticket )
|
|
||||||
{
|
|
||||||
if( db.GetTicketByDirId(request.dir_table.back()->id, request.ticket) == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
request.is_ticket = true;
|
|
||||||
|
|
||||||
if( !request.is_item && (!request.pfunction || request.pfunction->code == FUN_TICKET) )
|
|
||||||
{
|
|
||||||
db.GetItemById(request.ticket.item_id, request.item);
|
|
||||||
// don't set request.is_item here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PrepareUrl(Item & item)
|
|
||||||
{
|
|
||||||
TrimWhite(item.url);
|
|
||||||
|
|
||||||
if( item.url.empty() )
|
|
||||||
item.url = item.subject; // if the subject is empty then the url will be corrected by CorrectUrlOnlyAllowedChar()
|
|
||||||
|
|
||||||
CorrectUrlOnlyAllowedChar(item.url);
|
|
||||||
|
|
||||||
if( data.functions.GetFunction(item.url) )
|
|
||||||
{
|
|
||||||
// the name provided by an user is the same as a name of a function
|
|
||||||
// we add one underscore character at the beginning
|
|
||||||
|
|
||||||
// names of functions should not begin with an underscore '_'
|
|
||||||
// and we can simply add one '_' at the beginning
|
|
||||||
// and the name will be unique
|
|
||||||
item.url.insert(item.url.begin(), '_');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::CheckRebus()
|
|
||||||
{
|
|
||||||
if( request.session->puser )
|
|
||||||
// logged user don't have to use the rebus
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( request.session->rebus_checked )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
request.session->rebus_checked = true;
|
|
||||||
|
|
||||||
if( !request.session->rebus_item )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: rebus not set" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
std::string * answer = request.PostVar("rebus");
|
|
||||||
|
|
||||||
if( answer && data.rebus.IsAnswerOk(request.session->rebus_item, *answer) )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch(const Error &)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
log << log1 << "Content: rebus has an incorrect answer" << logend;
|
|
||||||
// don't add request.session->spam_score when the rebus has incorrect answer
|
|
||||||
// a user could have made a mistake
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::SetUser(Item & item)
|
|
||||||
{
|
|
||||||
if( request.session->puser )
|
|
||||||
{
|
|
||||||
item.user_id = request.session->puser->id;
|
|
||||||
item.guest_name.clear();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item.user_id = -1;
|
|
||||||
request.PostVar("guestname", item.guest_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::CheckGetPostTimes(time_t difference)
|
|
||||||
{
|
|
||||||
time_t now = std::time(0);
|
|
||||||
|
|
||||||
if( request.session->puser )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.method != Request::post )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( now - request.session->last_time_get >= (time_t)difference )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.AllPostVarEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
request.session->spam_score += 1;
|
|
||||||
log << log1 << "Content: spam +1: POST after GET sent too fast" << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
bool Content::CreateFile(const std::string & path, const std::string & content)
|
|
||||||
{
|
|
||||||
std::ofstream file(path.c_str(), std::ios_base::binary | std::ios_base::out);
|
|
||||||
|
|
||||||
if( !file )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: can't create file: " << path << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
file << content;
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
// !! dodac sprawdzenie prawidlowosci zapisania pliku
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucontentcontent
|
|
||||||
#define headerfilecmslucontentcontent
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <fcgiapp.h>
|
|
||||||
#include <ctime>
|
|
||||||
|
|
||||||
#include "../core/item.h"
|
|
||||||
#include "../templates/templates.h"
|
|
||||||
#include "../core/thread.h"
|
|
||||||
#include "../core/ticket.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Content
|
|
||||||
{
|
|
||||||
Templates templates;
|
|
||||||
|
|
||||||
std::string temp;
|
|
||||||
|
|
||||||
void FunDownload();
|
|
||||||
|
|
||||||
void CheckSpecialFile();
|
|
||||||
|
|
||||||
void PrepareUrl(Item & item);
|
|
||||||
|
|
||||||
|
|
||||||
bool CheckAddUserVars(const std::string * login, const std::string * pass, const std::string * conf_pass);
|
|
||||||
void PostFunAddUser();
|
|
||||||
void FunAddUser();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
mv
|
|
||||||
*/
|
|
||||||
bool MoveIsTheSameFile(const Item & item);
|
|
||||||
void MoveAuth(Item & item);
|
|
||||||
void MoveFile(Item & item, bool redirect = true);
|
|
||||||
void MoveDir(Item & item, bool redirect = true);
|
|
||||||
void MoveAuthPrepareQuery();
|
|
||||||
void MoveAuthContentOfDir(const Item & item);
|
|
||||||
bool MoveParseDir(long & dir_id, std::string & dir, std::string & file);
|
|
||||||
bool MoveCheckAccessFromToDir();
|
|
||||||
bool MoveCheckAccessFrom();
|
|
||||||
bool MoveCheckAccessTo(long dir_id);
|
|
||||||
bool MoveCheckMountPoints(long dir_id);
|
|
||||||
void MoveContentOfDir();
|
|
||||||
void PostFunMv();
|
|
||||||
void FunMv();
|
|
||||||
std::string mv_dir;
|
|
||||||
std::string mv_file;
|
|
||||||
std::string mv_new_path;
|
|
||||||
long mv_dir_id;
|
|
||||||
std::vector<Item> mv_auth;
|
|
||||||
Db::ItemQuery mv_auth_iq;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SetDefaultFunctionForFile();
|
|
||||||
void SetDefaultFunctionForDir();
|
|
||||||
void SetDefaultFunction();
|
|
||||||
bool DirsHaveReadExecPerm();
|
|
||||||
|
|
||||||
void MakeStandardFunction();
|
|
||||||
|
|
||||||
void SetUser(Item & item);
|
|
||||||
bool CheckRebus();
|
|
||||||
|
|
||||||
|
|
||||||
void MakePost();
|
|
||||||
|
|
||||||
void FunCat();
|
|
||||||
void FunLogout();
|
|
||||||
void FunLs();
|
|
||||||
void FunEmacs();
|
|
||||||
|
|
||||||
|
|
||||||
void AddPathToAuth(std::string & path);
|
|
||||||
|
|
||||||
void FunCKEditor();
|
|
||||||
|
|
||||||
|
|
||||||
void FunUname();
|
|
||||||
|
|
||||||
bool SubjectCheckAccess();
|
|
||||||
void EditDirSubject();
|
|
||||||
void EditFileSubject();
|
|
||||||
void PostFunSubject();
|
|
||||||
void FunSubject();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
rm
|
|
||||||
*/
|
|
||||||
bool RemoveCheckAccess();
|
|
||||||
void RemoveAllDirs();
|
|
||||||
void RemoveAllDirs(long dir_id);
|
|
||||||
void RemoveDir();
|
|
||||||
void RemoveAuthPrepareQuery();
|
|
||||||
void RemoveAuth(Item & item);
|
|
||||||
void RemoveFile();
|
|
||||||
void FunRm();
|
|
||||||
Db::ItemQuery rm_auth_iq;
|
|
||||||
|
|
||||||
|
|
||||||
void FunNode();
|
|
||||||
void FunMkdir();
|
|
||||||
void FunDefault();
|
|
||||||
void FunRun();
|
|
||||||
void PostFunRun();
|
|
||||||
void FunWho();
|
|
||||||
void FunLast();
|
|
||||||
|
|
||||||
void FunReloadTemplates();
|
|
||||||
void FunReload();
|
|
||||||
|
|
||||||
static bool FunThreadSort(const Thread & t1, const Thread & t2);
|
|
||||||
void FunThread();
|
|
||||||
void FunCreateThread();
|
|
||||||
|
|
||||||
bool FunUploadCheckAccess();
|
|
||||||
void FunUpload();
|
|
||||||
|
|
||||||
bool ReadItemUrlSubject(Item & item, Item::Type item_type);
|
|
||||||
bool ReadItem(Item & item, Item::Type item_type);
|
|
||||||
|
|
||||||
void CheckAccessToItems();
|
|
||||||
|
|
||||||
void LoginUser(long user_id, bool remember_me);
|
|
||||||
void FunLogin();
|
|
||||||
void PostFunLogin();
|
|
||||||
|
|
||||||
|
|
||||||
void ReadItemContentWithType(Item & item);
|
|
||||||
bool FunEmacsCheckAccess();
|
|
||||||
void PostFunEmacsAdd();
|
|
||||||
void PostFunEmacsEdit(bool with_url);
|
|
||||||
bool PostEmacsCheckAbuse(bool adding);
|
|
||||||
void PostFunEmacsModifyMountPoint(bool adding);
|
|
||||||
void PostFunEmacs();
|
|
||||||
|
|
||||||
bool FunMkdirCheckAccess();
|
|
||||||
void PostFunMkdir(bool add_to_dir_table = false, int privileges = 0755 );
|
|
||||||
void Mkdir(Item & item, bool add_to_dir_table);
|
|
||||||
long PostFunDefaultParsePath();
|
|
||||||
void PostFunDefault();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
function: priv, chmod, chown
|
|
||||||
*/
|
|
||||||
bool PrivCheckAccess();
|
|
||||||
void PrivLogStart(const char * what, long user, long group, int priv);
|
|
||||||
void PrivLog(const char * what, long id, const std::string & url);
|
|
||||||
bool ChangeOwner(Item & item, long user_id, long group_id);
|
|
||||||
bool ChangePrivileges(Item & item, int privileges);
|
|
||||||
void ChangePriv(Item & item, long user_id, long group_id, int privileges);
|
|
||||||
void PostFunPriv();
|
|
||||||
void PrivFilesInDir(long parent_id);
|
|
||||||
void PrivDir(long parent_id);
|
|
||||||
|
|
||||||
|
|
||||||
bool ReadPriv(const char * user_in, const char * group_in, const char * priv_in, long & user_id, long & group_id, int & priv);
|
|
||||||
void PrivDir();
|
|
||||||
void PrivOneItem();
|
|
||||||
void FunPriv();
|
|
||||||
|
|
||||||
long user_id_file, group_id_file, user_id_dir, group_id_dir;
|
|
||||||
int priv_file, priv_dir;
|
|
||||||
bool subdirectories;
|
|
||||||
bool change_owner, change_priv;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool FunCreateThreadCheckAccess();
|
|
||||||
bool FunCreateThreadCheckAbuse();
|
|
||||||
void ReadThread(Thread & thread);
|
|
||||||
void AddThread();
|
|
||||||
void PostFunCreateThreadLogAndRedirect();
|
|
||||||
void PostFunCreateThread();
|
|
||||||
|
|
||||||
bool UploadCreatePath();
|
|
||||||
void UploadSaveFile(const std::string & tmp_filename, const std::string & destination);
|
|
||||||
void UploadMulti();
|
|
||||||
void UploadSingle();
|
|
||||||
bool FunUploadCheckAbuse();
|
|
||||||
void PostFunUpload();
|
|
||||||
|
|
||||||
|
|
||||||
bool FunCreateTicketCheckAccess();
|
|
||||||
void FunCreateTicket();
|
|
||||||
bool FunCreateTicketCheckAbuse();
|
|
||||||
void PostFunCreateTicketLogAndRedirect();
|
|
||||||
void PostFunCreateTicket();
|
|
||||||
void FunTicket();
|
|
||||||
void TicketDeleteFirst();
|
|
||||||
|
|
||||||
bool FunEditTicketCheckAccess();
|
|
||||||
void PostFunEditTicketLogAndRedirect();
|
|
||||||
void EditTicketCheckFirstItem();
|
|
||||||
void EditTicketModTicket();
|
|
||||||
void EditTicketModDir();
|
|
||||||
void EditTicketModFirstItem();
|
|
||||||
void PostFunEditTicket();
|
|
||||||
void FunEditTicket();
|
|
||||||
|
|
||||||
void AddTicket();
|
|
||||||
void ReadTicket(Ticket & ticket);
|
|
||||||
void ReadTicketType(Ticket & ticket);
|
|
||||||
void ReadTicketStatus(Ticket & ticket);
|
|
||||||
void ReadTicketPriority(Ticket & ticket);
|
|
||||||
void ReadTicketCategory(Ticket & ticket);
|
|
||||||
void ReadTicketExpected(Ticket & ticket);
|
|
||||||
void ReadTicketProgress(Ticket & ticket);
|
|
||||||
|
|
||||||
void RedirectTo(const Item & item, const char * postfix = 0);
|
|
||||||
void RedirectTo(long item_id, const char * postfix = 0);
|
|
||||||
void RedirectToLastDir();
|
|
||||||
|
|
||||||
void CheckGetPostTimes(time_t difference = 10);
|
|
||||||
// bool CreateFile(const std::string & path, const std::string & content);
|
|
||||||
void MakePage();
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
bool Init();
|
|
||||||
|
|
||||||
void ReadAdditionalInfo();
|
|
||||||
void Make();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/mount.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunCreateThreadCheckAccess()
|
|
||||||
{
|
|
||||||
if( !request.CanCreateThread() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunCreateThreadCheckAbuse()
|
|
||||||
{
|
|
||||||
if( !CheckRebus() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_REBUS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckGetPostTimes();
|
|
||||||
|
|
||||||
if( request.session->spam_score > 0 )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_SPAM;
|
|
||||||
log << log1 << "Content: ignoring due to suspected spamming" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadThread(Thread & thread)
|
|
||||||
{
|
|
||||||
thread.parent_id = request.dir_table.back()->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::AddThread()
|
|
||||||
{
|
|
||||||
request.thread.dir_id = request.dir_table.back()->id;
|
|
||||||
request.thread.closed = false;
|
|
||||||
request.thread.items = 1;
|
|
||||||
request.thread.last_item = request.item; // set by PostFunEmacsAdd()
|
|
||||||
|
|
||||||
request.status = db.AddThread(request.thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunCreateThreadLogAndRedirect()
|
|
||||||
{
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: added a new thread" << logend;
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: problem with adding a new thread, error code: "
|
|
||||||
<< request.status << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunCreateThread()
|
|
||||||
{
|
|
||||||
if( !FunCreateThreadCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
ReadItem(request.item, Item::dir);
|
|
||||||
ReadThread(request.thread);
|
|
||||||
request.item.privileges = 0777; // !! tymczasowo 777 aby wszyscy mogli wysylac posty
|
|
||||||
|
|
||||||
if( !FunCreateThreadCheckAbuse() )
|
|
||||||
{
|
|
||||||
ReadItemContentWithType(request.item); // for correctly displaying the form
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Mkdir(request.item, true);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
ReadItemContentWithType(request.item);
|
|
||||||
request.item.type = Item::file;
|
|
||||||
request.item.privileges = 0644; // !! tymczasowo
|
|
||||||
request.item.parent_id = request.dir_table.back()->id;
|
|
||||||
PostFunEmacsAdd();
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
AddThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
PostFunCreateThreadLogAndRedirect();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunCreateThread()
|
|
||||||
{
|
|
||||||
FunCreateThreadCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,221 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/mount.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunCreateTicketCheckAccess()
|
|
||||||
{
|
|
||||||
if( !request.CanCreateTicket() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunCreateTicketCheckAbuse()
|
|
||||||
{
|
|
||||||
if( !CheckRebus() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_REBUS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckGetPostTimes();
|
|
||||||
|
|
||||||
if( request.session->spam_score > 0 )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_SPAM;
|
|
||||||
log << log1 << "Content: ignoring due to suspected spamming" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketType(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("type", temp);
|
|
||||||
ticket.type = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( ticket.type >= data.mounts.pmount->param[Mount::par_ticket_type].arg.size() )
|
|
||||||
ticket.type = data.mounts.pmount->param[Mount::par_ticket_type].arg.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketStatus(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("status", temp);
|
|
||||||
ticket.status = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( ticket.status >= data.mounts.pmount->param[Mount::par_ticket_status].arg.size() )
|
|
||||||
ticket.status = data.mounts.pmount->param[Mount::par_ticket_status].arg.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketPriority(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("priority", temp);
|
|
||||||
ticket.priority = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( ticket.priority >= data.mounts.pmount->param[Mount::par_ticket_priority].arg.size() )
|
|
||||||
ticket.priority = data.mounts.pmount->param[Mount::par_ticket_priority].arg.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketCategory(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("category", temp);
|
|
||||||
ticket.category = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( ticket.category >= data.mounts.pmount->param[Mount::par_ticket_category].arg.size() )
|
|
||||||
ticket.category = data.mounts.pmount->param[Mount::par_ticket_category].arg.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketExpected(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("expected", temp);
|
|
||||||
ticket.expected = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( ticket.expected >= data.mounts.pmount->param[Mount::par_ticket_expected].arg.size() )
|
|
||||||
ticket.expected = data.mounts.pmount->param[Mount::par_ticket_expected].arg.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicketProgress(Ticket & ticket)
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.PostVar("progress", temp);
|
|
||||||
int p = atoi(temp.c_str());
|
|
||||||
|
|
||||||
if( p < 0 )
|
|
||||||
p = 0;
|
|
||||||
|
|
||||||
if( p > 100 )
|
|
||||||
p = 100;
|
|
||||||
|
|
||||||
ticket.progress = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadTicket(Ticket & ticket)
|
|
||||||
{
|
|
||||||
ticket.parent_id = request.dir_table.back()->id;
|
|
||||||
|
|
||||||
ReadTicketType(ticket);
|
|
||||||
ReadTicketStatus(ticket);
|
|
||||||
ReadTicketPriority(ticket);
|
|
||||||
ReadTicketCategory(ticket);
|
|
||||||
ReadTicketExpected(ticket);
|
|
||||||
ReadTicketProgress(ticket);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::AddTicket()
|
|
||||||
{
|
|
||||||
static std::string temp;
|
|
||||||
|
|
||||||
request.ticket.dir_id = request.dir_table.back()->id; // a new directory created by Mkdir()
|
|
||||||
request.ticket.item_id = request.item.id; // this id is set by PostFunEmacsAdd()
|
|
||||||
|
|
||||||
request.status = db.AddTicket(request.ticket);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunCreateTicketLogAndRedirect()
|
|
||||||
{
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: added a new ticket" << logend;
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: problem with adding a new ticket, error code: "
|
|
||||||
<< request.status << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunCreateTicket()
|
|
||||||
{
|
|
||||||
if( !FunCreateTicketCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
ReadItem(request.item, Item::dir);
|
|
||||||
ReadTicket(request.ticket);
|
|
||||||
request.item.privileges = 0777; // !! tymczasowo 777 aby wszyscy mogli wysylac posty
|
|
||||||
|
|
||||||
if( !FunCreateTicketCheckAbuse() )
|
|
||||||
{
|
|
||||||
ReadItemContentWithType(request.item); // for correctly displaying the form
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Mkdir(request.item, true);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
ReadItemContentWithType(request.item);
|
|
||||||
request.item.type = Item::file;
|
|
||||||
request.item.privileges = 0644; // !! tymczasowo
|
|
||||||
request.item.parent_id = request.dir_table.back()->id;
|
|
||||||
PostFunEmacsAdd();
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
AddTicket();
|
|
||||||
}
|
|
||||||
|
|
||||||
PostFunCreateTicketLogAndRedirect();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunCreateTicket()
|
|
||||||
{
|
|
||||||
FunCreateTicketCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
long Content::PostFunDefaultParsePath()
|
|
||||||
{
|
|
||||||
Item * pdir, * pdir2;
|
|
||||||
long defaultid = -1;
|
|
||||||
|
|
||||||
std::string * path = request.PostVar("defaultitem");
|
|
||||||
|
|
||||||
|
|
||||||
if( path && !path->empty() )
|
|
||||||
{
|
|
||||||
std::string dir, file;
|
|
||||||
Dirs::SplitPath(*path, dir, file);
|
|
||||||
|
|
||||||
pdir = data.dirs.GetDir(dir);
|
|
||||||
|
|
||||||
if( !pdir )
|
|
||||||
throw Error(WINIX_ERR_INCORRECT_DIR);
|
|
||||||
|
|
||||||
if( file.empty() )
|
|
||||||
{
|
|
||||||
defaultid = pdir->id;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// checking whether the file is a directory too (the method SplitPath does not check it)
|
|
||||||
pdir2 = data.dirs.GetDir(file, pdir->id);
|
|
||||||
|
|
||||||
if( !pdir2 )
|
|
||||||
{
|
|
||||||
defaultid = db.GetFileId(pdir->id, file);
|
|
||||||
|
|
||||||
if( defaultid == -1 )
|
|
||||||
throw Error(WINIX_ERR_NO_ITEM);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// file is a directory
|
|
||||||
defaultid = pdir2->id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return defaultid;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunDefault()
|
|
||||||
{
|
|
||||||
if( !request.HasWriteAccess(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
long defaultid = PostFunDefaultParsePath();
|
|
||||||
request.status = db.EditDefaultItem(request.dir_table.back()->id, defaultid);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
request.dir_table.back()->default_item = defaultid;
|
|
||||||
}
|
|
||||||
catch(const Error & e)
|
|
||||||
{
|
|
||||||
request.status = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
RedirectTo(*request.dir_table.back());
|
|
||||||
else
|
|
||||||
log << log1 << "Content: PostFunDefaultItem: Error: " << request.status << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunDefault()
|
|
||||||
{
|
|
||||||
if( !request.HasWriteAccess(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunDownload()
|
|
||||||
{
|
|
||||||
// !! moze wywalic to no_item i wszedzie w takich miejscach dac poprostu permission_denied?
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: download function requires an item" << logend;
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( !request.HasReadAccess(request.item) ||
|
|
||||||
request.item.auth == Item::auth_none ||
|
|
||||||
request.item.auth_path.empty() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.send_as_attachment = request.IsParam("attachment");
|
|
||||||
request.x_sendfile = request.item.auth_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/mount.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunEditTicketCheckAccess()
|
|
||||||
{
|
|
||||||
if( !request.CanEditTicket() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditTicketCheckFirstItem()
|
|
||||||
{
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
if( request.ticket.item_id == -1 )
|
|
||||||
{
|
|
||||||
// creating a new item (the item was deleted by a user)
|
|
||||||
|
|
||||||
Item item;
|
|
||||||
item.parent_id = request.dir_table.back()->id;
|
|
||||||
item.subject = request.dir_table.back()->subject;
|
|
||||||
item.type = Item::file;
|
|
||||||
item.privileges = 0644; // !! tymczasowo
|
|
||||||
SetUser(item);
|
|
||||||
PrepareUrl(item);
|
|
||||||
|
|
||||||
request.status = db.AddItem(item);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: added the first item with content for the ticket, item.id: " << item.id << logend;
|
|
||||||
request.ticket.item_id = item.id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditTicketModTicket()
|
|
||||||
{
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Ticket ticket;
|
|
||||||
ReadTicket(ticket);
|
|
||||||
|
|
||||||
request.ticket.type = ticket.type;
|
|
||||||
request.ticket.status = ticket.status;
|
|
||||||
request.ticket.priority = ticket.priority;
|
|
||||||
request.ticket.category = ticket.category;
|
|
||||||
request.ticket.expected = ticket.expected;
|
|
||||||
request.ticket.progress = ticket.progress;
|
|
||||||
|
|
||||||
request.status = db.EditTicketById(request.ticket);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditTicketModDir()
|
|
||||||
{
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// we don't modify the url
|
|
||||||
|
|
||||||
Item & dir = *request.dir_table.back();
|
|
||||||
bool edit_dir_subject = (dir.subject != request.item.subject);
|
|
||||||
|
|
||||||
if( edit_dir_subject )
|
|
||||||
{
|
|
||||||
dir.subject = request.item.subject;
|
|
||||||
request.status = db.EditItemById(dir, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditTicketModFirstItem()
|
|
||||||
{
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// modyfing the first item (the one with content)
|
|
||||||
ReadItemContentWithType(request.item);
|
|
||||||
|
|
||||||
Item item;
|
|
||||||
db.GetItemById(request.ticket.item_id, item);
|
|
||||||
item.subject = request.item.subject;
|
|
||||||
item.content = request.item.content;
|
|
||||||
item.content_type = request.item.content_type;
|
|
||||||
// the url doesn't matter
|
|
||||||
|
|
||||||
db.EditItemById(item, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEditTicketLogAndRedirect()
|
|
||||||
{
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: edited a ticket" << logend;
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: problem with editing a ticket, error code: "
|
|
||||||
<< request.status << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEditTicket()
|
|
||||||
{
|
|
||||||
if( !FunEditTicketCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
ReadItem(request.item, Item::dir);
|
|
||||||
|
|
||||||
if( !FunCreateTicketCheckAbuse() )
|
|
||||||
{
|
|
||||||
ReadItemContentWithType(request.item); // for correctly displaying the form
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( db.GetTicketByDirId(request.dir_table.back()->id, request.ticket) != WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EditTicketCheckFirstItem();
|
|
||||||
EditTicketModTicket();
|
|
||||||
EditTicketModDir();
|
|
||||||
EditTicketModFirstItem();
|
|
||||||
PostFunEditTicketLogAndRedirect();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunEditTicket()
|
|
||||||
{
|
|
||||||
FunEditTicketCheckAccess();
|
|
||||||
|
|
||||||
db.GetItemById(request.ticket.item_id, request.item);
|
|
||||||
|
|
||||||
// the subject we get from the last directory
|
|
||||||
request.item.subject = request.dir_table.back()->subject;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/notify.h"
|
|
||||||
#include "../core/misc.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunEmacsCheckAccess()
|
|
||||||
{
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
// adding a new item
|
|
||||||
if( !request.CanUseEmacs(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // editing an existing item
|
|
||||||
if( !request.CanUseEmacs(request.item) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEmacsAdd()
|
|
||||||
{
|
|
||||||
request.status = db.AddItem(request.item);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: added a new item" << logend;
|
|
||||||
request.notify_code |= WINIX_NOTIFY_ITEM_ADD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEmacsEdit(bool with_url)
|
|
||||||
{
|
|
||||||
request.item.SetDateModifyToNow();
|
|
||||||
request.status = db.EditItemById(request.item, with_url);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
TemplatesFunctions::pattern_cacher.UpdatePattern(request.item);
|
|
||||||
log << log2 << "Content: modified an item" << logend;
|
|
||||||
|
|
||||||
request.notify_code |= WINIX_NOTIFY_ITEM_EDIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::PostEmacsCheckAbuse(bool adding)
|
|
||||||
{
|
|
||||||
if( !CheckRebus() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_REBUS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// !! is tested in createthread once
|
|
||||||
CheckGetPostTimes();
|
|
||||||
|
|
||||||
if( request.session->spam_score > 0 )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_SPAM;
|
|
||||||
log << log1 << "Content: ignoring due to suspected spamming" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEmacsModifyMountPoint(bool adding)
|
|
||||||
{
|
|
||||||
if( data.mounts.pmount->type == Mount::thread )
|
|
||||||
{
|
|
||||||
if( adding )
|
|
||||||
db.EditThreadAddItem(request.dir_table.back()->id, request.item.id);
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( data.mounts.pmount->type == Mount::ticket )
|
|
||||||
{
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Mount::cms
|
|
||||||
RedirectTo(request.item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunEmacs()
|
|
||||||
{
|
|
||||||
if( !FunEmacsCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
bool adding = !request.is_item;
|
|
||||||
bool edit_with_url = ReadItem(request.item, Item::file);
|
|
||||||
|
|
||||||
if( !PostEmacsCheckAbuse(adding) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
if( adding )
|
|
||||||
{
|
|
||||||
request.is_item = true;
|
|
||||||
request.item.privileges = 0644; // !! tymczasowo, bedzie uzyte umask
|
|
||||||
PostFunEmacsAdd();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PostFunEmacsEdit(edit_with_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
PostFunEmacsModifyMountPoint(adding);
|
|
||||||
CheckSpecialFile();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: PostFunEmacs: Error: "
|
|
||||||
<< request.status << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunEmacs()
|
|
||||||
{
|
|
||||||
FunEmacsCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::LoginUser(long user_id, bool remember_me)
|
|
||||||
{
|
|
||||||
request.session->puser = data.users.GetUser(user_id);
|
|
||||||
request.session->spam_score = 0;
|
|
||||||
|
|
||||||
if( !request.session->puser )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: user id: " << user_id << " is not in data.users" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.session->remember_me = remember_me;
|
|
||||||
|
|
||||||
data.last.UserLogin(user_id, request.session->puser->name, inet_addr(request.env_remote_addr), request.session->id);
|
|
||||||
data.how_many_logged += 1;
|
|
||||||
|
|
||||||
log << log2 << "User " << request.session->puser->name << " (id: " << user_id << ") logged" << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunLogin()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
std::string * login = request.PostVar("login");
|
|
||||||
std::string * pass = request.PostVar("password");
|
|
||||||
std::string * remem = request.PostVar("rememberme");
|
|
||||||
long user_id;
|
|
||||||
|
|
||||||
if( login && pass && db.CheckUser(*login, *pass, user_id) )
|
|
||||||
LoginUser(user_id, remem != 0);
|
|
||||||
|
|
||||||
// !! moze zglosic komunikat o nie poprawnym logowaniu
|
|
||||||
}
|
|
||||||
catch(const Error &)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
RedirectTo(request.item);
|
|
||||||
else
|
|
||||||
RedirectTo(*request.dir_table.back());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunLogin()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunLogout()
|
|
||||||
{
|
|
||||||
if( request.session->puser )
|
|
||||||
{
|
|
||||||
log << log2 << "User: " << request.session->puser->name << ", id: " << request.session->puser->id << " logged out" << logend;
|
|
||||||
|
|
||||||
data.last.UserLogout(request.session->puser->id, request.session->id);
|
|
||||||
|
|
||||||
if( data.how_many_logged > 0 ) // for safety
|
|
||||||
data.how_many_logged -= 1;
|
|
||||||
|
|
||||||
request.session->puser = 0;
|
|
||||||
request.session->remember_me = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string path;
|
|
||||||
data.dirs.MakePath(request.dir_table.back()->id, path);
|
|
||||||
request.redirect_to = data.base_url + path;
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
request.redirect_to += request.item.url;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunLs()
|
|
||||||
{
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
Db::ItemQuery iq;
|
|
||||||
|
|
||||||
iq.sel_content = false;
|
|
||||||
|
|
||||||
iq.WhereParentId(request.dir_table.back()->id);
|
|
||||||
iq.WhereType(Item::file);
|
|
||||||
|
|
||||||
if( request.IsParam("ckeditor_browse") )
|
|
||||||
{
|
|
||||||
iq.WhereAuth(Item::auth_image);
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/misc.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// returning true if the 'url' has to be changed
|
|
||||||
bool Content::ReadItemUrlSubject(Item & item, Item::Type item_type)
|
|
||||||
{
|
|
||||||
bool with_url = false;
|
|
||||||
|
|
||||||
std::string * new_url = request.PostVar("url");
|
|
||||||
std::string * new_subject = request.PostVar("subject");
|
|
||||||
|
|
||||||
if( item_type == Item::file )
|
|
||||||
{
|
|
||||||
if( !request.is_item || (new_url && *new_url != item.url) )
|
|
||||||
with_url = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
with_url = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( new_url )
|
|
||||||
item.url = *new_url;
|
|
||||||
|
|
||||||
if( new_subject )
|
|
||||||
item.subject = *new_subject;
|
|
||||||
|
|
||||||
|
|
||||||
if( item.subject.empty() )
|
|
||||||
{
|
|
||||||
item.subject = request.dir_table.back()->subject;
|
|
||||||
item.subject += "_msg_";
|
|
||||||
item.subject += ToStr(db.Size(request.dir_table.back()->id, Item::file));
|
|
||||||
}
|
|
||||||
|
|
||||||
// if item.url is empty then it will be set from item.subject
|
|
||||||
PrepareUrl(item);
|
|
||||||
|
|
||||||
return with_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ReadItemContentWithType(Item & item)
|
|
||||||
{
|
|
||||||
item.content_type = Item::ct_formatted_text; // default is formatted text
|
|
||||||
request.PostVar("itemcontent", request.item.content);
|
|
||||||
request.PostVar("contenttype", temp);
|
|
||||||
|
|
||||||
// ct_text and ct_formatted_text can use everyone
|
|
||||||
|
|
||||||
if( temp == "0" )
|
|
||||||
item.content_type = Item::ct_text;
|
|
||||||
else
|
|
||||||
if( temp == "1" )
|
|
||||||
item.content_type = Item::ct_formatted_text;
|
|
||||||
|
|
||||||
|
|
||||||
// those below need special privileges
|
|
||||||
|
|
||||||
if( !request.session->puser )
|
|
||||||
return;
|
|
||||||
|
|
||||||
long user_id = request.session->puser->id;
|
|
||||||
|
|
||||||
|
|
||||||
if( temp == "2" )
|
|
||||||
{
|
|
||||||
if( request.CanUseHtml(user_id) )
|
|
||||||
item.content_type = Item::ct_html;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( temp == "3" )
|
|
||||||
{
|
|
||||||
if( request.CanUseBBCode(user_id) )
|
|
||||||
item.content_type = Item::ct_bbcode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( temp == "4" )
|
|
||||||
{
|
|
||||||
if( request.CanUseRaw(user_id) )
|
|
||||||
item.content_type = Item::ct_raw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// item_type - the type of an item you are expecting to read
|
|
||||||
// returns true if the url has to be changed
|
|
||||||
// at the moment this is only checked for Item::file - for Item::dir it returns always true
|
|
||||||
bool Content::ReadItem(Item & item, Item::Type item_type)
|
|
||||||
{
|
|
||||||
if( item_type == Item::none )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
item.type = item_type;
|
|
||||||
item.parent_id = request.dir_table.back()->id;
|
|
||||||
|
|
||||||
bool edit_with_url = ReadItemUrlSubject(item, item_type);
|
|
||||||
|
|
||||||
SetUser(item);
|
|
||||||
|
|
||||||
if( item_type == Item::file )
|
|
||||||
ReadItemContentWithType(item);
|
|
||||||
|
|
||||||
return edit_with_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if we don't have access we only remove the item from the table
|
|
||||||
void Content::CheckAccessToItems()
|
|
||||||
{
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
while( i < request.item_table.size() )
|
|
||||||
{
|
|
||||||
if( !request.HasReadAccess(request.item_table[i]) )
|
|
||||||
{
|
|
||||||
request.item_table.erase(request.item_table.begin() + i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::CheckSpecialFile()
|
|
||||||
{
|
|
||||||
static std::string fstab = "fstab";
|
|
||||||
|
|
||||||
Item * etc = data.dirs.GetEtcDir();
|
|
||||||
|
|
||||||
if( !etc )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.item.parent_id != etc->id )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.item.url == fstab )
|
|
||||||
{
|
|
||||||
log << log3 << "Content: reloading mount points" << logend;
|
|
||||||
|
|
||||||
request.status = data.mounts.ReadMounts(request.item.content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/notify.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunMkdirCheckAccess()
|
|
||||||
{
|
|
||||||
if( request.is_item || !request.CanUseMkdir(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::Mkdir(Item & item, bool add_to_dir_table)
|
|
||||||
{
|
|
||||||
request.status = db.AddItem(item);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
Item * pdir = data.dirs.AddDir(item);
|
|
||||||
|
|
||||||
if( add_to_dir_table )
|
|
||||||
request.dir_table.push_back(pdir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunMkdir(bool add_to_dir_table, int privileges)
|
|
||||||
{
|
|
||||||
if( !FunMkdirCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
ReadItem(request.item, Item::dir);
|
|
||||||
request.item.privileges = privileges;
|
|
||||||
|
|
||||||
Mkdir(request.item, add_to_dir_table);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
request.notify_code |= WINIX_NOTIFY_DIR_ADD;
|
|
||||||
RedirectTo(request.item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log1 << "Content: PostFunMkdir: Error: " << request.status << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunMkdir()
|
|
||||||
{
|
|
||||||
FunMkdirCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
363
content/mv.cpp
363
content/mv.cpp
@@ -1,363 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveCheckAccessFromToDir()
|
|
||||||
{
|
|
||||||
Item * last;
|
|
||||||
Item * last_but_one = 0;
|
|
||||||
|
|
||||||
last = request.dir_table[request.dir_table.size()-1];
|
|
||||||
|
|
||||||
if( request.dir_table.size() >= 2 )
|
|
||||||
last_but_one = request.dir_table[request.dir_table.size()-2];
|
|
||||||
|
|
||||||
if( request.method != Request::post )
|
|
||||||
{
|
|
||||||
// used in GET (HEAD in the future?)
|
|
||||||
|
|
||||||
if( !request.HasWriteAccess(*last) &&
|
|
||||||
(!last_but_one || !request.HasWriteAccess(*last_but_one)) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// used in POST when the moving is performed
|
|
||||||
|
|
||||||
if( request.IsPostVar("onlycontent") )
|
|
||||||
return request.HasWriteAccess(*last);
|
|
||||||
else
|
|
||||||
if( last_but_one )
|
|
||||||
return request.HasWriteAccess(*last_but_one);
|
|
||||||
else
|
|
||||||
return false; // you cannot move the root directory
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveCheckAccessFrom()
|
|
||||||
{
|
|
||||||
if( request.is_item )
|
|
||||||
{
|
|
||||||
// moving a file
|
|
||||||
|
|
||||||
if( !request.HasWriteAccess(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( !MoveCheckAccessFromToDir() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveCheckAccessTo(long dir_id)
|
|
||||||
{
|
|
||||||
Item * pdir = data.dirs.GetDir(dir_id);
|
|
||||||
|
|
||||||
if( !pdir )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_DIR;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !request.HasReadExecAccessToPath(dir_id) || !request.HasWriteAccess(*pdir) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveCheckMountPoints(long dir_id)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Mount * new_mount = data.mounts.CalcMount(dir_id);
|
|
||||||
|
|
||||||
if( !new_mount )
|
|
||||||
{
|
|
||||||
if( data.mounts.pmount->type != Mount::cms )
|
|
||||||
{
|
|
||||||
request.status = WINIX_DIFFERENT_MOUNT_POINTS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( new_mount->type != data.mounts.pmount->type )
|
|
||||||
{
|
|
||||||
request.status = WINIX_DIFFERENT_MOUNT_POINTS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveParseDir(long & dir_id, std::string & dir, std::string & file)
|
|
||||||
{
|
|
||||||
std::string * move_to = request.PostVar("moveto");
|
|
||||||
|
|
||||||
if( !move_to )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int res = data.dirs.AnalyzePath(*move_to, dir_id, dir, file);
|
|
||||||
|
|
||||||
if( res == 1 )
|
|
||||||
request.status = WINIX_ERR_NO_ROOT_DIR;
|
|
||||||
else
|
|
||||||
if( res != 0 )
|
|
||||||
request.status = WINIX_ERR_INCORRECT_DIR;
|
|
||||||
|
|
||||||
return res == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveAuth(Item & item)
|
|
||||||
{
|
|
||||||
if( !request.MakePath(item, mv_new_path, true) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( rename(item.auth_path.c_str(), mv_new_path.c_str()) == 0 )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: moved static file from: " << item.auth_path << ", to: " << mv_new_path << logend;
|
|
||||||
item.auth_path = mv_new_path;
|
|
||||||
request.status = db.EditAuthById(item, item.id);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int err = errno;
|
|
||||||
|
|
||||||
log << log1 << "Content: can't move a file from: " << item.auth_path << ", to: " << mv_new_path << ", ";
|
|
||||||
log.SystemErr(err);
|
|
||||||
log << logend;
|
|
||||||
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::MoveIsTheSameFile(const Item & item)
|
|
||||||
{
|
|
||||||
if( mv_file.empty() )
|
|
||||||
{
|
|
||||||
if( item.parent_id == mv_dir_id )
|
|
||||||
return true; // nothing to do
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( item.parent_id == mv_dir_id && item.url == mv_file )
|
|
||||||
return true; // nothing to do
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveFile(Item & item, bool redirect)
|
|
||||||
{
|
|
||||||
if( MoveIsTheSameFile(item) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( !mv_file.empty() )
|
|
||||||
{
|
|
||||||
item.url = mv_file;
|
|
||||||
PrepareUrl(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
item.parent_id = mv_dir_id;
|
|
||||||
request.status = db.EditParentUrlById(item, item.id);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: the file was moved to: " << mv_dir << item.url << logend;
|
|
||||||
|
|
||||||
if( item.auth != Item::auth_none )
|
|
||||||
MoveAuth(item);
|
|
||||||
|
|
||||||
if( redirect )
|
|
||||||
RedirectTo(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveContentOfDir()
|
|
||||||
{
|
|
||||||
Db::ItemQuery iq;
|
|
||||||
|
|
||||||
iq.sel_parent_id = true;
|
|
||||||
iq.sel_type = true;
|
|
||||||
iq.sel_url = true;
|
|
||||||
iq.sel_auth = true;
|
|
||||||
iq.WhereParentId(request.dir_table.back()->id);
|
|
||||||
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
|
|
||||||
for(size_t i=0 ; i<request.item_table.size() ; ++i)
|
|
||||||
{
|
|
||||||
if( request.item_table[i].type == Item::dir )
|
|
||||||
MoveDir(request.item_table[i], false);
|
|
||||||
else
|
|
||||||
MoveFile(request.item_table[i], false);
|
|
||||||
}
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveAuthPrepareQuery()
|
|
||||||
{
|
|
||||||
mv_auth_iq.SetAll(true, false);
|
|
||||||
|
|
||||||
mv_auth_iq.sel_parent_id = true;
|
|
||||||
mv_auth_iq.sel_type = true;
|
|
||||||
mv_auth_iq.sel_url = true;
|
|
||||||
mv_auth_iq.sel_auth = true;
|
|
||||||
|
|
||||||
mv_auth_iq.WhereType(Item::file);
|
|
||||||
mv_auth_iq.WhereAuth(Item::auth_none, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveAuthContentOfDir(const Item & item)
|
|
||||||
{
|
|
||||||
DirContainer::ParentIterator i = data.dirs.FindFirstParent(item.id);
|
|
||||||
|
|
||||||
// go through all directories
|
|
||||||
for( ; i != data.dirs.ParentEnd() ; i = data.dirs.NextParent(i) )
|
|
||||||
MoveAuthContentOfDir(*(i->second));
|
|
||||||
|
|
||||||
mv_auth_iq.WhereParentId(item.id);
|
|
||||||
|
|
||||||
// don't use request.item here (is used in MoveContentOfDir())
|
|
||||||
db.GetItems(mv_auth, mv_auth_iq);
|
|
||||||
|
|
||||||
for(size_t i=0 ; i<mv_auth.size() ; ++i)
|
|
||||||
MoveAuth(mv_auth[i]);
|
|
||||||
|
|
||||||
mv_auth.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::MoveDir(Item & item, bool redirect)
|
|
||||||
{
|
|
||||||
if( mv_file.empty() && mv_dir_id == item.id )
|
|
||||||
return; // nothing to do
|
|
||||||
|
|
||||||
if( mv_dir_id == item.id || data.dirs.HasParent(mv_dir_id, item.id) )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: cannot move directory to inside it" << logend;
|
|
||||||
request.status = WINIX_ERR_INCORRECT_DIR;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !data.dirs.ChangeParent(item.id, mv_dir_id) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_DIR;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item.parent_id = mv_dir_id;
|
|
||||||
|
|
||||||
if( !mv_file.empty() )
|
|
||||||
{
|
|
||||||
item.url = mv_file;
|
|
||||||
PrepareUrl(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
request.status = db.EditParentUrlById(item, item.id);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: the directory was moved to: " << mv_dir << item.url << logend;
|
|
||||||
MoveAuthContentOfDir(item);
|
|
||||||
|
|
||||||
if( redirect )
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunMv()
|
|
||||||
{
|
|
||||||
if( MoveCheckAccessFrom() &&
|
|
||||||
MoveParseDir(mv_dir_id, mv_dir, mv_file) &&
|
|
||||||
MoveCheckAccessTo(mv_dir_id) &&
|
|
||||||
MoveCheckMountPoints(mv_dir_id) )
|
|
||||||
{
|
|
||||||
if( request.is_item )
|
|
||||||
{
|
|
||||||
MoveFile(request.item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MoveAuthPrepareQuery();
|
|
||||||
|
|
||||||
if( request.IsPostVar("onlycontent") )
|
|
||||||
{
|
|
||||||
if( mv_file.empty() )
|
|
||||||
MoveContentOfDir();
|
|
||||||
else
|
|
||||||
request.status = WINIX_ERR_INCORRECT_DIR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MoveDir(*request.dir_table.back());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunMv()
|
|
||||||
{
|
|
||||||
MoveCheckAccessFrom();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunNode()
|
|
||||||
{
|
|
||||||
if( request.param_table.empty() )
|
|
||||||
{
|
|
||||||
//request.status = Error
|
|
||||||
//!!zglosic 404
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
long id = atol( request.param_table[0]->c_str() );
|
|
||||||
|
|
||||||
RedirectTo(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
311
content/priv.cpp
311
content/priv.cpp
@@ -1,311 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::PrivCheckAccess()
|
|
||||||
{
|
|
||||||
// we do not check permissions here
|
|
||||||
// permissions depends on the user, group, and privileges
|
|
||||||
// but we cannot use parameter 'r' on files
|
|
||||||
// and only logged users can change permissions
|
|
||||||
|
|
||||||
if( !request.session->puser || (request.is_item && request.IsParam("r")) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::ChangeOwner(Item & item, long user_id, long group_id)
|
|
||||||
{
|
|
||||||
if( user_id!=item.user_id || group_id!=item.group_id )
|
|
||||||
{
|
|
||||||
if( !request.CanChangeUser(item, user_id) )
|
|
||||||
{
|
|
||||||
log << log3 << "Content: can't change the user" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !request.CanChangeGroup(item, group_id) )
|
|
||||||
{
|
|
||||||
log << log3 << "Content: can't change the group" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.user_id = user_id;
|
|
||||||
item.group_id = group_id;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::ChangePrivileges(Item & item, int privileges)
|
|
||||||
{
|
|
||||||
if( privileges != item.privileges )
|
|
||||||
{
|
|
||||||
if( !request.CanChangePrivileges(item, privileges) )
|
|
||||||
{
|
|
||||||
log << log3 << "Content: can't change privileges" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.privileges = privileges;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::ChangePriv(Item & item, long user_id, long group_id, int privileges)
|
|
||||||
{
|
|
||||||
if( change_owner )
|
|
||||||
{
|
|
||||||
if( !ChangeOwner(item, user_id, group_id) )
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( change_priv )
|
|
||||||
{
|
|
||||||
if( !ChangePrivileges(item, privileges) )
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.status = db.EditPrivById(item, item.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PrivLogStart(const char * what, long user, long group, int priv)
|
|
||||||
{
|
|
||||||
log << log2 << what;
|
|
||||||
|
|
||||||
if( change_owner )
|
|
||||||
{
|
|
||||||
User * puser = data.users.GetUser(user);
|
|
||||||
Group * pgroup = data.groups.GetGroup(group);
|
|
||||||
|
|
||||||
log << "new user: ";
|
|
||||||
|
|
||||||
if( puser )
|
|
||||||
log << puser->name;
|
|
||||||
else
|
|
||||||
log << "id: " << user;
|
|
||||||
|
|
||||||
log << ", new group: ";
|
|
||||||
|
|
||||||
if( pgroup )
|
|
||||||
log << pgroup->name;
|
|
||||||
else
|
|
||||||
log << "id: " << group;
|
|
||||||
|
|
||||||
if( change_priv )
|
|
||||||
log << ", ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( change_priv )
|
|
||||||
{
|
|
||||||
char buf[30];
|
|
||||||
sprintf(buf, "0%o", priv);
|
|
||||||
log << "privileges: " << buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
log << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PrivLog(const char * what, long id, const std::string & url)
|
|
||||||
{
|
|
||||||
Item * root = 0;
|
|
||||||
|
|
||||||
if( id != -1 )
|
|
||||||
root = data.dirs.GetRootDir();
|
|
||||||
|
|
||||||
log << log3 << "Content: " << what;
|
|
||||||
|
|
||||||
if( root && root->id == id )
|
|
||||||
log << "(root)";
|
|
||||||
else
|
|
||||||
log << url;
|
|
||||||
|
|
||||||
log << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PrivFilesInDir(long parent_id)
|
|
||||||
{
|
|
||||||
Db::ItemQuery iq;
|
|
||||||
|
|
||||||
iq.SetAll(false, false);
|
|
||||||
iq.sel_user_id = iq.sel_group_id = iq.sel_guest_name = iq.sel_privileges = true;
|
|
||||||
|
|
||||||
iq.WhereParentId(parent_id);
|
|
||||||
iq.WhereType(Item::file);
|
|
||||||
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<Item>::iterator i = request.item_table.begin();
|
|
||||||
|
|
||||||
for( ; i != request.item_table.end() ; ++i)
|
|
||||||
{
|
|
||||||
PrivLog("changed file: ", -1, i->url);
|
|
||||||
ChangePriv(*i, user_id_file, group_id_file, priv_file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// recurrence
|
|
||||||
void Content::PrivDir(long parent_id)
|
|
||||||
{
|
|
||||||
PrivFilesInDir(parent_id);
|
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator i = data.dirs.FindFirstParent(parent_id);
|
|
||||||
|
|
||||||
for( ; i != data.dirs.ParentEnd() ; i = data.dirs.NextParent(i) )
|
|
||||||
{
|
|
||||||
PrivLog("changed dir: ", -1, i->second->url);
|
|
||||||
ChangePriv(*(i->second), user_id_dir, group_id_dir, priv_dir);
|
|
||||||
|
|
||||||
if( subdirectories )
|
|
||||||
PrivDir(i->second->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::ReadPriv(const char * user_in, const char * group_in, const char * priv_in,
|
|
||||||
long & user_id, long & group_id, int & priv)
|
|
||||||
{
|
|
||||||
std::string * user_str = request.PostVar(user_in);
|
|
||||||
std::string * group_str = request.PostVar(group_in);
|
|
||||||
std::string * priv_str = request.PostVar(priv_in);
|
|
||||||
|
|
||||||
if( change_owner && (!user_str || !group_str) )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: PostFunPriv: there is no some post variables for changing the owner" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( change_priv && !priv_str )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: PostFunPriv: there is no some post variables for changing privileges" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( change_owner )
|
|
||||||
{
|
|
||||||
user_id = data.users.GetUserId( *user_str );
|
|
||||||
group_id = data.groups.GetGroupId( *group_str );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( change_priv )
|
|
||||||
priv = strtol( priv_str->c_str() , 0, 8);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PrivDir()
|
|
||||||
{
|
|
||||||
if( !ReadPriv("userfile", "groupfile", "privilegesfile", user_id_file, group_id_file, priv_file) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( !ReadPriv("userdir", "groupdir", "privilegesdir", user_id_dir, group_id_dir, priv_dir) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
PrivLogStart("Content: changes for files: ", user_id_file, group_id_file, priv_file);
|
|
||||||
PrivLogStart("Content: changes for dirs: ", user_id_dir, group_id_dir, priv_dir);
|
|
||||||
|
|
||||||
|
|
||||||
if( request.IsPostVar("changecurrentdir") )
|
|
||||||
{
|
|
||||||
Item & last_dir = *request.dir_table.back();
|
|
||||||
PrivLog("changed dir: ", last_dir.id, last_dir.url);
|
|
||||||
ChangePriv(*request.dir_table.back(), user_id_dir, group_id_dir, priv_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
subdirectories = request.IsPostVar("changesubdirs");
|
|
||||||
|
|
||||||
// go through all directories
|
|
||||||
PrivDir(request.dir_table.back()->id);
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// changing only one item (either a dir or file)
|
|
||||||
void Content::PrivOneItem()
|
|
||||||
{
|
|
||||||
if( !ReadPriv("user", "group", "privileges", user_id_file, group_id_file, priv_file) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
PrivLogStart("Content: changes: ", user_id_file, group_id_file, priv_file);
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
{
|
|
||||||
ChangePriv(request.item, user_id_file, group_id_file, priv_file);
|
|
||||||
RedirectTo(request.item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ChangePriv(*request.dir_table.back(), user_id_file, group_id_file, priv_file);
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunPriv()
|
|
||||||
{
|
|
||||||
if( !PrivCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
change_owner = (request.pfunction->code == FUN_PRIV || request.pfunction->code == FUN_CHOWN);
|
|
||||||
change_priv = (request.pfunction->code == FUN_PRIV || request.pfunction->code == FUN_CHMOD);
|
|
||||||
|
|
||||||
if( request.IsParam("r") )
|
|
||||||
{
|
|
||||||
PrivDir();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrivOneItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
data.dirs.CheckRootDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunPriv()
|
|
||||||
{
|
|
||||||
PrivCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/notify.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunReloadTemplates()
|
|
||||||
{
|
|
||||||
log << log1 << "Content: reloading html templates" << logend;
|
|
||||||
|
|
||||||
templates.ReadTemplates();
|
|
||||||
notify.ReadTemplates(); // make sure that ReadTemplates() is using some kind of locking
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunReload()
|
|
||||||
{
|
|
||||||
// !! temporarily only an admin has access
|
|
||||||
|
|
||||||
if( !request.session->puser || !request.session->puser->super_user )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: Only an admin has access to reload function" << logend;
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( request.IsParam("templates") )
|
|
||||||
FunReloadTemplates();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
204
content/rm.cpp
204
content/rm.cpp
@@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::RemoveCheckAccess()
|
|
||||||
{
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
if( !request.CanRemove(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( !request.CanRemove(request.item) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveAuthPrepareQuery()
|
|
||||||
{
|
|
||||||
rm_auth_iq.SetAll(true, false);
|
|
||||||
|
|
||||||
rm_auth_iq.sel_parent_id = true;
|
|
||||||
rm_auth_iq.sel_type = true;
|
|
||||||
rm_auth_iq.sel_auth = true;
|
|
||||||
|
|
||||||
rm_auth_iq.WhereType(Item::file);
|
|
||||||
rm_auth_iq.WhereAuth(Item::auth_none, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveAllDirs(long dir_id)
|
|
||||||
{
|
|
||||||
DirContainer::ParentIterator pnext, p = data.dirs.FindFirstParent(dir_id);
|
|
||||||
|
|
||||||
for( ; p != data.dirs.ParentEnd() ; p = pnext )
|
|
||||||
{
|
|
||||||
// this iterator p will be deleted by the next DeleteDir(p->second->id)
|
|
||||||
// (the next iterator we must calculate beforehand)
|
|
||||||
pnext = data.dirs.NextParent(p);
|
|
||||||
RemoveAllDirs(p->second->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
rm_auth_iq.WhereParentId(dir_id);
|
|
||||||
db.GetItems(request.item_table, rm_auth_iq);
|
|
||||||
|
|
||||||
for(size_t i=0 ; i<request.item_table.size() ; ++i)
|
|
||||||
RemoveAuth(request.item_table[i]);
|
|
||||||
|
|
||||||
if( db.DelDirById(dir_id) == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
data.dirs.DelDir(dir_id);
|
|
||||||
|
|
||||||
db.RemoveThread(dir_id);
|
|
||||||
db.RemoveTicket(dir_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveAllDirs()
|
|
||||||
{
|
|
||||||
RemoveAuthPrepareQuery();
|
|
||||||
|
|
||||||
// this method deletes recursively all directories
|
|
||||||
RemoveAllDirs(request.dir_table.back()->id);
|
|
||||||
request.dir_table.erase(--request.dir_table.end());
|
|
||||||
|
|
||||||
if( request.dir_table.empty() )
|
|
||||||
{
|
|
||||||
// we have deleted the root directory
|
|
||||||
data.dirs.CheckRootDir(); // adding a new root dir
|
|
||||||
Item * proot = data.dirs.GetRootDir();
|
|
||||||
|
|
||||||
if( proot )
|
|
||||||
request.dir_table.push_back(proot);
|
|
||||||
else
|
|
||||||
// there is no a root dir
|
|
||||||
// CheckRootDir() didn't add the root dir (probably problem with the database)
|
|
||||||
// make sure that Content::Make() will check that the dir_table is empty and returns
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveDir()
|
|
||||||
{
|
|
||||||
if( request.param_table.empty() )
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED; // use parameter "r" for removing a directory
|
|
||||||
else
|
|
||||||
if( request.IsParam("r") )
|
|
||||||
RemoveAllDirs();
|
|
||||||
else
|
|
||||||
request.status = WINIX_ERR_UNKNOWN_PARAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveAuth(Item & item)
|
|
||||||
{
|
|
||||||
if( item.auth_path.empty() )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: can't remove a static file: auth_path is empty" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( remove(item.auth_path.c_str()) == 0 )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: removed static file: " << item.auth_path << logend;
|
|
||||||
item.auth_path.clear();
|
|
||||||
item.auth = Item::auth_none;
|
|
||||||
// we don't store it to db (will be removed or is removed already)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int err = errno;
|
|
||||||
|
|
||||||
log << log1 << "Content: can't remove a file: " << item.auth_path;
|
|
||||||
log.SystemErr(err);
|
|
||||||
log << logend;
|
|
||||||
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::RemoveFile()
|
|
||||||
{
|
|
||||||
// for safety we check if param_table is empty
|
|
||||||
// a user can use "confirm" but can make a mistake when typing
|
|
||||||
if( !request.param_table.empty() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_UNKNOWN_PARAM;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( db.DelItem( request.item ) )
|
|
||||||
{
|
|
||||||
log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend;
|
|
||||||
TemplatesFunctions::pattern_cacher.DeletePattern(request.item);
|
|
||||||
|
|
||||||
if( data.mounts.pmount->type == Mount::thread )
|
|
||||||
db.EditThreadRemoveItem(request.item.parent_id);
|
|
||||||
else
|
|
||||||
if( data.mounts.pmount->type == Mount::ticket )
|
|
||||||
db.EditTicketRemoveItem(request.item.id);
|
|
||||||
|
|
||||||
if( request.item.auth != Item::auth_none )
|
|
||||||
RemoveAuth(request.item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunRm()
|
|
||||||
{
|
|
||||||
if( !RemoveCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.IsParam("confirm") )
|
|
||||||
return; // show confirmation dialog
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
RemoveFile();
|
|
||||||
else
|
|
||||||
RemoveDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/error.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunRun()
|
|
||||||
{
|
|
||||||
if( !request.is_item )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: Run function requires an item" << logend;
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !request.HasReadExecAccess(request.item) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunRun()
|
|
||||||
{
|
|
||||||
FunRun();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/log.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::SubjectCheckAccess()
|
|
||||||
{
|
|
||||||
// super user can always
|
|
||||||
if( request.session->puser && request.session->puser->super_user )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
bool access;
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
access = request.HasWriteAccess(request.item);
|
|
||||||
else
|
|
||||||
access = request.HasWriteAccess(*request.dir_table.back());
|
|
||||||
|
|
||||||
if( !access )
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
|
|
||||||
return access;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditDirSubject()
|
|
||||||
{
|
|
||||||
Item & dir = *request.dir_table.back();
|
|
||||||
|
|
||||||
request.PostVar("subject", dir.subject);
|
|
||||||
db.EditSubjectById(dir, dir.id);
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::EditFileSubject()
|
|
||||||
{
|
|
||||||
request.PostVar("subject", request.item.subject);
|
|
||||||
db.EditSubjectById(request.item, request.item.id);
|
|
||||||
|
|
||||||
RedirectTo(request.item);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::PostFunSubject()
|
|
||||||
{
|
|
||||||
if( !SubjectCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.is_item )
|
|
||||||
EditFileSubject();
|
|
||||||
else
|
|
||||||
EditDirSubject();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunSubject()
|
|
||||||
{
|
|
||||||
SubjectCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/mount.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunThreadSort(const Thread & t1, const Thread & t2)
|
|
||||||
{
|
|
||||||
Item * pdir1 = data.dirs.GetDir(t1.dir_id);
|
|
||||||
Item * pdir2 = data.dirs.GetDir(t2.dir_id);
|
|
||||||
|
|
||||||
if( !pdir1 || !pdir2 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
time_t time1 = mktime(&pdir1->date_creation);
|
|
||||||
time_t time2 = mktime(&pdir2->date_creation);
|
|
||||||
|
|
||||||
return time1 > time2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunThread()
|
|
||||||
{
|
|
||||||
if( request.is_item )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Db::ItemQuery iq;
|
|
||||||
|
|
||||||
if( data.mounts.pmount->IsArg(Mount::par_thread, "sort_desc") )
|
|
||||||
iq.sort_asc = false;
|
|
||||||
|
|
||||||
iq.WhereParentId(request.dir_table.back()->id);
|
|
||||||
iq.WhereType(Item::file);
|
|
||||||
iq.WhereAuth(Item::auth_none);
|
|
||||||
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
db.GetThreads(request.dir_table.back()->id, request.thread_tab);
|
|
||||||
|
|
||||||
CheckAccessToItems();
|
|
||||||
|
|
||||||
std::sort(request.thread_tab.begin(), request.thread_tab.end(), FunThreadSort);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/db.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/mount.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::TicketDeleteFirst()
|
|
||||||
{
|
|
||||||
if( !request.is_ticket )
|
|
||||||
return;
|
|
||||||
|
|
||||||
for(size_t i=0 ; i<request.item_table.size() ; ++i)
|
|
||||||
{
|
|
||||||
if( request.item_table[i].id == request.ticket.item_id )
|
|
||||||
{
|
|
||||||
// this is the first item with the content for the ticket
|
|
||||||
|
|
||||||
if( !request.HasReadAccess(request.item_table[i]) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.item_table.erase(request.item_table.begin() + i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunTicket()
|
|
||||||
{
|
|
||||||
if( request.is_item || data.mounts.pmount->type != Mount::ticket )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Db::ItemQuery iq;
|
|
||||||
|
|
||||||
iq.WhereParentId(request.dir_table.back()->id);
|
|
||||||
iq.WhereType(Item::file);
|
|
||||||
iq.WhereAuth(Item::auth_none);
|
|
||||||
|
|
||||||
db.GetItems(request.item_table, iq);
|
|
||||||
db.GetTickets(request.dir_table.back()->id, request.ticket_tab);
|
|
||||||
|
|
||||||
TicketDeleteFirst();
|
|
||||||
CheckAccessToItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "content.h"
|
|
||||||
#include "../core/request.h"
|
|
||||||
#include "../core/data.h"
|
|
||||||
#include "../core/misc.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunUploadCheckAccess()
|
|
||||||
{
|
|
||||||
if( request.is_item || !request.CanUseUpload(*request.dir_table.back()) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::UploadCreatePath()
|
|
||||||
{
|
|
||||||
if( !request.MakePath(request.item, true) )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::UploadSaveFile(const std::string & tmp_filename, const std::string & destination)
|
|
||||||
{
|
|
||||||
if( rename(tmp_filename.c_str(), destination.c_str()) == 0 )
|
|
||||||
{
|
|
||||||
log << log1 << "Content: uploaded a new file: " << destination << logend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int err = errno;
|
|
||||||
|
|
||||||
// !! skasowac takze plik z bazy danych?
|
|
||||||
log << log1 << "Content: can't move the tmp file from: " << tmp_filename << ", to: " << destination << ", ";
|
|
||||||
log.SystemErr(err);
|
|
||||||
log << logend;
|
|
||||||
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Content::FunUploadCheckAbuse()
|
|
||||||
{
|
|
||||||
if( !CheckRebus() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_INCORRECT_REBUS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckGetPostTimes(4);
|
|
||||||
|
|
||||||
if( request.session->spam_score > 0 )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_SPAM;
|
|
||||||
log << log1 << "Content: ignoring due to suspected spamming" << logend;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::UploadMulti()
|
|
||||||
{
|
|
||||||
request.item.Clear(); // clearing and setting date
|
|
||||||
request.item.parent_id = request.dir_table.back()->id;
|
|
||||||
request.item.type = Item::file;
|
|
||||||
request.item.privileges = 0644; // !! tymczasowo
|
|
||||||
SetUser(request.item);
|
|
||||||
|
|
||||||
PostFileTable::iterator i = request.post_file_table.begin();
|
|
||||||
|
|
||||||
for( ; i != request.post_file_table.end() ; ++i)
|
|
||||||
{
|
|
||||||
const char * file_name = i->second.filename.c_str();
|
|
||||||
|
|
||||||
request.item.subject = file_name;
|
|
||||||
request.item.url = file_name;
|
|
||||||
request.item.auth = SelectFileType(file_name);
|
|
||||||
|
|
||||||
PrepareUrl(request.item);
|
|
||||||
PostFunEmacsAdd(); // always adding a new item
|
|
||||||
|
|
||||||
if( !UploadCreatePath() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
UploadSaveFile(i->second.tmp_filename, request.item.auth_path);
|
|
||||||
request.status = db.EditAuthById(request.item, request.item.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RedirectToLastDir();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Content::UploadSingle()
|
|
||||||
{
|
|
||||||
std::string * new_subject = request.PostVar("subject");
|
|
||||||
std::string * new_url = request.PostVar("url");
|
|
||||||
bool has_subject = (new_subject && (*new_subject)[0] != 0 );
|
|
||||||
bool has_url = (new_url && (*new_url)[0] != 0 );
|
|
||||||
|
|
||||||
ReadItem(request.item, Item::file); // ReadItem() changes the url if it is empty
|
|
||||||
request.item.privileges = 0644; // !! tymczasowo
|
|
||||||
|
|
||||||
const char * file_name = request.post_file_table.begin()->second.filename.c_str();
|
|
||||||
request.item.auth = SelectFileType(file_name);
|
|
||||||
|
|
||||||
if( !has_subject )
|
|
||||||
request.item.subject = file_name;
|
|
||||||
|
|
||||||
if( !has_url )
|
|
||||||
{
|
|
||||||
request.item.url = file_name;
|
|
||||||
PrepareUrl(request.item);
|
|
||||||
}
|
|
||||||
|
|
||||||
PostFunEmacsAdd(); // always adding a new item
|
|
||||||
|
|
||||||
// url can be changed by PostFunEmacsAdd()
|
|
||||||
if( !UploadCreatePath() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
const std::string & tmp_filename = request.post_file_table.begin()->second.tmp_filename;
|
|
||||||
UploadSaveFile(tmp_filename, request.item.auth_path);
|
|
||||||
request.status = db.EditAuthById(request.item, request.item.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
RedirectTo(request.item, "/cat");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// !! dodac usuwanie plikow statycznych przez rm
|
|
||||||
void Content::PostFunUpload()
|
|
||||||
{
|
|
||||||
if( !FunUploadCheckAccess() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.post_file_table.empty() )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_PERMISSION_DENIED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !FunUploadCheckAbuse() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( request.post_file_table.size() > 1 )
|
|
||||||
UploadMulti();
|
|
||||||
else
|
|
||||||
UploadSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Content::FunUpload()
|
|
||||||
{
|
|
||||||
FunUploadCheckAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -4,15 +4,12 @@ include Makefile.o.dep
|
|||||||
all: $(o)
|
all: $(o)
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES: .cpp .o
|
%.o: %.cpp
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
$(CXX) -c $(CXXFLAGS) $<
|
$(CXX) -c $(CXXFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
depend:
|
depend:
|
||||||
makedepend -Y. -f- *.cpp > Makefile.dep
|
makedepend -Y. -I.. -I../../ezc/src -I../../pikotools -I../../tito/src -f- *.cpp > Makefile.dep
|
||||||
echo -n "o = " > Makefile.o.dep
|
echo -n "o = " > Makefile.o.dep
|
||||||
ls -1 *.cpp | xargs -I foo echo -n foo " " | sed -E "s/([^\.]*)\.cpp[ ]/\1\.o/g" >> Makefile.o.dep
|
ls -1 *.cpp | xargs -I foo echo -n foo " " | sed -E "s/([^\.]*)\.cpp[ ]/\1\.o/g" >> Makefile.o.dep
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
|||||||
o = acceptbaseparser.o compress.o config.o data.o db.o db_itemcolumns.o dircontainer.o dirs.o function.o functioncodeparser.o functionparser.o functions.o groups.o htmlfilter.o httpsimpleparser.o lastcontainer.o loadavg.o locale.o log.o misc.o mount.o mountparser.o mounts.o notify.o plugin.o plugindata.o postmultiparser.o rebus.o request.o requestcontroller.o session.o sessioncontainer.o sessionmanager.o sessionparser.o users.o
|
o = acceptbaseparser.o app.o basethread.o bbcodeparser.o compress.o config.o crypt.o dircontainer.o dirs.o groups.o htmlfilter.o httpsimpleparser.o image.o ipbancontainer.o item.o job.o lastcontainer.o loadavg.o lock.o log.o misc.o mount.o mountparser.o mounts.o plugin.o plugindata.o postmultiparser.o rebus.o request.o run.o session.o sessioncontainer.o sessionmanager.o sessionparser.o slog.o synchro.o system.o threadmanager.o timezone.o timezones.o user.o users.o
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreacceptbaseparser
|
#ifndef headerfile_winix_core_acceptbaseparser
|
||||||
#define headerfilecmslucoreacceptbaseparser
|
#define headerfile_winix_core_acceptbaseparser
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreacceptencodingparser
|
#ifndef headerfile_winix_core_acceptencodingparser
|
||||||
#define headerfilecmslucoreacceptencodingparser
|
#define headerfile_winix_core_acceptencodingparser
|
||||||
|
|
||||||
#include "acceptbaseparser.h"
|
#include "acceptbaseparser.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -24,24 +24,60 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AcceptGzip()
|
||||||
|
{
|
||||||
|
return accept_gzip;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParseAndLog(const char * str)
|
||||||
|
{
|
||||||
|
Parse(str);
|
||||||
|
|
||||||
|
if( accept_deflate || accept_gzip )
|
||||||
|
{
|
||||||
|
log << log3 << "AEP: ";
|
||||||
|
|
||||||
|
if( accept_deflate )
|
||||||
|
{
|
||||||
|
log << "accept deflate";
|
||||||
|
|
||||||
|
if( accept_gzip )
|
||||||
|
log << ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( accept_gzip )
|
||||||
|
log << "accept gzip";
|
||||||
|
|
||||||
|
log << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
accept_deflate = false;
|
accept_deflate = false;
|
||||||
|
accept_gzip = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Param(const std::string & param, double q)
|
void Param(const std::string & param, double q)
|
||||||
{
|
{
|
||||||
if( param=="deflate" && q!=0 )
|
if( param=="deflate" && q!=0.0 )
|
||||||
{
|
{
|
||||||
accept_deflate = true;
|
accept_deflate = true;
|
||||||
log << log3 << "AEP: accept deflate" << logend;
|
}
|
||||||
|
|
||||||
|
if( param=="gzip" && q!=0.0 )
|
||||||
|
{
|
||||||
|
accept_gzip = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool accept_deflate;
|
bool accept_deflate;
|
||||||
|
bool accept_gzip;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1553
core/app.cpp
Executable file
1553
core/app.cpp
Executable file
File diff suppressed because it is too large
Load Diff
193
core/app.h
Executable file
193
core/app.h
Executable file
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_app
|
||||||
|
#define headerfile_winix_core_app
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <ctime>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcgiapp.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "system.h"
|
||||||
|
#include "mounts.h"
|
||||||
|
#include "request.h"
|
||||||
|
#include "synchro.h"
|
||||||
|
#include "sessionmanager.h"
|
||||||
|
#include "db/db.h"
|
||||||
|
#include "functions/functions.h"
|
||||||
|
#include "templates/templates.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#include "postparser.h"
|
||||||
|
#include "cookieparser.h"
|
||||||
|
#include "postmultiparser.h"
|
||||||
|
#include "acceptencodingparser.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class App
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
App();
|
||||||
|
|
||||||
|
bool InitFCGI();
|
||||||
|
bool DropPrivileges();
|
||||||
|
bool Init();
|
||||||
|
void Start();
|
||||||
|
void Close();
|
||||||
|
void LogUserGroups();
|
||||||
|
bool Demonize();
|
||||||
|
void SetStopSignal();
|
||||||
|
bool WasStopSignal();
|
||||||
|
bool Lock();
|
||||||
|
void Unlock();
|
||||||
|
void StartThreads();
|
||||||
|
void WaitForThreads();
|
||||||
|
|
||||||
|
// configuration read from a config file
|
||||||
|
Config config;
|
||||||
|
|
||||||
|
// pointers to the current request and a session
|
||||||
|
Cur cur;
|
||||||
|
|
||||||
|
// temporary one request object
|
||||||
|
// current request
|
||||||
|
Request req;
|
||||||
|
|
||||||
|
// users sessions
|
||||||
|
SessionManager session_manager;
|
||||||
|
|
||||||
|
// database
|
||||||
|
Db db;
|
||||||
|
DbConn db_conn;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
model
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ...
|
||||||
|
System system;
|
||||||
|
|
||||||
|
// functions (ls, cat, emacs, ...)
|
||||||
|
Functions functions;
|
||||||
|
|
||||||
|
// false at the beginning
|
||||||
|
// !! moze to do loggera dac?
|
||||||
|
bool stdout_is_closed;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
view
|
||||||
|
*/
|
||||||
|
|
||||||
|
Templates templates;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
enum Header
|
||||||
|
{
|
||||||
|
h_200,
|
||||||
|
h_404,
|
||||||
|
h_403
|
||||||
|
};
|
||||||
|
|
||||||
|
PostParser post_parser;
|
||||||
|
PostMultiParser post_multi_parser;
|
||||||
|
CookieParser cookie_parser;
|
||||||
|
AcceptEncodingParser accept_encoding_parser;
|
||||||
|
Compress compress;
|
||||||
|
std::wstring clean_html, html_with_debug;
|
||||||
|
FCGX_Request fcgi_request;
|
||||||
|
int fcgi_socket;
|
||||||
|
Synchro synchro;
|
||||||
|
pthread_t signal_thread;
|
||||||
|
std::string url_to_fetch_on_exit;
|
||||||
|
std::string source_a;
|
||||||
|
std::string sendh_t, sendh_t2, sendh_t3;
|
||||||
|
std::string sendfilea, sendfile2a;
|
||||||
|
std::string send_data_buf;
|
||||||
|
PT::SpaceToJSON ajax_generic_serializer;
|
||||||
|
|
||||||
|
bool CheckAccessFromPlugins();
|
||||||
|
void ProcessRequestThrow();
|
||||||
|
void ProcessRequest();
|
||||||
|
void BaseUrlRedirect(int code, bool add_subdomain);
|
||||||
|
bool BaseUrlRedirect();
|
||||||
|
void CheckIfNeedSSLredirect();
|
||||||
|
void SetLocale();
|
||||||
|
void CheckPostRedirect();
|
||||||
|
void MakePage();
|
||||||
|
void Make();
|
||||||
|
void SaveSessionsIfNeeded(); // !! wywalic do menagera sesji??
|
||||||
|
void LogAccess();
|
||||||
|
void SendData(const BinaryPage & page, FCGX_Stream * out);
|
||||||
|
|
||||||
|
void ReadRequest();
|
||||||
|
void SendTextAnswer();
|
||||||
|
void SendBinaryAnswer();
|
||||||
|
void SendAnswer();
|
||||||
|
|
||||||
|
void PrintEnv();
|
||||||
|
|
||||||
|
void SetEnv(const char * & env, const char * name);
|
||||||
|
void ReadEnvVariables();
|
||||||
|
void ReadGetPostVars();
|
||||||
|
|
||||||
|
void CheckIE();
|
||||||
|
void CheckKonqueror();
|
||||||
|
void CheckRequestMethod();
|
||||||
|
void CheckFCGIRole();
|
||||||
|
void CheckSSL();
|
||||||
|
void SetSubdomain();
|
||||||
|
|
||||||
|
void PrepareSessionCookie();
|
||||||
|
void AddDebugInfo(std::wstring & out);
|
||||||
|
void FilterCompressSend(bool compressing, int compress_encoding, const std::wstring & source_ref);
|
||||||
|
bool SendHeadersStaticCreateResource();
|
||||||
|
void SendHeadersStatic();
|
||||||
|
void SendHeaderContentType();
|
||||||
|
void SendHeadersForbidden();
|
||||||
|
void SendHeadersRedirect();
|
||||||
|
void SendHeadersSendFile();
|
||||||
|
void SendHeadersCompression(int compress_encoding);
|
||||||
|
void SendHeadersNormal(Header header);
|
||||||
|
void SendHeaders(bool compressing, int compress_encoding, Header header);
|
||||||
|
int SelectDeflateVersion();
|
||||||
|
void SelectCompression(size_t source_len, bool & compression_allowed, int & compression_encoding);
|
||||||
|
bool CanSendContent(Header header);
|
||||||
|
|
||||||
|
void LogUser(const char * msg, uid_t id);
|
||||||
|
void LogGroup(const char * msg, gid_t id, bool put_logend = true);
|
||||||
|
void LogUsers();
|
||||||
|
void LogEffectiveGroups(std::vector<gid_t> & tab);
|
||||||
|
void LogGroups();
|
||||||
|
bool DropPrivileges(const std::string & user, uid_t uid, gid_t gid, bool additional_groups);
|
||||||
|
|
||||||
|
static void * SpecialThreadForSignals(void*);
|
||||||
|
void FetchPageOnExit();
|
||||||
|
|
||||||
|
void CreateStaticTree();
|
||||||
|
|
||||||
|
// !! dodac do session managera?
|
||||||
|
time_t last_sessions_save;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
239
core/basethread.cpp
Executable file
239
core/basethread.cpp
Executable file
@@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2011, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include "basethread.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BaseThread::BaseThread() : thread_signal(PTHREAD_COND_INITIALIZER)
|
||||||
|
{
|
||||||
|
synchro = 0;
|
||||||
|
thread_id = 0;
|
||||||
|
work_mode = 0;
|
||||||
|
wake_up_was_called = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::SetSynchro(Synchro * psynchro)
|
||||||
|
{
|
||||||
|
synchro = psynchro;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::Mode(int mode)
|
||||||
|
{
|
||||||
|
work_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pthread_t BaseThread::ThreadId()
|
||||||
|
{
|
||||||
|
return thread_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BaseThread::Lock()
|
||||||
|
{
|
||||||
|
return synchro->Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::Unlock()
|
||||||
|
{
|
||||||
|
synchro->Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BaseThread::IsExitSignal()
|
||||||
|
{
|
||||||
|
bool res = true;
|
||||||
|
|
||||||
|
if( Lock() )
|
||||||
|
{
|
||||||
|
res = synchro->was_stop_signal;
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BaseThread::BaseInit()
|
||||||
|
{
|
||||||
|
bool init_status = false;
|
||||||
|
|
||||||
|
if( Lock() )
|
||||||
|
{
|
||||||
|
init_status = Init(); // your virtual method
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return init_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::BaseUninit()
|
||||||
|
{
|
||||||
|
if( Lock() )
|
||||||
|
{
|
||||||
|
Uninit(); // your virtual method
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BaseThread::BaseSignalReceived()
|
||||||
|
{
|
||||||
|
bool make_do = false;
|
||||||
|
|
||||||
|
wake_up_was_called = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
make_do = SignalReceived(); // your short-time virtual method (objects are locked)
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_do;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// this is called only if your SignalReceived() returned true
|
||||||
|
void BaseThread::BaseDo()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Do(); // your long-time virtual method (objects are *not* locked)
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// use it with Lock and Unlock
|
||||||
|
bool BaseThread::WaitForSignal()
|
||||||
|
{
|
||||||
|
if( synchro->was_stop_signal || wake_up_was_called )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return pthread_cond_wait(&thread_signal, &synchro->mutex) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// you should use this method with: synchro->Lock() and Unlock()
|
||||||
|
void BaseThread::WakeUpThread()
|
||||||
|
{
|
||||||
|
wake_up_was_called = true;
|
||||||
|
pthread_cond_signal(&thread_signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// use it with Lock and Unlock
|
||||||
|
// it breaks only if there was a stop signal or the time has expired
|
||||||
|
bool BaseThread::WaitForSignalSleep(time_t second)
|
||||||
|
{
|
||||||
|
timespec t;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if( synchro->was_stop_signal )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
t.tv_sec = time(0) + second;
|
||||||
|
t.tv_nsec = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
res = pthread_cond_timedwait(&thread_signal, &synchro->mutex, &t);
|
||||||
|
}
|
||||||
|
while( res == 0 && !synchro->was_stop_signal );
|
||||||
|
// above condition means there was a signal
|
||||||
|
// but it was not a stop signal so we should still wait
|
||||||
|
|
||||||
|
return res == 0 || res == ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::WaitForThread()
|
||||||
|
{
|
||||||
|
pthread_join(thread_id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BaseThread::SignalLoop()
|
||||||
|
{
|
||||||
|
bool make_do;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if( Lock() )
|
||||||
|
{
|
||||||
|
make_do = false;
|
||||||
|
|
||||||
|
if( WaitForSignal() ) // automatically unlock, wait and lock again when signal comes
|
||||||
|
if( !synchro->was_stop_signal )
|
||||||
|
make_do = BaseSignalReceived(); // your short-time virtual method will be called (objects locked)
|
||||||
|
|
||||||
|
Unlock(); // unlocking from WaitForSignal()
|
||||||
|
|
||||||
|
if( make_do )
|
||||||
|
BaseDo(); // your long-time virtual method will be called (objects *not* locked)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while( !IsExitSignal() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void * BaseThread::StartRoutine(void * this_object)
|
||||||
|
{
|
||||||
|
BaseThread * base = reinterpret_cast<BaseThread*>(this_object);
|
||||||
|
|
||||||
|
if( base->synchro )
|
||||||
|
{
|
||||||
|
if( base->BaseInit() )
|
||||||
|
{
|
||||||
|
if( base->work_mode == 0 )
|
||||||
|
base->SignalLoop();
|
||||||
|
else
|
||||||
|
base->Work();
|
||||||
|
|
||||||
|
base->BaseUninit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_exit(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BaseThread::StartThread()
|
||||||
|
{
|
||||||
|
pthread_attr_t attr;
|
||||||
|
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
|
int res = pthread_create(&thread_id, &attr, StartRoutine, this);
|
||||||
|
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
|
||||||
|
return res == 0;
|
||||||
|
}
|
||||||
|
|
||||||
125
core/basethread.h
Executable file
125
core/basethread.h
Executable file
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_basethread
|
||||||
|
#define headerfile_winix_core_basethread
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include "synchro.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BaseThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
BaseThread();
|
||||||
|
|
||||||
|
// synchro object (must be set)
|
||||||
|
void SetSynchro(Synchro * psynchro);
|
||||||
|
|
||||||
|
// work mode
|
||||||
|
// we have two modes:
|
||||||
|
// 0 - there is a loop with SignalReceived() and Do()
|
||||||
|
// if SignalReceived() returns true then Do() is called
|
||||||
|
// 1 - only Work() method is called
|
||||||
|
// the thread exits after Work() has finished
|
||||||
|
// default: 0
|
||||||
|
void Mode(int mode);
|
||||||
|
|
||||||
|
// starting the second thread
|
||||||
|
bool StartThread();
|
||||||
|
|
||||||
|
|
||||||
|
// virtual methods which should/can be inherited by your class
|
||||||
|
// the methods will be called from the other thread
|
||||||
|
|
||||||
|
// wake up the second thread
|
||||||
|
// (if it waits for the signal)
|
||||||
|
// you should use it with: synchro->Lock() and Unlock()
|
||||||
|
// if the thread doesn't wait on a signal then nothing is done
|
||||||
|
virtual void WakeUpThread();
|
||||||
|
|
||||||
|
// waiting until the thread exits
|
||||||
|
// you should call WakeUpThread() before
|
||||||
|
virtual void WaitForThread();
|
||||||
|
|
||||||
|
// initialize the thread
|
||||||
|
// (global objects are locked)
|
||||||
|
// if it returns false then the thread immediately exits
|
||||||
|
// default: true
|
||||||
|
virtual bool Init() { return true; }
|
||||||
|
|
||||||
|
// uninitialize the thread
|
||||||
|
// this is called before the thread is prepare to detach
|
||||||
|
// (global objects are locked)
|
||||||
|
// it's called only if Init() returned true
|
||||||
|
virtual void Uninit() {}
|
||||||
|
|
||||||
|
// returns the thread id
|
||||||
|
// this identifier is set by StartThread() metdhod
|
||||||
|
pthread_t ThreadId();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
// signal came (work mode = 0 - default)
|
||||||
|
// signal comes when an other thread calls WakeUpThread() method
|
||||||
|
// check specific job and return true to call Do() next
|
||||||
|
// (global objects are locked -- copy some global objects to local variables)
|
||||||
|
virtual bool SignalReceived() { return false; };
|
||||||
|
|
||||||
|
// if SignalReceived() returned true then this method is called
|
||||||
|
// global objects are *not* locked -- use only your local variables
|
||||||
|
// if you have to do something on global objects use synchro->Lock() and synchro->Unlock()
|
||||||
|
virtual void Do() {}
|
||||||
|
|
||||||
|
// this method is called after Init() when Mode(1) is used
|
||||||
|
// this is for long-time job
|
||||||
|
// this method is called only once
|
||||||
|
// global objects are *not* locked
|
||||||
|
virtual void Work() {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Synchro * synchro;
|
||||||
|
pthread_t thread_id; // thread id - set by StartThread()
|
||||||
|
pthread_cond_t thread_signal;
|
||||||
|
int work_mode;
|
||||||
|
bool wake_up_was_called;
|
||||||
|
|
||||||
|
void SignalLoop();
|
||||||
|
static void * StartRoutine(void *);
|
||||||
|
bool BaseInit();
|
||||||
|
void BaseUninit();
|
||||||
|
bool BaseSignalReceived();
|
||||||
|
void BaseDo();
|
||||||
|
bool WaitForSignal();
|
||||||
|
bool WaitForSignalSleep(time_t second);
|
||||||
|
|
||||||
|
bool Lock();
|
||||||
|
void Unlock();
|
||||||
|
|
||||||
|
// if the work done by Do() is long time consuming you should periodically check
|
||||||
|
// wheter there was a signal for exiting, and if it was just simply return from Do()
|
||||||
|
// (it's checking with locking and unlocking)
|
||||||
|
bool IsExitSignal();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
592
core/bbcodeparser.cpp
Executable file
592
core/bbcodeparser.cpp
Executable file
@@ -0,0 +1,592 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bbcodeparser.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::Equal(const wchar_t * str1, const wchar_t * str2)
|
||||||
|
{
|
||||||
|
while( *str1 == *str2 && *str1 != 0 )
|
||||||
|
{
|
||||||
|
str1 += 1;
|
||||||
|
str2 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *str1 == *str2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::IsValidCharForName(int c)
|
||||||
|
{
|
||||||
|
if( (c>='a' && c<='z') ||
|
||||||
|
(c>='A' && c<='Z') ||
|
||||||
|
c=='*' || c=='_')
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::IsOpeningTagMark()
|
||||||
|
{
|
||||||
|
return (*pchar == '[');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// there are no commentaries in bbcode
|
||||||
|
bool BBCODEParser::IsOpeningCommentaryTagMark()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::SkipCommentaryTagIfExists()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::IsClosingTagMark()
|
||||||
|
{
|
||||||
|
return (*pchar == ']');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::IsClosingXmlSimpleTagMark()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// one enter will generate one <br>
|
||||||
|
// two enters or more will generate only two br (<br><br>)
|
||||||
|
void BBCODEParser::PutNormalText(const wchar_t * str, const wchar_t * end)
|
||||||
|
{
|
||||||
|
int br_len;
|
||||||
|
|
||||||
|
if( *pchar == 0 )
|
||||||
|
{
|
||||||
|
// trimming last white characters at end of the user text
|
||||||
|
while( str<end && (IsWhite(*(end-1)) || *(end-1)==10) )
|
||||||
|
--end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while( str < end )
|
||||||
|
{
|
||||||
|
if( *str == 10 )
|
||||||
|
{
|
||||||
|
++str;
|
||||||
|
br_len = 1;
|
||||||
|
|
||||||
|
// skipping white characters without a new line character
|
||||||
|
while( str < end && IsWhite(*str) )
|
||||||
|
++str;
|
||||||
|
|
||||||
|
if( str < end && *str == 10 )
|
||||||
|
{
|
||||||
|
br_len = 2;
|
||||||
|
|
||||||
|
// skipping white characters with new line characters
|
||||||
|
while( str < end && (IsWhite(*str) || *str==10) )
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !has_open_ol_tag && !has_open_ul_tag && !has_open_li_tag )
|
||||||
|
{
|
||||||
|
for(int i=0 ; i < br_len ; ++i)
|
||||||
|
(*out_string) += L"<br>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PrintEscape(*str);
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::ReadNormalTextSkipWhite(const wchar_t * & start, const wchar_t * & last_non_white)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::CheckExceptions()
|
||||||
|
{
|
||||||
|
if( stack_len >= 2 )
|
||||||
|
{
|
||||||
|
if( pstack[stack_len-1].type == Item::opening &&
|
||||||
|
pstack[stack_len-2].type == Item::opening &&
|
||||||
|
IsNameEqual(L"*", pstack[stack_len-1].name) &&
|
||||||
|
IsNameEqual(L"*", pstack[stack_len-2].name) )
|
||||||
|
{
|
||||||
|
// removing the last [*] from the stack
|
||||||
|
// </li> was put automatically
|
||||||
|
PopStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
bbcode format:
|
||||||
|
[bbcodetag=value]some text[/bbcodetag]
|
||||||
|
the value can be quoted, e.g.
|
||||||
|
[bbcodetag="value"]some text[/bbcodetag], or
|
||||||
|
[bbcodetag='value']some text[/bbcodetag]
|
||||||
|
|
||||||
|
the third string below (in tags table) is 'html_argument' from Tags,
|
||||||
|
it can contain a special character % followed by a string which means:
|
||||||
|
%1 - "value" escaped as for html
|
||||||
|
%2 - "some text" escaped as for html
|
||||||
|
%u1 - "value" trimmed and escaped as for url-es
|
||||||
|
%u2 - "some text" trimmed and escaped as for url-es
|
||||||
|
%% - one %
|
||||||
|
|
||||||
|
if you are using %2 or %u2 then "some text" is not treated as bbcode, e.g.
|
||||||
|
[bbcodetag=value]some [b]text[/b][/bbcodetag] will produce:
|
||||||
|
<htmltag arg="value">some [b]text[/b]</htmltag> (the inner tags [b][/b] were not parsed)
|
||||||
|
|
||||||
|
also when using %2 or %u2 the closing bbcode tag is skipped
|
||||||
|
(if you want this tag then you can put it in 'html_argument')
|
||||||
|
|
||||||
|
and when using u (%u1 or %u2) the argument is trimmed from whitespaces and new lines
|
||||||
|
at the beginning and at the end
|
||||||
|
(because otherwise a space would be changed to %20 and this were probably not what you really wanted)
|
||||||
|
*/
|
||||||
|
const BBCODEParser::Tags * BBCODEParser::FindTag(const wchar_t * tag)
|
||||||
|
{
|
||||||
|
static Tags tags[] = {
|
||||||
|
{L"*", L"li", L">", false},
|
||||||
|
{L"b", L"em", L">", true},
|
||||||
|
{L"i", L"span", L" class=\"bbitalic\">", true},
|
||||||
|
{L"u", L"span", L" class=\"bbunderline\">", true},
|
||||||
|
{L"s", L"span", L" class=\"bbstrike\">", true},
|
||||||
|
{L"code", L"code", L" class=\"bbcode\">", false},
|
||||||
|
{L"list", L"ul", L" class=\"bblist\">", false},
|
||||||
|
{L"color", L"span", L" class=\"bbcol%1\">", true},
|
||||||
|
{L"url", L"a", L" href=\"%u1\">", true},
|
||||||
|
{L"img", L"img", L" alt=\"%1\" src=\"%u2\">", true},
|
||||||
|
{L"quote", L"div", L" class=\"bbquote\">\n<span class=\"bbquotewho\">%1</span><br>\n", false},
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
size_t len = sizeof(tags) / sizeof(Tags);
|
||||||
|
|
||||||
|
for(i=0 ; i<len ; ++i)
|
||||||
|
{
|
||||||
|
if( Equal(tag, tags[i].bbcode) )
|
||||||
|
return &tags[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BBCODEParser::Tags * BBCODEParser::FindTag(const std::wstring & tag)
|
||||||
|
{
|
||||||
|
return FindTag(tag.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintArgumentCheckQuotes(const wchar_t * & start, const wchar_t * & end)
|
||||||
|
{
|
||||||
|
// skipping white characters from the argument
|
||||||
|
while( start<end && IsWhite(*start) )
|
||||||
|
++start;
|
||||||
|
|
||||||
|
// skipping first '=' character if exists
|
||||||
|
if( start<end && *start == '=' )
|
||||||
|
++start;
|
||||||
|
|
||||||
|
// skipping white characters from the argument
|
||||||
|
// at the beginning
|
||||||
|
while( start<end && IsWhite(*start) )
|
||||||
|
++start;
|
||||||
|
|
||||||
|
// and at the end
|
||||||
|
while( start<end && IsWhite(*(end-1)) )
|
||||||
|
--end;
|
||||||
|
|
||||||
|
|
||||||
|
if( start<end && (*start=='\'' || *start=='\"') )
|
||||||
|
{
|
||||||
|
++start;
|
||||||
|
|
||||||
|
if( start<end && *(start-1) == *(end-1) )
|
||||||
|
--end;
|
||||||
|
|
||||||
|
// skipping white characters after a first quote char [url = " ww...."]
|
||||||
|
while( start<end && IsWhite(*start) )
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintEncode(int c)
|
||||||
|
{
|
||||||
|
if( c == '&' )
|
||||||
|
{
|
||||||
|
(*out_string) += L"&";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( (c>='a' && c<='z') ||
|
||||||
|
(c>='A' && c<='Z') ||
|
||||||
|
(c>='0' && c<='9') ||
|
||||||
|
(c=='_' || c=='?' || c=='.' || c==',' || c=='/' || c=='-' ||
|
||||||
|
c=='+' || c=='*' || c=='(' || c==')' || c=='=' || c==':')
|
||||||
|
)
|
||||||
|
{
|
||||||
|
(*out_string) += c;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wchar_t buffer[20];
|
||||||
|
swprintf(buffer, 20, L"%02X", c);
|
||||||
|
|
||||||
|
(*out_string) += '%';
|
||||||
|
(*out_string) += buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintEscape(int c, bool change_quote)
|
||||||
|
{
|
||||||
|
if( c == '<' )
|
||||||
|
{
|
||||||
|
(*out_string) += L"<";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( c == '>' )
|
||||||
|
{
|
||||||
|
(*out_string) += L">";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( c == '&' )
|
||||||
|
{
|
||||||
|
(*out_string) += L"&";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( c == '\"' && change_quote )
|
||||||
|
{
|
||||||
|
(*out_string) += L""";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*out_string) += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintArgumentEncode(const wchar_t * start, const wchar_t * end)
|
||||||
|
{
|
||||||
|
PrintArgumentCheckQuotes(start, end);
|
||||||
|
TrimWhiteWithNewLines(start, end);
|
||||||
|
|
||||||
|
for( ; start<end ; ++start )
|
||||||
|
PrintEncode(*start);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintArgumentEscape(const wchar_t * start, const wchar_t * end)
|
||||||
|
{
|
||||||
|
PrintArgumentCheckQuotes(start, end);
|
||||||
|
|
||||||
|
for( ; start<end ; ++start )
|
||||||
|
PrintEscape(*start, true); // quotes are escaped as well here
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::CheckOpeningTag(const Tags * tag, const wchar_t * tag_name, bool & condition)
|
||||||
|
{
|
||||||
|
if( Equal(tag->html_tag, tag_name) )
|
||||||
|
{
|
||||||
|
if( condition )
|
||||||
|
{
|
||||||
|
PutClosingTag(tag);
|
||||||
|
(*out_string) += '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
condition = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::CheckOpeningTag(const Tags * tag)
|
||||||
|
{
|
||||||
|
bool has_list_tag = has_open_ul_tag || has_open_ol_tag;
|
||||||
|
|
||||||
|
CheckOpeningTag(tag, L"li", has_open_li_tag);
|
||||||
|
CheckOpeningTag(tag, L"ul", has_open_ul_tag);
|
||||||
|
CheckOpeningTag(tag, L"ol", has_open_ol_tag);
|
||||||
|
|
||||||
|
if( has_open_li_tag && !has_list_tag )
|
||||||
|
{
|
||||||
|
(*out_string) += L"<ul>\n";
|
||||||
|
has_open_ul_tag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintEscape(const wchar_t * start, const wchar_t * end, bool change_quote)
|
||||||
|
{
|
||||||
|
for( ; start < end ; ++start)
|
||||||
|
PrintEscape(*start, change_quote);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PrintEncode(const wchar_t * start, const wchar_t * end)
|
||||||
|
{
|
||||||
|
for( ; start < end ; ++start)
|
||||||
|
PrintEncode(*start);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutOpeningTagFromEzc()
|
||||||
|
{
|
||||||
|
// this can be a tag from Ezc templates system
|
||||||
|
(*out_string) += '[';
|
||||||
|
(*out_string) += LastItem().name;
|
||||||
|
|
||||||
|
const wchar_t * start = pchar;
|
||||||
|
|
||||||
|
while( *pchar && *pchar!=']' )
|
||||||
|
++pchar;
|
||||||
|
|
||||||
|
if( *pchar == ']' )
|
||||||
|
++pchar;
|
||||||
|
|
||||||
|
Put(start, pchar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutHtmlArgument1(const wchar_t * arg_start, const wchar_t * arg_end, bool has_u)
|
||||||
|
{
|
||||||
|
if( has_u )
|
||||||
|
PrintArgumentEncode(arg_start, arg_end);
|
||||||
|
else
|
||||||
|
PrintArgumentEscape(arg_start, arg_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::TrimWhiteWithNewLines(const wchar_t * & start, const wchar_t * & end)
|
||||||
|
{
|
||||||
|
while( start < end && (IsWhite(*start) || *start==10) )
|
||||||
|
++start;
|
||||||
|
|
||||||
|
while( start < end && (IsWhite(*(end-1)) || *(end-1)==10) )
|
||||||
|
--end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutHtmlArgument2(const Tags * tag, bool has_u)
|
||||||
|
{
|
||||||
|
const wchar_t * start = pchar;
|
||||||
|
const wchar_t * end = pchar;
|
||||||
|
bool first_tag_removed = false;
|
||||||
|
|
||||||
|
while( *pchar != 0 )
|
||||||
|
{
|
||||||
|
if( IsOpeningTagMark() )
|
||||||
|
{
|
||||||
|
if( IsClosingTagForLastItem() )
|
||||||
|
{
|
||||||
|
// the last tag is skipped when using patterns with %2 or %u2
|
||||||
|
|
||||||
|
PopStack(); // removing opening tag from the stack
|
||||||
|
first_tag_removed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pchar += 1;
|
||||||
|
end = pchar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !first_tag_removed )
|
||||||
|
PopStack(); // user has forgotten to close the tag
|
||||||
|
|
||||||
|
if( has_u )
|
||||||
|
{
|
||||||
|
TrimWhiteWithNewLines(start, end);
|
||||||
|
PrintEncode(start, end);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PrintEscape(start, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutHtmlArgument(const Tags * tag, const wchar_t * arg_start, const wchar_t * arg_end)
|
||||||
|
{
|
||||||
|
const wchar_t * pattern = tag->html_argument;
|
||||||
|
bool has_u;
|
||||||
|
|
||||||
|
while( *pattern )
|
||||||
|
{
|
||||||
|
if( *pattern == '%' )
|
||||||
|
{
|
||||||
|
++pattern;
|
||||||
|
has_u = false;
|
||||||
|
|
||||||
|
if( *pattern == 'u' )
|
||||||
|
{
|
||||||
|
++pattern;
|
||||||
|
has_u = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *pattern == '1' )
|
||||||
|
{
|
||||||
|
++pattern;
|
||||||
|
PutHtmlArgument1(arg_start, arg_end, has_u);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( *pattern == '2' )
|
||||||
|
{
|
||||||
|
++pattern;
|
||||||
|
PutHtmlArgument2(tag, has_u);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( *pattern == '%' )
|
||||||
|
{
|
||||||
|
(*out_string) += '%';
|
||||||
|
++pattern;
|
||||||
|
}
|
||||||
|
// else unrecognized, will be printed next time as a normal character
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*out_string) += *pattern;
|
||||||
|
++pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutOpeningTagFromBBCode(const Tags * tag)
|
||||||
|
{
|
||||||
|
CheckOpeningTag(tag);
|
||||||
|
PutOpeningTagMark();
|
||||||
|
Put(tag->html_tag);
|
||||||
|
|
||||||
|
const wchar_t * start = pchar;
|
||||||
|
|
||||||
|
while( *pchar && *pchar != ']' )
|
||||||
|
++pchar;
|
||||||
|
|
||||||
|
PutHtmlArgument(tag, start, pchar);
|
||||||
|
|
||||||
|
if( *pchar == ']' )
|
||||||
|
++pchar;
|
||||||
|
|
||||||
|
if( !tag->inline_tag )
|
||||||
|
{
|
||||||
|
Put(10);
|
||||||
|
SkipWhiteLines();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BBCODEParser::PutOpeningTag()
|
||||||
|
{
|
||||||
|
const Tags * tag = FindTag(LastItem().name);
|
||||||
|
|
||||||
|
if( !tag )
|
||||||
|
PutOpeningTagFromEzc();
|
||||||
|
else
|
||||||
|
PutOpeningTagFromBBCode(tag);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutClosingTag(const Tags * tag)
|
||||||
|
{
|
||||||
|
if( !tag )
|
||||||
|
return; // skipping the tag
|
||||||
|
|
||||||
|
PutOpeningTagMark();
|
||||||
|
(*out_string) += '/';
|
||||||
|
(*out_string) += tag->html_tag;
|
||||||
|
PutClosingTagMark();
|
||||||
|
|
||||||
|
if( !tag->inline_tag )
|
||||||
|
{
|
||||||
|
(*out_string) += L"\n";
|
||||||
|
SkipWhiteLines();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Equal(tag->html_tag, L"li") )
|
||||||
|
has_open_li_tag = false;
|
||||||
|
|
||||||
|
if( Equal(tag->html_tag, L"ol") )
|
||||||
|
has_open_ol_tag = false;
|
||||||
|
|
||||||
|
if( Equal(tag->html_tag, L"ul") )
|
||||||
|
has_open_ul_tag = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::PutClosingTag(const wchar_t * tag_name)
|
||||||
|
{
|
||||||
|
const Tags * tag = FindTag(tag_name);
|
||||||
|
PutClosingTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::Init()
|
||||||
|
{
|
||||||
|
has_open_li_tag = false;
|
||||||
|
has_open_ol_tag = false;
|
||||||
|
has_open_ul_tag = false;
|
||||||
|
|
||||||
|
SkipWhiteLines();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BBCODEParser::Uninit()
|
||||||
|
{
|
||||||
|
if( has_open_li_tag )
|
||||||
|
(*out_string) += L"</li>\n";
|
||||||
|
|
||||||
|
if( has_open_ol_tag )
|
||||||
|
(*out_string) += L"</ol>\n";
|
||||||
|
|
||||||
|
if( has_open_ul_tag )
|
||||||
|
(*out_string) += L"</ul>\n";
|
||||||
|
}
|
||||||
93
core/bbcodeparser.h
Executable file
93
core/bbcodeparser.h
Executable file
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_bbcodeparser
|
||||||
|
#define headerfile_winix_core_bbcodeparser
|
||||||
|
|
||||||
|
#include "htmlfilter.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BBCODEParser : public HTMLFilter
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Tags
|
||||||
|
{
|
||||||
|
const wchar_t * bbcode;
|
||||||
|
const wchar_t * html_tag;
|
||||||
|
const wchar_t * html_argument; // with closing '>'
|
||||||
|
bool inline_tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
virtual methods
|
||||||
|
(from HTMLFilter class)
|
||||||
|
*/
|
||||||
|
virtual void Init();
|
||||||
|
virtual void Uninit();
|
||||||
|
|
||||||
|
virtual bool IsOpeningTagMark();
|
||||||
|
virtual bool IsOpeningCommentaryTagMark();
|
||||||
|
virtual bool IsClosingTagMark();
|
||||||
|
virtual bool IsClosingXmlSimpleTagMark();
|
||||||
|
|
||||||
|
virtual bool IsValidCharForName(int c);
|
||||||
|
virtual void CheckExceptions();
|
||||||
|
virtual bool SkipCommentaryTagIfExists();
|
||||||
|
|
||||||
|
virtual bool PutOpeningTag();
|
||||||
|
virtual void PutClosingTag(const wchar_t * tag);
|
||||||
|
|
||||||
|
virtual void PutNormalText(const wchar_t * str, const wchar_t * end);
|
||||||
|
virtual void ReadNormalTextSkipWhite(const wchar_t * & start, const wchar_t * & last_non_white);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
others
|
||||||
|
*/
|
||||||
|
bool Equal(const wchar_t * str1, const wchar_t * str2);
|
||||||
|
|
||||||
|
void PutHtmlArgument1(const wchar_t * arg_start, const wchar_t * arg_end, bool has_u);
|
||||||
|
void PutHtmlArgument2(const Tags * tag, bool has_u);
|
||||||
|
void PutHtmlArgument(const Tags * tag, const wchar_t * arg_start, const wchar_t * arg_end);
|
||||||
|
|
||||||
|
void PutOpeningTagFromEzc();
|
||||||
|
void PutOpeningTagFromBBCode(const Tags * tag);
|
||||||
|
|
||||||
|
const Tags * FindTag(const wchar_t * tag);
|
||||||
|
const Tags * FindTag(const std::wstring & tag);
|
||||||
|
void PrintArgumentCheckQuotes(const wchar_t * & start, const wchar_t * & end);
|
||||||
|
|
||||||
|
void PrintEscape(int c, bool change_quote = false);
|
||||||
|
void PrintEncode(int c);
|
||||||
|
|
||||||
|
void PrintEscape(const wchar_t * start, const wchar_t * end, bool change_quote = false);
|
||||||
|
void PrintEncode(const wchar_t * start, const wchar_t * end);
|
||||||
|
|
||||||
|
void PrintArgumentEncode(const wchar_t * start, const wchar_t * end);
|
||||||
|
void PrintArgumentEscape(const wchar_t * start, const wchar_t * end);
|
||||||
|
|
||||||
|
void PutClosingTag(const Tags * tag);
|
||||||
|
|
||||||
|
void CheckOpeningTag(const Tags * tag, const wchar_t * tag_name, bool & condition);
|
||||||
|
void CheckOpeningTag(const Tags * tag);
|
||||||
|
|
||||||
|
void TrimWhiteWithNewLines(const wchar_t * & start, const wchar_t * & end);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool has_open_ol_tag; // has open html <ol> tag
|
||||||
|
bool has_open_ul_tag; // has open html <ul> tag
|
||||||
|
bool has_open_li_tag; // has open html <li> tag
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -15,34 +15,52 @@
|
|||||||
|
|
||||||
Compress::Compress()
|
Compress::Compress()
|
||||||
{
|
{
|
||||||
buffer = 0;
|
buffer_in = 0;
|
||||||
buffer_max_len = 65536; // 64KB
|
buffer_out = 0;
|
||||||
|
buffer_max_len = 65536; // 64KB
|
||||||
ready_for_compress = false;
|
ready_for_compress = false;
|
||||||
|
compress_level = 6;
|
||||||
|
raw_deflate_inited = false;
|
||||||
|
deflate_inited = false;
|
||||||
|
gzip_inited = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Compress::~Compress()
|
Compress::~Compress()
|
||||||
{
|
{
|
||||||
if( buffer )
|
delete [] buffer_in;
|
||||||
delete [] buffer;
|
delete [] buffer_out;
|
||||||
|
|
||||||
|
if( raw_deflate_inited )
|
||||||
|
deflateEnd(&strm_raw_deflate);
|
||||||
|
|
||||||
|
if( deflate_inited )
|
||||||
|
deflateEnd(&strm_deflate);
|
||||||
|
|
||||||
|
if( gzip_inited )
|
||||||
|
deflateEnd(&strm_gzip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Compress::AllocateMemory()
|
bool Compress::AllocateMemory()
|
||||||
{
|
{
|
||||||
if( buffer )
|
if( buffer_in )
|
||||||
delete [] buffer;
|
delete [] buffer_in;
|
||||||
|
|
||||||
|
if( buffer_out )
|
||||||
|
delete [] buffer_out;
|
||||||
|
|
||||||
|
buffer_in = 0;
|
||||||
|
buffer_out = 0;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
buffer = new char[buffer_max_len];
|
buffer_in = new char[buffer_max_len];
|
||||||
|
buffer_out = new char[buffer_max_len];
|
||||||
}
|
}
|
||||||
catch(const std::bad_alloc &)
|
catch(const std::bad_alloc &)
|
||||||
{
|
{
|
||||||
log << log1 << "Compress: can't allocate memory" << logend;
|
log << log1 << "Compress: can't allocate memory" << logend;
|
||||||
|
|
||||||
buffer = 0;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,39 +68,92 @@ return true;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Compress::InitRawDeflate()
|
||||||
|
{
|
||||||
|
raw_deflate_inited = false;
|
||||||
|
|
||||||
|
strm_raw_deflate.next_in = 0;
|
||||||
|
strm_raw_deflate.zalloc = Z_NULL;
|
||||||
|
strm_raw_deflate.zfree = Z_NULL;
|
||||||
|
strm_raw_deflate.opaque = Z_NULL;
|
||||||
|
|
||||||
|
int ret = deflateInit2(&strm_raw_deflate, compress_level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
|
||||||
|
if( ret != Z_OK )
|
||||||
|
log << log1 << "Compress: problem with deflateInit2() for raw deflate" << logend;
|
||||||
|
else
|
||||||
|
raw_deflate_inited = true;
|
||||||
|
|
||||||
|
return ret == Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Compress::InitDeflate()
|
||||||
|
{
|
||||||
|
deflate_inited = false;
|
||||||
|
|
||||||
|
strm_deflate.next_in = 0;
|
||||||
|
strm_deflate.zalloc = Z_NULL;
|
||||||
|
strm_deflate.zfree = Z_NULL;
|
||||||
|
strm_deflate.opaque = Z_NULL;
|
||||||
|
|
||||||
|
int ret = deflateInit2(&strm_deflate, compress_level, Z_DEFLATED, 15, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
|
||||||
|
if( ret != Z_OK )
|
||||||
|
log << log1 << "Compress: problem with deflateInit2() for deflate" << logend;
|
||||||
|
else
|
||||||
|
deflate_inited = true;
|
||||||
|
|
||||||
|
return ret == Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Compress::InitGzip()
|
||||||
|
{
|
||||||
|
gzip_inited = false;
|
||||||
|
|
||||||
|
strm_gzip.next_in = 0;
|
||||||
|
strm_gzip.zalloc = Z_NULL;
|
||||||
|
strm_gzip.zfree = Z_NULL;
|
||||||
|
strm_gzip.opaque = Z_NULL;
|
||||||
|
|
||||||
|
int ret = deflateInit2(&strm_gzip, compress_level, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
|
||||||
|
if( ret != Z_OK )
|
||||||
|
log << log1 << "Compress: problem with deflateInit2() for gzip" << logend;
|
||||||
|
else
|
||||||
|
gzip_inited = true;
|
||||||
|
|
||||||
|
return ret == Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
return:
|
return:
|
||||||
0 - ok;
|
0 - ok
|
||||||
1 - can't allocate memory
|
1 - can't allocate memory
|
||||||
100 - unknown
|
100 - unknown error
|
||||||
*/
|
*/
|
||||||
int Compress::Init(int compress_level)
|
int Compress::Init(int compress_level_)
|
||||||
{
|
{
|
||||||
if( buffer == 0 )
|
compress_level = compress_level_;
|
||||||
if( !AllocateMemory() )
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
strm.zalloc = Z_NULL;
|
|
||||||
strm.zfree = Z_NULL;
|
|
||||||
strm.opaque = Z_NULL;
|
|
||||||
int ret = deflateInit(&strm, compress_level);
|
|
||||||
|
|
||||||
if( ret != Z_OK )
|
|
||||||
log << log1 << "Compress: problem with deflateInit()" << logend;
|
|
||||||
|
|
||||||
if( ret == Z_MEM_ERROR )
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if( ret != Z_OK )
|
|
||||||
return 100;
|
|
||||||
|
|
||||||
ready_for_compress = true;
|
if( !AllocateMemory() )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if( InitRawDeflate() && InitDeflate() && InitGzip() )
|
||||||
|
ready_for_compress = true;
|
||||||
|
else
|
||||||
|
return 100;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Compress::MakeCompress(const char * source, size_t source_len, FCGX_Stream * out_stream)
|
|
||||||
|
int Compress::MakeCompress(z_stream & strm, const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding)
|
||||||
{
|
{
|
||||||
int ret, flush;
|
int ret, flush;
|
||||||
size_t have;
|
size_t have;
|
||||||
@@ -98,7 +169,69 @@ size_t have;
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
strm.avail_out = buffer_max_len;
|
strm.avail_out = buffer_max_len;
|
||||||
strm.next_out = (Bytef*)buffer;
|
strm.next_out = (Bytef*)buffer_out;
|
||||||
|
ret = deflate(&strm, flush);
|
||||||
|
|
||||||
|
if( ret == Z_STREAM_ERROR || ret == Z_BUF_ERROR )
|
||||||
|
{
|
||||||
|
log << log1 << "Compress: problem with deflate()" << logend;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
have = buffer_max_len - strm.avail_out;
|
||||||
|
last_out_size += have;
|
||||||
|
FCGX_PutStr(buffer_out, have, out_stream);
|
||||||
|
}
|
||||||
|
while( strm.avail_out == 0 );
|
||||||
|
|
||||||
|
if( strm.avail_in != 0 )
|
||||||
|
{
|
||||||
|
log << log1 << "Compress: problem with deflate() - not all input is used" << logend;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while( flush != Z_FINISH );
|
||||||
|
|
||||||
|
|
||||||
|
if( ret != Z_STREAM_END )
|
||||||
|
{
|
||||||
|
log << log1 << "Compress: problem with deflate() - stream not complete" << logend;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Compress::CopyToInputBuffer(BinaryPage::const_iterator & i, size_t len)
|
||||||
|
{
|
||||||
|
for(size_t a=0 ; a<len ; ++a, ++i)
|
||||||
|
buffer_in[a] = *i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// new way
|
||||||
|
int Compress::MakeCompress(z_stream & strm, const BinaryPage & page, BinaryPage & out, int encoding)
|
||||||
|
{
|
||||||
|
int ret, flush;
|
||||||
|
size_t have;
|
||||||
|
BinaryPage::const_iterator i = page.begin();
|
||||||
|
|
||||||
|
size_t source_len = page.size();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
strm.avail_in = (source_len > buffer_max_len) ? buffer_max_len : source_len;
|
||||||
|
source_len -= strm.avail_in;
|
||||||
|
flush = (source_len == 0) ? Z_FINISH : Z_NO_FLUSH;
|
||||||
|
strm.next_in = (Bytef*)buffer_in;
|
||||||
|
CopyToInputBuffer(i, strm.avail_in);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
strm.avail_out = buffer_max_len;
|
||||||
|
strm.next_out = (Bytef*)buffer_out;
|
||||||
ret = deflate(&strm, flush);
|
ret = deflate(&strm, flush);
|
||||||
|
|
||||||
if( ret == Z_STREAM_ERROR || ret == Z_BUF_ERROR )
|
if( ret == Z_STREAM_ERROR || ret == Z_BUF_ERROR )
|
||||||
@@ -109,7 +242,7 @@ size_t have;
|
|||||||
|
|
||||||
have = buffer_max_len - strm.avail_out;
|
have = buffer_max_len - strm.avail_out;
|
||||||
last_out_size += have;
|
last_out_size += have;
|
||||||
FCGX_PutStr(buffer, have, out_stream);
|
out.write(buffer_out, have);
|
||||||
}
|
}
|
||||||
while( strm.avail_out == 0 );
|
while( strm.avail_out == 0 );
|
||||||
|
|
||||||
@@ -133,6 +266,62 @@ return 0;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
z_stream * Compress::SelectStream(int encoding)
|
||||||
|
{
|
||||||
|
z_stream * pstrm;
|
||||||
|
|
||||||
|
if( encoding == 0 )
|
||||||
|
pstrm = &strm_raw_deflate;
|
||||||
|
else
|
||||||
|
if( encoding == 1 )
|
||||||
|
pstrm = &strm_deflate;
|
||||||
|
else
|
||||||
|
pstrm = &strm_gzip;
|
||||||
|
|
||||||
|
return pstrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Compress::ResetStream(z_stream * pstrm, int encoding)
|
||||||
|
{
|
||||||
|
if( deflateReset(pstrm) != Z_OK )
|
||||||
|
{
|
||||||
|
log << log1 << "Compress: problem with deflateReset()" << logend;
|
||||||
|
|
||||||
|
deflateEnd(pstrm);
|
||||||
|
|
||||||
|
if( encoding == 0 )
|
||||||
|
InitRawDeflate();
|
||||||
|
else
|
||||||
|
if( encoding == 1 )
|
||||||
|
InitDeflate();
|
||||||
|
else
|
||||||
|
InitGzip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Compress::PutLog(size_t source_len, int encoding)
|
||||||
|
{
|
||||||
|
double ratio = 100.0 - (double(last_out_size) / double(source_len) * 100.0);
|
||||||
|
char buffer[30];
|
||||||
|
sprintf(buffer, "%.1f", ratio);
|
||||||
|
|
||||||
|
log << log2 << "Compress: ";
|
||||||
|
|
||||||
|
if( encoding == 0 )
|
||||||
|
log << "raw deflate";
|
||||||
|
else
|
||||||
|
if( encoding == 1 )
|
||||||
|
log << "deflate";
|
||||||
|
else
|
||||||
|
log << "gzip";
|
||||||
|
|
||||||
|
log << ", original size: " << source_len << ", size after compressing: "
|
||||||
|
<< (int)last_out_size << ", ratio: " << buffer << "%" << logend;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
return:
|
return:
|
||||||
@@ -142,10 +331,11 @@ return 0;
|
|||||||
3 - not inited (use Init() first)
|
3 - not inited (use Init() first)
|
||||||
100 - unknown
|
100 - unknown
|
||||||
*/
|
*/
|
||||||
int Compress::CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int level)
|
int Compress::CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
z_stream * pstrm;
|
||||||
|
|
||||||
last_out_size = 0;
|
last_out_size = 0;
|
||||||
|
|
||||||
if( !ready_for_compress )
|
if( !ready_for_compress )
|
||||||
@@ -156,20 +346,47 @@ int ret;
|
|||||||
|
|
||||||
if( source_len == 0 )
|
if( source_len == 0 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = MakeCompress(source, source_len, out_stream);
|
|
||||||
|
|
||||||
if( deflateReset(&strm) != Z_OK )
|
|
||||||
log << log1 << "Compress: problem with deflateReset()" << logend;
|
|
||||||
|
|
||||||
double ratio = 100.0 - (double(last_out_size) / double(source_len) * 100.0);
|
pstrm = SelectStream(encoding);
|
||||||
char buffer[30];
|
ret = MakeCompress(*pstrm, source, source_len, out_stream, encoding);
|
||||||
sprintf(buffer, "%.1f", ratio);
|
ResetStream(pstrm, encoding);
|
||||||
|
PutLog(source_len, encoding);
|
||||||
log << log2 << "Compress: original size: " << source_len << ", compress size: " << (int)last_out_size << ", ratio: " << buffer << "%" << logend;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
return:
|
||||||
|
0 - ok;
|
||||||
|
1 - can't allocate memory
|
||||||
|
2 - error during compressing
|
||||||
|
3 - not inited (use Init() first)
|
||||||
|
100 - unknown
|
||||||
|
*/
|
||||||
|
int Compress::Compressing(const BinaryPage & in, BinaryPage & out, int encoding)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
z_stream * pstrm;
|
||||||
|
|
||||||
|
last_out_size = 0;
|
||||||
|
out.clear();
|
||||||
|
|
||||||
|
if( !ready_for_compress )
|
||||||
|
{
|
||||||
|
log << log1 << "Compress: not ready yet" << logend;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( in.empty() )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
pstrm = SelectStream(encoding);
|
||||||
|
ret = MakeCompress(*pstrm, in, out, encoding);
|
||||||
|
ResetStream(pstrm, encoding);
|
||||||
|
PutLog(in.size(), encoding);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,19 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorecompress
|
#ifndef headerfile_winix_core_compress
|
||||||
#define headerfilecmslucorecompress
|
#define headerfile_winix_core_compress
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <fcgiapp.h>
|
#include <fcgiapp.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
#include "requesttypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Compress
|
class Compress
|
||||||
@@ -23,18 +25,43 @@ public:
|
|||||||
Compress();
|
Compress();
|
||||||
~Compress();
|
~Compress();
|
||||||
|
|
||||||
int Init(int compress_level = 6);
|
int Init(int compress_level_ = 6);
|
||||||
int CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int level = 6);
|
|
||||||
size_t last_out_size;
|
/*
|
||||||
|
encoding:
|
||||||
|
0 - raw deflate data with no zlib header or trailer, and will not compute an adler32 check value
|
||||||
|
(for Internet Explorer)
|
||||||
|
1 - deflate
|
||||||
|
2 - gzip
|
||||||
|
*/
|
||||||
|
int CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding = 2);
|
||||||
|
int Compressing(const BinaryPage & in, BinaryPage & out, int encoding = 2);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool AllocateMemory();
|
bool AllocateMemory();
|
||||||
int MakeCompress(const char * source, size_t source_len, FCGX_Stream * out_stream);
|
bool InitRawDeflate();
|
||||||
|
bool InitDeflate();
|
||||||
|
bool InitGzip();
|
||||||
|
|
||||||
|
int MakeCompress(z_stream & strm, const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding);
|
||||||
|
int MakeCompress(z_stream & strm, const BinaryPage & page, BinaryPage & out, int encoding);
|
||||||
|
z_stream * SelectStream(int encoding);
|
||||||
|
void ResetStream(z_stream * pstrm, int encoding);
|
||||||
|
void PutLog(size_t source_len, int encoding);
|
||||||
|
void CopyToInputBuffer(BinaryPage::const_iterator & i, size_t len);
|
||||||
|
|
||||||
|
int compress_level;
|
||||||
size_t buffer_max_len;
|
size_t buffer_max_len;
|
||||||
char * buffer;
|
|
||||||
z_stream strm;
|
// size of the last compressed page
|
||||||
|
size_t last_out_size;
|
||||||
|
|
||||||
|
char * buffer_in;
|
||||||
|
char * buffer_out;
|
||||||
|
z_stream strm_raw_deflate, strm_deflate, strm_gzip;
|
||||||
|
bool raw_deflate_inited, deflate_inited, gzip_inited;
|
||||||
bool ready_for_compress;
|
bool ready_for_compress;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
536
core/config.cpp
536
core/config.cpp
@@ -2,25 +2,21 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2013, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "data.h"
|
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "crypt.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Config::Config()
|
Config::Config()
|
||||||
{
|
{
|
||||||
default_str.clear();
|
|
||||||
default_int = 0;
|
|
||||||
default_bool = false;
|
|
||||||
|
|
||||||
errors_to_stdout = true;
|
errors_to_stdout = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,24 +29,28 @@ Config::Config()
|
|||||||
void Config::ShowError()
|
void Config::ShowError()
|
||||||
{
|
{
|
||||||
|
|
||||||
switch( conf_parser.status )
|
switch( parser.status )
|
||||||
{
|
{
|
||||||
case ConfParser::ok:
|
case PT::SpaceParser::no_space:
|
||||||
|
log << log2 << "Config: space not set" << logend;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT::SpaceParser::ok:
|
||||||
log << log2 << "Config: syntax ok" << logend;
|
log << log2 << "Config: syntax ok" << logend;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ConfParser::cant_open_file:
|
case PT::SpaceParser::cant_open_file:
|
||||||
if( errors_to_stdout )
|
if( errors_to_stdout )
|
||||||
std::cout << "Config: cant open a config file: " << data.config_file << std::endl;
|
std::cout << "Config: cant open a config file: " << config_file << std::endl;
|
||||||
|
|
||||||
log << log1 << "Config: cant open a config file: " << data.config_file << logend;
|
log << log1 << "Config: cant open a config file: " << config_file << logend;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ConfParser::syntax_error:
|
case PT::SpaceParser::syntax_error:
|
||||||
if( errors_to_stdout )
|
if( errors_to_stdout )
|
||||||
std::cout << "Config: syntax error, line: " << conf_parser.line << std::endl;
|
std::cout << "Config: syntax error, line: " << parser.line << std::endl;
|
||||||
|
|
||||||
log << log1 << "Config: syntax error, line: " << conf_parser.line << logend;
|
log << log1 << "Config: syntax error, line: " << parser.line << logend;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,11 +60,11 @@ void Config::ShowError()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Config::ReadConfig(bool errors_to_stdout_)
|
bool Config::ReadConfig(bool errors_to_stdout_, bool stdout_is_closed)
|
||||||
{
|
{
|
||||||
errors_to_stdout = errors_to_stdout_;
|
errors_to_stdout = errors_to_stdout_;
|
||||||
|
|
||||||
if( data.config_file.empty() )
|
if( config_file.empty() )
|
||||||
{
|
{
|
||||||
log << log2 << "Config: name of the config file is empty" << logend;
|
log << log2 << "Config: name of the config file is empty" << logend;
|
||||||
return false;
|
return false;
|
||||||
@@ -72,14 +72,16 @@ bool Config::ReadConfig(bool errors_to_stdout_)
|
|||||||
|
|
||||||
log << log2 << "Config: reading a config file" << logend;
|
log << log2 << "Config: reading a config file" << logend;
|
||||||
|
|
||||||
ConfParser::Status status = conf_parser.Parse( data.config_file.c_str() );
|
parser.SplitSingle(true);
|
||||||
|
parser.UTF8(true); // config is always read in UTF-8
|
||||||
|
parser.SetSpace(space);
|
||||||
|
|
||||||
|
PT::SpaceParser::Status status = parser.Parse(config_file);
|
||||||
|
|
||||||
if( status == ConfParser::ok )
|
if( status == PT::SpaceParser::ok )
|
||||||
{
|
{
|
||||||
AssignValues();
|
AssignValues(stdout_is_closed);
|
||||||
|
SetAdditionalVariables();
|
||||||
data.SetAdditionalVariables();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -92,193 +94,353 @@ bool Config::ReadConfig(bool errors_to_stdout_)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Config::AssignValues()
|
void Config::AssignValues(bool stdout_is_closed)
|
||||||
{
|
{
|
||||||
data.log_file = Text("log_file");
|
demonize = Bool(L"demonize", true);
|
||||||
data.log_notify_file = Text("log_notify_file");
|
|
||||||
data.fcgi_socket = Text("fcgi_socket");
|
user = AText(L"user");
|
||||||
data.fcgi_socket_chmod = Int("fcgi_socket_chmod", 0770);
|
group = AText(L"group");
|
||||||
data.fcgi_socket_user = Text("fcgi_socket_user");
|
additional_groups = Bool(L"additional_groups", true);
|
||||||
data.fcgi_socket_group = Text("fcgi_socket_group");
|
|
||||||
data.log_level = Int("log_level", 1);
|
log_file = AText(L"log_file");
|
||||||
data.log_request = Int("log_request", 1);
|
log_notify_file = AText(L"log_notify_file");
|
||||||
|
log_delimiter = Text(L"log_delimiter", L"---------------------------------------------------------------------------------");
|
||||||
|
fcgi_socket = AText(L"fcgi_socket");
|
||||||
|
fcgi_socket_chmod = Int(L"fcgi_socket_chmod", 0770);
|
||||||
|
fcgi_socket_user = AText(L"fcgi_socket_user");
|
||||||
|
fcgi_socket_group = AText(L"fcgi_socket_group");
|
||||||
|
log_level = Int(L"log_level", 1);
|
||||||
|
log_request = Int(L"log_request", 1);
|
||||||
|
log_save_each_line = Bool(L"log_save_each_line", false);
|
||||||
|
log_time_zone_id = Size(L"log_time_zone_id", 34);
|
||||||
|
log_server_answer = Bool(L"log_server_answer", false);
|
||||||
|
log_stdout = Bool(L"log_stdout", false);
|
||||||
|
log_db_query = Bool(L"log_db_query", false);
|
||||||
|
log_plugin_call = Bool(L"log_plugin_call", false);
|
||||||
|
log_post_value_size = Size(L"log_post_value_size", 80);
|
||||||
|
|
||||||
|
post_file_max = Size(L"post_file_max", 8388608); // 8 MB
|
||||||
|
|
||||||
|
upload_dir = Text(L"upload_dir");
|
||||||
|
common_dir = Text(L"common_dir");
|
||||||
|
NoLastSlash(upload_dir);
|
||||||
|
NoLastSlash(common_dir);
|
||||||
|
|
||||||
|
upload_dirs_chmod = Int(L"upload_dirs_chmod", 0750);
|
||||||
|
upload_files_chmod = Int(L"upload_files_chmod", 0640);
|
||||||
|
ListText(L"static_dirs", static_dirs);
|
||||||
|
dont_use_static_dirs = Bool(L"dont_use_static_dirs", false);
|
||||||
|
create_thumb = Bool(L"create_thumb", true);
|
||||||
|
thumb_mode = Int(L"thumb_mode", 2);
|
||||||
|
thumb_cx = Size(L"thumb_cx", 150);
|
||||||
|
thumb_cy = Size(L"thumb_cy", 150);
|
||||||
|
thumb_quality = Int(L"thumb_quality", 92);
|
||||||
|
image_resize = Bool(L"image_resize", true);
|
||||||
|
image_mode = Int(L"image_mode", 6);
|
||||||
|
image_cx = Size(L"image_cx", 1000);
|
||||||
|
image_cy = Size(L"image_cy", 800);
|
||||||
|
image_quality = Int(L"image_quality", 92);
|
||||||
|
convert_cmd = Text(L"convert_cmd", L"/usr/local/bin/convert");
|
||||||
|
|
||||||
|
templates_dir = Text(L"templates_dir");
|
||||||
|
templates_dir_default = Text(L"templates_dir_default");
|
||||||
|
txt_templates_dir = Text(L"txt_templates_dir");
|
||||||
|
txt_templates_dir_default = Text(L"txt_templates_dir_default");
|
||||||
|
templates_fun_prefix = Text(L"templates_fun_prefix", L"fun_");
|
||||||
|
templates_fun_postfix = Text(L"templates_fun_postfix", L".html");
|
||||||
|
templates_index = Text(L"templates_index", L"index.html");
|
||||||
|
template_only_root_use_template_fun = Bool(L"template_only_root_use_template_fun", false);
|
||||||
|
|
||||||
|
http_session_id_name = AText(L"http_session_id_name");
|
||||||
|
db_database = AText(L"db_database");
|
||||||
|
db_user = AText(L"db_user");
|
||||||
|
db_pass = AText(L"db_pass");
|
||||||
|
item_url_empty = Text(L"item_url_empty");
|
||||||
|
|
||||||
|
url_proto = Text(L"url_proto", L"http://");
|
||||||
|
url_ssl_proto = Text(L"url_ssl_proto", L"https://");
|
||||||
|
|
||||||
|
use_ssl = Bool(L"use_ssl", false);
|
||||||
|
use_ssl_static = Bool(L"use_ssl_static", false);
|
||||||
|
use_ssl_common = Bool(L"use_ssl_common", false);
|
||||||
|
use_ssl_only_for_logged_users = Bool(L"use_ssl_only_for_logged_users", true);
|
||||||
|
use_ssl_redirect_code = Int(L"use_ssl_redirect_code", 303);
|
||||||
|
|
||||||
|
base_url = Text(L"base_url");
|
||||||
|
base_url_static = Text(L"base_url_static");
|
||||||
|
base_url_common = Text(L"base_url_common");
|
||||||
|
|
||||||
|
base_url_redirect = Bool(L"base_url_redirect", false);
|
||||||
|
base_url_redirect_code = Int(L"base_url_redirect_code", 301);
|
||||||
|
|
||||||
|
NoLastSlash(base_url);
|
||||||
|
NoLastSlash(base_url_static);
|
||||||
|
NoLastSlash(base_url_common);
|
||||||
|
|
||||||
|
priv_no_user = Text(L"priv_no_user", L"-- no user --");
|
||||||
|
priv_no_group = Text(L"priv_no_group", L"-- no group --");
|
||||||
|
|
||||||
if( !data.stdout_is_closed )
|
session_max_idle = Int(L"session_max_idle", 10800); // 3h
|
||||||
data.log_stdout = Bool("log_stdout", false);
|
session_remember_max_idle = Int(L"session_remember_max_idle", 16070400); // 3 months
|
||||||
|
session_file = AText(L"session_file");
|
||||||
|
session_max = Size(L"session_max", 1000000);
|
||||||
|
|
||||||
|
compression = Bool(L"compression", true);
|
||||||
|
compression_page_min_size = Size(L"compression_page_min_size", 512);
|
||||||
|
compression_encoding = Int(L"compression_encoding", 20);
|
||||||
|
|
||||||
|
html_filter = Bool(L"html_filter", true);
|
||||||
|
html_filter_trim_white = Bool(L"html_filter_trim_white", true);
|
||||||
|
html_filter_break_word = Int(L"html_filter_break_word", 60);
|
||||||
|
html_filter_wrap_line = Int(L"html_filter_wrap_line", 110);
|
||||||
|
html_filter_tabs = Size(L"html_filter_tabs", 2);
|
||||||
|
html_filter_orphans = Bool(L"html_filter_orphans", true);
|
||||||
|
html_filter_orphans_mode_str = Text(L"html_filter_orphans_mode_str", L"nbsp");
|
||||||
|
|
||||||
|
locale_dir = Text(L"locale_dir");
|
||||||
|
locale_dir_default = Text(L"locale_dir_default");
|
||||||
|
locale_max_id = Size(L"locale_max_id", 100);
|
||||||
|
locale_default_id = Size(L"locale_default_id", 0);
|
||||||
|
ListText(L"locale_files", locale_files);
|
||||||
|
|
||||||
|
title_separator = Text(L"title_separator", L" / ");
|
||||||
|
|
||||||
|
http_header_send_file = Text(L"http_header_send_file", L"X-LIGHTTPD-send-file");
|
||||||
|
debug_info = Bool(L"debug_info", false);
|
||||||
|
|
||||||
|
editors_html_safe_mode = Bool(L"editors_html_safe_mode", true);
|
||||||
|
editors_html_safe_mode_skip_root = Bool(L"editors_html_safe_mode_skip_root", true);
|
||||||
|
|
||||||
|
plugins_dir = Text(L"plugins_dir", L"/usr/local/winix/plugins");
|
||||||
|
NoLastSlash(plugins_dir);
|
||||||
|
ListText(L"plugins", plugin_file);
|
||||||
|
|
||||||
|
utf8 = Bool(L"utf8", true);
|
||||||
|
symlinks_follow_max = Size(L"symlinks_follow_max", 20);
|
||||||
|
|
||||||
|
ticket_form_prefix = Text(L"ticket_form_prefix", L"ticketparam");
|
||||||
|
|
||||||
|
pass_min_size = Size(L"pass_min_size", 5);
|
||||||
|
pass_type = Int(L"pass_type", 12);
|
||||||
|
pass_hash_use_salt = Bool(L"pass_hash_use_salt", false);
|
||||||
|
pass_hash_salt = Text(L"pass_hash_salt");
|
||||||
|
pass_use_rsa = Bool(L"pass_use_rsa", false);
|
||||||
|
pass_rsa_private_key = Text(L"pass_rsa_private_key");
|
||||||
|
|
||||||
|
opensll_path = Text(L"opensll_path", L"/usr/bin/openssl");
|
||||||
|
|
||||||
|
pattern_cacher_when_delete = Size(L"pattern_cacher_when_delete", 130);
|
||||||
|
pattern_cacher_how_many_delete = Size(L"pattern_cacher_how_many_delete", 30);
|
||||||
|
|
||||||
|
content_type_header = Int(L"content_type_header", 0);
|
||||||
|
umask = Int(L"umask", 0222);
|
||||||
|
|
||||||
|
ezc_max_elements = Size(L"ezc_max_elements", 50000);
|
||||||
|
ezc_max_loop_elements = Size(L"ezc_max_loop_elements", 5000);
|
||||||
|
|
||||||
|
account_need_email_verification = Bool(L"account_need_email_verification", true);
|
||||||
|
reset_password_code_expiration_time = Long(L"reset_password_code_expiration_time", 86400);
|
||||||
|
|
||||||
|
time_zone_default_id = Size(L"time_zone_default_id", 34);
|
||||||
|
time_zone_max_id = Size(L"time_zone_max_id", 130);
|
||||||
|
|
||||||
|
etc_dir = Text(L"etc_dir", L"");
|
||||||
|
time_zones_file = Text(L"time_zones_file", L"time_zones.conf");
|
||||||
|
|
||||||
|
use_ban_list = Bool(L"use_ban_list", true);
|
||||||
|
ban_list_soft_max_size = Size(L"ban_list_soft_max_size", 50000);
|
||||||
|
ban_list_max_size = Size(L"ban_list_max_size", 51000);
|
||||||
|
ban_level_1_delay = Size(L"ban_level_1_delay", 1800);
|
||||||
|
ban_level_2_delay = Size(L"ban_level_2_delay", 86400);
|
||||||
|
ban_level_3_delay = Size(L"ban_level_3_delay", 604800);
|
||||||
|
|
||||||
|
incorrect_login_min_time_between_get_post = Size(L"incorrect_login_min_time_between_get_post", 2);
|
||||||
|
incorrect_login_captcha_treshold = Size(L"incorrect_login_captcha_treshold", 3);
|
||||||
|
incorrect_login_cannot_login_mode = Int(L"incorrect_login_cannot_login_mode", 0);
|
||||||
|
incorrect_login_cannot_login_treshold = Size(L"incorrect_login_cannot_login_treshold", 20);
|
||||||
|
incorrect_login_cannot_login_delay = Size(L"incorrect_login_cannot_login_delay", 1800);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Config::SetAdditionalVariables()
|
||||||
|
{
|
||||||
|
if( html_filter_orphans_mode_str == L"160" )
|
||||||
|
html_filter_orphans_mode = HTMLFilter::orphan_160space;
|
||||||
else
|
else
|
||||||
data.log_stdout = false;
|
html_filter_orphans_mode = HTMLFilter::orphan_nbsp;
|
||||||
|
|
||||||
data.post_file_max = Int("post_file_max", 8388608); // 8 MB
|
|
||||||
data.auth_simplefs_dir = Text("auth_simplefs_dir");
|
|
||||||
data.auth_hashfs_dir = Text("auth_hashfs_dir");
|
|
||||||
data.auth_tmp_dir = Text("auth_tmp_dir");
|
|
||||||
|
|
||||||
data.templates_dir = Text("templates_dir");
|
for(size_t i=0 ; i<static_dirs.size() ; ++i)
|
||||||
data.templates_dir_default = Text("templates_dir_default");
|
NoLastSlash(static_dirs[i]);
|
||||||
data.http_session_id_name = Text("http_session_id_name");
|
|
||||||
data.db_database = Text("db_database");
|
|
||||||
data.db_user = Text("db_user");
|
|
||||||
data.db_pass = Text("db_pass");
|
|
||||||
data.item_url_empty = Text("item_url_empty");
|
|
||||||
|
|
||||||
data.base_server = Text("base_server");
|
CheckPasswd();
|
||||||
data.base_url = Text("base_url");
|
|
||||||
data.base_url_auth = Text("base_url_auth");
|
|
||||||
data.base_url_static = Text("base_url_static");
|
|
||||||
data.base_url_common = Text("base_url_common");
|
|
||||||
|
|
||||||
NoLastSlash(data.base_server);
|
if( content_type_header < 0 || content_type_header > 2 )
|
||||||
NoLastSlash(data.base_url);
|
content_type_header = 0;
|
||||||
NoLastSlash(data.base_url_auth);
|
|
||||||
NoLastSlash(data.base_url_static);
|
|
||||||
NoLastSlash(data.base_url_common);
|
|
||||||
|
|
||||||
data.priv_no_user = Text("priv_no_user", "-- no user --");
|
if( locale_default_id > locale_max_id )
|
||||||
data.priv_no_group = Text("priv_no_group", "-- no group --");
|
locale_default_id = locale_max_id;
|
||||||
|
|
||||||
data.session_max_idle = Int("session_max_idle", 10800); // 3h
|
|
||||||
data.session_remember_max_idle = Int("session_remember_max_idle", 16070400); // 3 months
|
|
||||||
data.session_file = Text("session_file");
|
|
||||||
|
|
||||||
data.compression = Bool("compression", true);
|
|
||||||
|
|
||||||
std::string p = Text("plugin");
|
|
||||||
data.plugin_file.push_back(p);
|
|
||||||
|
|
||||||
data.html_filter = Bool("html_filter", true);
|
|
||||||
|
|
||||||
data.locale_str = Text("locale", "en");
|
|
||||||
data.locale_dir = Text("locale_dir");
|
|
||||||
data.locale_dir_default = Text("locale_dir_default");
|
|
||||||
|
|
||||||
data.title_separator = Text("title_separator", " / ");
|
|
||||||
|
|
||||||
|
if( locale_files.empty() )
|
||||||
|
locale_files.push_back(L"en");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string Config::Text(const char * name)
|
|
||||||
|
void Config::CheckPasswd()
|
||||||
{
|
{
|
||||||
return Text(std::string(name), default_str);
|
switch(pass_type)
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string Config::Text(const char * name, const char * def)
|
|
||||||
{
|
|
||||||
return Text(std::string(name), std::string(def));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::string Config::Text(const std::string & name, const std::string & def)
|
|
||||||
{
|
|
||||||
ConfParser::Table::iterator i = conf_parser.table.find(name);
|
|
||||||
|
|
||||||
if( i == conf_parser.table.end() )
|
|
||||||
return def;
|
|
||||||
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int Config::Int(const char * name)
|
|
||||||
{
|
|
||||||
return Int(std::string(name), default_int);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int Config::Int(const char * name, int def)
|
|
||||||
{
|
|
||||||
return Int(std::string(name), def);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int Config::Int(const std::string & name, int def)
|
|
||||||
{
|
|
||||||
ConfParser::Table::iterator i = conf_parser.table.find(name);
|
|
||||||
|
|
||||||
if( i == conf_parser.table.end() || i->second.empty() )
|
|
||||||
return def;
|
|
||||||
|
|
||||||
long res = (i->second[0] == '0')? strtol(i->second.c_str() + 1, 0, 8) : strtol(i->second.c_str(), 0, 10);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Config::Bool(const char * name)
|
|
||||||
{
|
|
||||||
return Bool(std::string(name), default_bool);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Config::Bool(const char * name, bool def)
|
|
||||||
{
|
|
||||||
return Bool(std::string(name), def);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Config::Bool(const std::string & name, bool def)
|
|
||||||
{
|
|
||||||
ConfParser::Table::iterator i = conf_parser.table.find(name);
|
|
||||||
|
|
||||||
if( i == conf_parser.table.end() || i->second.empty() )
|
|
||||||
return def;
|
|
||||||
|
|
||||||
bool res = false;
|
|
||||||
|
|
||||||
if( EqualNoCase(i->second.c_str(), "true") ||
|
|
||||||
EqualNoCase(i->second.c_str(), "yes") ||
|
|
||||||
EqualNoCase(i->second.c_str(), "1")
|
|
||||||
)
|
|
||||||
res = true;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Config::NoLastSlash(std::string & s)
|
|
||||||
{
|
|
||||||
if( s.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
size_t i = s.size();
|
|
||||||
|
|
||||||
for( ; i>0 && s[i-1]=='/' ; --i);
|
|
||||||
|
|
||||||
if( i < s.size() )
|
|
||||||
s.erase(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Config::NoFirstHttp(std::string & s)
|
|
||||||
{
|
|
||||||
if( s.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
const char http[] = "http://";
|
|
||||||
const char https[] = "https://";
|
|
||||||
|
|
||||||
if( IsSubStringNoCase(http, s.c_str()) )
|
|
||||||
{
|
{
|
||||||
s.erase(0, sizeof(http)/sizeof(char));
|
case WINIX_CRYPT_HASH_NONE:
|
||||||
}
|
case WINIX_CRYPT_HASH_MD4:
|
||||||
else
|
case WINIX_CRYPT_HASH_MD5:
|
||||||
if( IsSubStringNoCase(https, s.c_str()) )
|
case WINIX_CRYPT_HASH_SHA1:
|
||||||
{
|
case WINIX_CRYPT_HASH_SHA224:
|
||||||
s.erase(0, sizeof(https)/sizeof(char));
|
case WINIX_CRYPT_HASH_SHA256:
|
||||||
|
case WINIX_CRYPT_HASH_SHA384:
|
||||||
|
case WINIX_CRYPT_HASH_SHA512:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
pass_type = WINIX_CRYPT_HASH_SHA256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::wstring & Config::Text(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.Text(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::wstring & Config::Text(const wchar_t * name, const wchar_t * def)
|
||||||
|
{
|
||||||
|
return space.Text(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::wstring & Config::Text(const std::wstring & name, const wchar_t * def)
|
||||||
|
{
|
||||||
|
return space.Text(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string & Config::AText(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.AText(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string & Config::AText(const wchar_t * name, const char * def)
|
||||||
|
{
|
||||||
|
return space.AText(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string & Config::AText(const std::wstring & name, const char * def)
|
||||||
|
{
|
||||||
|
return space.AText(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int Config::Int(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.Int(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Config::Int(const wchar_t * name, int def)
|
||||||
|
{
|
||||||
|
return space.Int(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Config::Int(const std::wstring & name, int def)
|
||||||
|
{
|
||||||
|
return space.Int(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
long Config::Long(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.Long(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
long Config::Long(const wchar_t * name, long def)
|
||||||
|
{
|
||||||
|
return space.Long(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
long Config::Long(const std::wstring & name, long def)
|
||||||
|
{
|
||||||
|
return space.Long(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t Config::Size(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.Size(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t Config::Size(const wchar_t * name, size_t def)
|
||||||
|
{
|
||||||
|
return space.Size(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t Config::Size(const std::wstring & name, size_t def)
|
||||||
|
{
|
||||||
|
return space.Size(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Config::Bool(const wchar_t * name)
|
||||||
|
{
|
||||||
|
return space.Bool(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Config::Bool(const wchar_t * name, bool def)
|
||||||
|
{
|
||||||
|
return space.Bool(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Config::Bool(const std::wstring & name, bool def)
|
||||||
|
{
|
||||||
|
return space.Bool(name, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Config::ListText(const wchar_t * name, std::vector<std::wstring> & list)
|
||||||
|
{
|
||||||
|
return space.ListText(name, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Config::ListText(const std::wstring & name, std::vector<std::wstring> & list)
|
||||||
|
{
|
||||||
|
return space.ListText(name, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Config::Print(std::wostream & out)
|
||||||
|
{
|
||||||
|
space.Serialize(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
640
core/config.h
640
core/config.h
@@ -2,59 +2,643 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2013, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreconfig
|
#ifndef headerfile_winix_core_config
|
||||||
#define headerfilecmslucoreconfig
|
#define headerfile_winix_core_config
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "space/spaceparser.h"
|
||||||
|
#include "htmlfilter.h"
|
||||||
|
|
||||||
|
|
||||||
#include "../confparser/confparser.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Config
|
class Config
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// name of the config file
|
||||||
|
// this is the parameter passed to winix programm
|
||||||
|
std::string config_file;
|
||||||
|
|
||||||
|
// start as a demon (in the background)
|
||||||
|
// default: true
|
||||||
|
bool demonize;
|
||||||
|
|
||||||
|
// system user name (to which drop privileges)
|
||||||
|
// used only if winix is started as the root
|
||||||
|
std::string user;
|
||||||
|
|
||||||
|
// system group name (to which drop privileges)
|
||||||
|
// used only if winix is started as the root
|
||||||
|
std::string group;
|
||||||
|
|
||||||
|
// setting additional effective groups from /etc/group
|
||||||
|
// by using initgroups()
|
||||||
|
// used only if winix is started as the root
|
||||||
|
// default: true
|
||||||
|
bool additional_groups;
|
||||||
|
|
||||||
|
// log file name, log file name for notifications (sending emails, etc)
|
||||||
|
std::string log_file, log_notify_file;
|
||||||
|
|
||||||
|
// 1 - minimum
|
||||||
|
// 2 - (default)
|
||||||
|
// 3 - maximum - all logs
|
||||||
|
int log_level;
|
||||||
|
|
||||||
|
// logging to stdout too
|
||||||
|
// only if demonize is 'false'
|
||||||
|
// default: false
|
||||||
|
bool log_stdout;
|
||||||
|
|
||||||
|
// how many requests should be saved in the same time
|
||||||
|
// default: 1
|
||||||
|
int log_request;
|
||||||
|
|
||||||
|
// whether to save each line of the config (use it for debug purposes)
|
||||||
|
// default: false
|
||||||
|
bool log_save_each_line;
|
||||||
|
|
||||||
|
// time zone identifier used in log messages
|
||||||
|
// this affects only the first line of logs (where there is IP address, request method etc)
|
||||||
|
// see time_zone_default_id below for more info
|
||||||
|
// default: 34 (Coordinated Universal Time UTC+00:00)
|
||||||
|
size_t log_time_zone_id;
|
||||||
|
|
||||||
|
// put to log what server is sending back to the client (html/json etc)
|
||||||
|
// default: false
|
||||||
|
bool log_server_answer;
|
||||||
|
|
||||||
|
// logging db queries
|
||||||
|
// default: false
|
||||||
|
bool log_db_query;
|
||||||
|
|
||||||
|
// logging when a plugin function is called
|
||||||
|
// default: false
|
||||||
|
bool log_plugin_call;
|
||||||
|
|
||||||
|
// how many characters in values should be logged from POST parameters
|
||||||
|
// default: 80
|
||||||
|
// set to 0 to turn off
|
||||||
|
size_t log_post_value_size;
|
||||||
|
|
||||||
|
// request delimiter in the log file, default "---------"
|
||||||
|
std::wstring log_delimiter;
|
||||||
|
|
||||||
|
// fast cgi: socket (unix domain)
|
||||||
|
std::string fcgi_socket;
|
||||||
|
|
||||||
|
// fast cgi: socket permissions
|
||||||
|
int fcgi_socket_chmod;
|
||||||
|
|
||||||
|
// fast cgi: owner of the socket
|
||||||
|
std::string fcgi_socket_user;
|
||||||
|
|
||||||
|
// fast cgi: group of the socket
|
||||||
|
std::string fcgi_socket_group;
|
||||||
|
|
||||||
|
std::wstring templates_dir;
|
||||||
|
std::wstring templates_dir_default; // html templates from winix
|
||||||
|
|
||||||
|
std::wstring txt_templates_dir;
|
||||||
|
std::wstring txt_templates_dir_default; // txt (notifications) templates from winix
|
||||||
|
|
||||||
|
// prefix and postfix for functions templates
|
||||||
|
// default:
|
||||||
|
// prefix: "fun_"
|
||||||
|
// postfix: ".html"
|
||||||
|
std::wstring templates_fun_prefix;
|
||||||
|
std::wstring templates_fun_postfix;
|
||||||
|
|
||||||
|
// main html template
|
||||||
|
// default: index.html
|
||||||
|
std::wstring templates_index;
|
||||||
|
|
||||||
|
// if true then only root can use 'template' function
|
||||||
|
// default: false
|
||||||
|
bool template_only_root_use_template_fun;
|
||||||
|
|
||||||
|
std::string db_database;
|
||||||
|
std::string db_user;
|
||||||
|
std::string db_pass;
|
||||||
|
|
||||||
|
std::string http_session_id_name;
|
||||||
|
|
||||||
|
// string used in a place where is a user (or group) selected
|
||||||
|
std::wstring priv_no_user;
|
||||||
|
std::wstring priv_no_group;
|
||||||
|
|
||||||
|
// time in seconds when the user will be automatically logged out (iddle time)
|
||||||
|
int session_max_idle;
|
||||||
|
|
||||||
|
// time in seconds when the user will be automatically logged out (when he selected 'remember me' option)
|
||||||
|
// this time is usually greater than session_max_idle
|
||||||
|
int session_remember_max_idle;
|
||||||
|
|
||||||
|
// this file is used when the program is starting and ending
|
||||||
|
std::string session_file;
|
||||||
|
|
||||||
|
// how many sessions can be (zero turn off this checking)
|
||||||
|
// default: 1000000 (one milion)
|
||||||
|
size_t session_max;
|
||||||
|
|
||||||
|
// allow the html output to be compressed
|
||||||
|
// default: true
|
||||||
|
bool compression;
|
||||||
|
|
||||||
|
// if the output is shorter than this value then it will not be compressed
|
||||||
|
// default: 512 bytes
|
||||||
|
size_t compression_page_min_size;
|
||||||
|
|
||||||
|
// 1 - use deflate if available (or raw deflate for Internet Explorer) or don't compress
|
||||||
|
// 2 - use gzip if available or don't compress
|
||||||
|
// 10 - prefer deflate -- use deflate (or raw deflate for IE) if both deflate and gzip are available
|
||||||
|
// 20 - prefer gzip -- use gzip if both deflate and gzip are available
|
||||||
|
// default: 20
|
||||||
|
int compression_encoding;
|
||||||
|
|
||||||
|
// plugins directory
|
||||||
|
// default: /usr/local/winix/plugins
|
||||||
|
std::wstring plugins_dir;
|
||||||
|
|
||||||
|
// plugins
|
||||||
|
// you can provide either a relative path (plugins_dir will be used)
|
||||||
|
// or a full path to a plugin
|
||||||
|
std::vector<std::wstring> plugin_file;
|
||||||
|
|
||||||
|
// should the html code be cleaned by the html filter
|
||||||
|
bool html_filter;
|
||||||
|
|
||||||
|
// should white characters be trimmed
|
||||||
|
bool html_filter_trim_white;
|
||||||
|
|
||||||
|
// when long words should be broken (a space will be inserted)
|
||||||
|
// default: after 60 non white characters will be put a space
|
||||||
|
// set zero to turn off
|
||||||
|
size_t html_filter_break_word;
|
||||||
|
|
||||||
|
// when long lines should be broken (a new line character will be inserted)
|
||||||
|
// default: 80
|
||||||
|
// set zero to turn off
|
||||||
|
size_t html_filter_wrap_line;
|
||||||
|
|
||||||
|
// how many spaces will be put at one tree level
|
||||||
|
// default: 2
|
||||||
|
size_t html_filter_tabs;
|
||||||
|
|
||||||
|
// use checking for 'orphans' for a specicic language
|
||||||
|
// default: true
|
||||||
|
bool html_filter_orphans;
|
||||||
|
|
||||||
|
// orphans mode
|
||||||
|
// either: "nbsp" or "160"
|
||||||
|
// default: "nbsp"
|
||||||
|
std::wstring html_filter_orphans_mode_str;
|
||||||
|
HTMLFilter::OrphanMode html_filter_orphans_mode;
|
||||||
|
|
||||||
|
// the url of a new empty item (if there is not the subject too)
|
||||||
|
std::wstring item_url_empty;
|
||||||
|
|
||||||
|
// maximum length of a file send by post multipart form
|
||||||
|
// 0 - not used
|
||||||
|
size_t post_file_max;
|
||||||
|
|
||||||
|
// directory for static files
|
||||||
|
std::wstring upload_dir;
|
||||||
|
|
||||||
|
// additional static directories *not* managed by winix
|
||||||
|
// you can refer to this directories by using 'static' mount point
|
||||||
|
// e.g.
|
||||||
|
// let we say in the config you have:
|
||||||
|
// static_dirs = ("/home/a", "/home/b", "/home/c")
|
||||||
|
// and in /etc/fstab (in winix) you have such a line:
|
||||||
|
// "static /my/dir simplefs static(2)"
|
||||||
|
// above line in /etc/fstab means that when a user enters http://domain.com/my/dir/file.txt
|
||||||
|
// then "file.txt" will be taken from "/home/c/file.txt"
|
||||||
|
// this is useful for some javascript files which are protected from running from other domains
|
||||||
|
std::vector<std::wstring> static_dirs;
|
||||||
|
|
||||||
|
// sometimes you can have trouble when you have set an incorrect static path in /etc/fstab
|
||||||
|
// in such a case set dont_use_static_dirs to true
|
||||||
|
// and winix will behave as there are not any static directories
|
||||||
|
// so you can correct your mistake and then set this value to false
|
||||||
|
bool dont_use_static_dirs;
|
||||||
|
|
||||||
|
// static common directory
|
||||||
|
// this is a place where there are some common javascripts, images, css files
|
||||||
|
// winix is allowed to read some files from there
|
||||||
|
// for example ckeditor config, vim config and so on
|
||||||
|
// winix read it as a ezc template and put it into database
|
||||||
|
// default: empty
|
||||||
|
std::wstring common_dir;
|
||||||
|
|
||||||
|
// chmod of newly created directories (under upload_dir)
|
||||||
|
// default: 0750
|
||||||
|
int upload_dirs_chmod;
|
||||||
|
|
||||||
|
// chmod of newly created files (under upload_dir)
|
||||||
|
// default: 0640
|
||||||
|
int upload_files_chmod;
|
||||||
|
|
||||||
|
// create a thumbnail from an image
|
||||||
|
// default: true
|
||||||
|
bool create_thumb;
|
||||||
|
|
||||||
|
// the mode of creating a thumbnail
|
||||||
|
// width means thumb_cx, height means thumb_cy
|
||||||
|
// 1: Width given, height automagically selected to preserve aspect ratio.
|
||||||
|
// 2: Height given, width automagically selected to preserve aspect ratio.
|
||||||
|
// 3: Maximum values of height and width given, aspect ratio preserved.
|
||||||
|
// 4: Minimum values of width and height given, aspect ratio preserved.
|
||||||
|
// 5: Width and height emphatically given, original aspect ratio ignored.
|
||||||
|
// 6: Change as per widthxheight (3) but only if an image dimension exceeds a specified dimension.
|
||||||
|
// 7: Change dimensions only if both image dimensions are less than specified dimensions.
|
||||||
|
// default: 2
|
||||||
|
int thumb_mode;
|
||||||
|
|
||||||
|
// width of thumbnails
|
||||||
|
// default: 150
|
||||||
|
size_t thumb_cx;
|
||||||
|
|
||||||
|
// height of thumbnails
|
||||||
|
// default: 150
|
||||||
|
size_t thumb_cy;
|
||||||
|
|
||||||
|
// quality of thumbnails
|
||||||
|
// from 0 (the worst) to 100 (the best)
|
||||||
|
// more info: http://www.imagemagick.org/script/command-line-options.php?ImageMagick=p4jtel7557hovd34ui3tgb54h6#quality
|
||||||
|
// default: 92
|
||||||
|
int thumb_quality;
|
||||||
|
|
||||||
|
// resizing images
|
||||||
|
// this not affects thumbnails
|
||||||
|
// default: true
|
||||||
|
bool image_resize;
|
||||||
|
|
||||||
|
// the mode of resizing an image
|
||||||
|
// the same as 'thumb_mode' above
|
||||||
|
// default: 6
|
||||||
|
int image_mode;
|
||||||
|
|
||||||
|
// width of images
|
||||||
|
// default: 1000
|
||||||
|
size_t image_cx;
|
||||||
|
|
||||||
|
// height of images
|
||||||
|
// default: 800
|
||||||
|
size_t image_cy;
|
||||||
|
|
||||||
|
// quality of an image (the same as in thumbnails)
|
||||||
|
// from 0 (the worst) to 100 (the best)
|
||||||
|
// default: 92
|
||||||
|
int image_quality;
|
||||||
|
|
||||||
|
// the convert program (ImageMagic) (for images and thumbnails)
|
||||||
|
// default: /usr/local/bin/convert
|
||||||
|
std::wstring convert_cmd;
|
||||||
|
|
||||||
|
// directory with locale files
|
||||||
|
std::wstring locale_dir;
|
||||||
|
|
||||||
|
// directory with default locale files (those from winix)
|
||||||
|
std::wstring locale_dir_default;
|
||||||
|
|
||||||
|
// locale files (e.g. "en", "pl")
|
||||||
|
// default: only one item: en
|
||||||
|
std::vector<std::wstring> locale_files;
|
||||||
|
|
||||||
|
// a maximum value of a locale identifier
|
||||||
|
// default: 100 (maximum: 1000)
|
||||||
|
// each locale files should have its own identifier (in "winix_locale_id" field)
|
||||||
|
// from zero to this value
|
||||||
|
size_t locale_max_id;
|
||||||
|
|
||||||
|
// locale for not logged users
|
||||||
|
// or for newly created accounts
|
||||||
|
// default: 0
|
||||||
|
size_t locale_default_id;
|
||||||
|
|
||||||
|
// url protocol
|
||||||
|
// default: http://
|
||||||
|
std::wstring url_proto;
|
||||||
|
|
||||||
|
// url protocol when using SSL
|
||||||
|
// default: https://
|
||||||
|
std::wstring url_ssl_proto;
|
||||||
|
|
||||||
|
// enables SSL
|
||||||
|
// it means this site should be accessed through SSL encrypted connection
|
||||||
|
// default: false
|
||||||
|
bool use_ssl;
|
||||||
|
|
||||||
|
// enables SSL for static content
|
||||||
|
// used mainly in templates, look at doc_base_url_static ezc function
|
||||||
|
// default: false
|
||||||
|
bool use_ssl_static;
|
||||||
|
|
||||||
|
// enables SSL for common content
|
||||||
|
// used mainly in templates, look at doc_base_url_common ezc function
|
||||||
|
// default: false
|
||||||
|
bool use_ssl_common;
|
||||||
|
|
||||||
|
// if SSL is enabled then if this is true the SSL will be used
|
||||||
|
// only for logged users
|
||||||
|
// default: true
|
||||||
|
bool use_ssl_only_for_logged_users;
|
||||||
|
|
||||||
|
// if current connection is without SSL and should be made through SSL
|
||||||
|
// or if is via SSL and should be done in plain text
|
||||||
|
// then we make a redirect
|
||||||
|
// default: 303
|
||||||
|
int use_ssl_redirect_code;
|
||||||
|
|
||||||
|
// when the HOST_HTTP environment variable is not equal to 'base_url'
|
||||||
|
// (the part 'http://' and the last slash is removed)
|
||||||
|
// the server will redirect into base_url + 'REQUEST_URI'
|
||||||
|
// it's useful when you want to redirect from 'mydomain.tld' into 'www.mydomain.tld' etc.
|
||||||
|
// set this option to false if you have multiple subdomains
|
||||||
|
// default: false
|
||||||
|
bool base_url_redirect;
|
||||||
|
|
||||||
|
// the HTTP code used during the base redirect
|
||||||
|
// default: 301
|
||||||
|
int base_url_redirect_code;
|
||||||
|
|
||||||
|
// the main address of the site (e.g. www.someserver.com)
|
||||||
|
// (without http:// prefix)
|
||||||
|
std::wstring base_url;
|
||||||
|
|
||||||
|
// static content not authorized by winix
|
||||||
|
// (e.g. static.someserver.com)
|
||||||
|
std::wstring base_url_static;
|
||||||
|
|
||||||
|
// additional static server for common content (not authorized)
|
||||||
|
// (e.g. common.someserver.com)
|
||||||
|
std::wstring base_url_common;
|
||||||
|
|
||||||
|
// separator used in <title> html tag
|
||||||
|
std::wstring title_separator;
|
||||||
|
|
||||||
|
// http header recognized by www server as a file to send back
|
||||||
|
// default: X-LIGHTTPD-send-file
|
||||||
|
std::wstring http_header_send_file;
|
||||||
|
|
||||||
|
// prints additional information (in the end of the html page as a commentary)
|
||||||
|
bool debug_info;
|
||||||
|
|
||||||
|
// in editors (emacs, ckeditor,...) the html will be filtered and unsafe tags
|
||||||
|
// will be dropped (script, frame, etc.)
|
||||||
|
// default: true;
|
||||||
|
bool editors_html_safe_mode;
|
||||||
|
|
||||||
|
// don't filter the html code for root
|
||||||
|
// default: true
|
||||||
|
// (if true the html code for root is not filtered)
|
||||||
|
bool editors_html_safe_mode_skip_root;
|
||||||
|
|
||||||
|
// charset used in templates, locales, logs etc.
|
||||||
|
// default: true (UTF-8)
|
||||||
|
// if false it means 8-bit ASCII
|
||||||
|
bool utf8;
|
||||||
|
|
||||||
|
// how many maximum symlinks can be followed
|
||||||
|
// (symlinks on directories as well)
|
||||||
|
// default: 20
|
||||||
|
size_t symlinks_follow_max;
|
||||||
|
|
||||||
|
// the prefix of a name of html form controls used in the ticket plugin
|
||||||
|
// default: ticketparam
|
||||||
|
std::wstring ticket_form_prefix;
|
||||||
|
|
||||||
|
// the minimal size of a user's password
|
||||||
|
// default: 5
|
||||||
|
size_t pass_min_size;
|
||||||
|
|
||||||
|
// how passwords should be stored
|
||||||
|
// 0 - plain text
|
||||||
|
// 1 - md4 hash
|
||||||
|
// 2 - md5 hash
|
||||||
|
// 10 - sha1 hash
|
||||||
|
// 11 - sha224 hash
|
||||||
|
// 12 - sha256 hash (default)
|
||||||
|
// 13 - sha384 hash
|
||||||
|
// 14 - sha512 hash
|
||||||
|
int pass_type;
|
||||||
|
|
||||||
|
// whether the passwords' hashes should be salted or not
|
||||||
|
// this affects newly created accounts
|
||||||
|
// default: false
|
||||||
|
bool pass_hash_use_salt;
|
||||||
|
|
||||||
|
// salt to a password's hash
|
||||||
|
// default empty
|
||||||
|
// !! once you set this salt don't change it any more (people wouldn't be allowed to login)
|
||||||
|
std::wstring pass_hash_salt;
|
||||||
|
|
||||||
|
// whether the passwords' hashes should be encrypted
|
||||||
|
// this affects newly created accounts
|
||||||
|
// default: false
|
||||||
|
bool pass_use_rsa;
|
||||||
|
|
||||||
|
// path to a RSA private key
|
||||||
|
// this is actually private + public key in one file
|
||||||
|
// generated by "openssl genrsa"
|
||||||
|
// default empty which means encryption will not be used
|
||||||
|
// !! once you set these keys don't change it any more (people wouldn't be allowed to login)
|
||||||
|
std::wstring pass_rsa_private_key;
|
||||||
|
|
||||||
|
// path to 'openssl'
|
||||||
|
// default: /usr/bin/openssl
|
||||||
|
std::wstring opensll_path;
|
||||||
|
|
||||||
|
// setting when we should delete patterns (EZC patterns)
|
||||||
|
// we are deleting when we have more (or equal) patterns than 'when_delete'
|
||||||
|
// and then we are deleting 'how_many_del' patterns
|
||||||
|
// those patterns comes from items (pages) with executable bit set
|
||||||
|
size_t pattern_cacher_when_delete;
|
||||||
|
size_t pattern_cacher_how_many_delete;
|
||||||
|
|
||||||
|
// header "Content-Type" send to the client
|
||||||
|
// 0 - text/html - for HTML
|
||||||
|
// 1 - application/xhtml+xml - for XHTML 1.0
|
||||||
|
// 2 - application/xml - for XHTML 1.0 or for XHTML 1.1
|
||||||
|
// default: 0
|
||||||
|
// if utf8 is true then "; charset=UTF-8" will also be appended
|
||||||
|
int content_type_header;
|
||||||
|
|
||||||
|
// global umask
|
||||||
|
// it is used when an user doesn't have your own umask or for guests (not logged users)
|
||||||
|
// default: 0222
|
||||||
|
int umask;
|
||||||
|
|
||||||
|
// maximum number for elements through the whole template
|
||||||
|
// default: 50000
|
||||||
|
size_t ezc_max_elements;
|
||||||
|
|
||||||
|
// maximum number of each [for] loop
|
||||||
|
// default: 5000 (from ezc generator)
|
||||||
|
size_t ezc_max_loop_elements;
|
||||||
|
|
||||||
|
// when true then when a user want to create a new account
|
||||||
|
// he has to provide his email and a message will be sent back to him
|
||||||
|
// with a link to activate the account
|
||||||
|
// default: true
|
||||||
|
bool account_need_email_verification;
|
||||||
|
|
||||||
|
// when a user forgot his password we are able to send an email to him
|
||||||
|
// with a link to the page where there is a html form for setting a new password
|
||||||
|
// this option tells how long (in seconds) the link is valid
|
||||||
|
// default: 86400 (24 hours)
|
||||||
|
long reset_password_code_expiration_time;
|
||||||
|
|
||||||
|
// time zone identifier for not logged users
|
||||||
|
// or for newly created accounts
|
||||||
|
// those identifiers you can see in etc/time_zones.conf file
|
||||||
|
// or by using timezone winix function with 'a' parameter (timezone/a) (!!IMPROVE ME NOT IMPLEMENTED YET)
|
||||||
|
// default: 34 (Coordinated Universal Time UTC+00:00)
|
||||||
|
size_t time_zone_default_id;
|
||||||
|
|
||||||
|
// a maximum value of a time zone identifier
|
||||||
|
// time zones with an id greater than this will be skipped
|
||||||
|
// default: 130 (maximum: 1000)
|
||||||
|
size_t time_zone_max_id;
|
||||||
|
|
||||||
|
// a directory in which there are some config files
|
||||||
|
// used mainly when winix starts
|
||||||
|
// default: empty (means not for using)
|
||||||
|
std::wstring etc_dir;
|
||||||
|
|
||||||
|
// a file in etc_dir with time zones info
|
||||||
|
// default: time_zones.conf
|
||||||
|
// this is a Space structure with all time zones
|
||||||
|
// with following format:
|
||||||
|
// "tz_-12:00" ( # the name of a space is also a key to the locale files
|
||||||
|
// tz_offset_str = "-12:00" # a string representing the offset from UTC in a format: [+|-]HH:MM
|
||||||
|
// tz_has_dst = "false" # whether the time zone has daylight saving time (bool)
|
||||||
|
// tz_dst_offset = "" # offset of the daylight saving time
|
||||||
|
// tz_dst_start = "" # when the daylight saving time starts, format: MM:DD HH:MM:SS
|
||||||
|
// tz_dst_end = "") # when the daylight saving time ends, format: MM:DD HH:MM:SS
|
||||||
|
// each time zone is in a seperate space
|
||||||
|
std::wstring time_zones_file;
|
||||||
|
|
||||||
|
// turn on the IP ban mechanizm
|
||||||
|
// we have got three levels of bans (level 1, level 2, and the highest level 3)
|
||||||
|
// default: true
|
||||||
|
bool use_ban_list;
|
||||||
|
|
||||||
|
// the so called 'soft' max size
|
||||||
|
// read below description for explanation
|
||||||
|
// this is introduced to avoid deleting only one record from the ban list
|
||||||
|
// default: 50000
|
||||||
|
size_t ban_list_soft_max_size;
|
||||||
|
|
||||||
|
// this is the 'hard' max size of an IP's ban list
|
||||||
|
// if there are more records than this value
|
||||||
|
// then some of them will be removed (until the size will be ban_list_soft_max_size equal)
|
||||||
|
// this value should be a little larger from ban_list_soft_max_size
|
||||||
|
// default: 51000
|
||||||
|
size_t ban_list_max_size;
|
||||||
|
|
||||||
|
// delay in seconds of the first level ban
|
||||||
|
// default: 1800 (30 minutes)
|
||||||
|
// it means withing the next 30 minutes you see only 'you are banned...' message on your webbrowser
|
||||||
|
size_t ban_level_1_delay;
|
||||||
|
|
||||||
|
// delay in seconds of the second level ban
|
||||||
|
// default: 86400 (24 hours)
|
||||||
|
size_t ban_level_2_delay;
|
||||||
|
|
||||||
|
// delay in seconds of the third level ban
|
||||||
|
// default: 604800 (7 days)
|
||||||
|
size_t ban_level_3_delay;
|
||||||
|
|
||||||
|
// the minimum time in seconds which has to pass between the first GET request
|
||||||
|
// (showing your the login form) and the second POST request (which sends the
|
||||||
|
// login and password to the server)
|
||||||
|
// if the time is shorter then the login attempt is treated as incorrect
|
||||||
|
// (the same as if you provide incorrect user/password)
|
||||||
|
// default: 2
|
||||||
|
size_t incorrect_login_min_time_between_get_post;
|
||||||
|
|
||||||
|
// how many incorrect logins there must have been passed to display a captcha
|
||||||
|
// next to the login form
|
||||||
|
// default: 3
|
||||||
|
size_t incorrect_login_captcha_treshold;
|
||||||
|
|
||||||
|
// the way how we prevent to login if there are too many incorrect login attempts
|
||||||
|
// 0 - 'block logging' - do not show the login form in 'login' winix function
|
||||||
|
// (instead a warning message will be printed)
|
||||||
|
// 1 - add to ban list (warning: people from this IP will not be able to see your site and do anything)
|
||||||
|
// default: 0
|
||||||
|
int incorrect_login_cannot_login_mode;
|
||||||
|
|
||||||
|
// after how many incorrect login attempts we do the incorrect_login_cannot_login_mode action
|
||||||
|
// default: 20
|
||||||
|
size_t incorrect_login_cannot_login_treshold;
|
||||||
|
|
||||||
|
// used when incorrect_login_cannot_login_mode is zero
|
||||||
|
// it is the time which should be passed to allow logging
|
||||||
|
// default: 1800 (30 minutes)
|
||||||
|
// if incorrect_login_cannot_login_mode is one then ban_level_X_delay times
|
||||||
|
// will be taken accordingly
|
||||||
|
size_t incorrect_login_cannot_login_delay;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Config();
|
Config();
|
||||||
bool ReadConfig(bool errors_to_stdout_);
|
bool ReadConfig(bool errors_to_stdout_, bool stdout_is_closed = true);
|
||||||
|
|
||||||
|
std::wstring & Text(const wchar_t * name);
|
||||||
|
std::wstring & Text(const wchar_t * name, const wchar_t * def);
|
||||||
|
std::wstring & Text(const std::wstring & name, const wchar_t * def);
|
||||||
|
std::string & AText(const wchar_t * name);
|
||||||
|
std::string & AText(const wchar_t * name, const char * def);
|
||||||
|
std::string & AText(const std::wstring & name, const char * def);
|
||||||
|
|
||||||
|
int Int(const wchar_t *);
|
||||||
|
int Int(const wchar_t * name, int def);
|
||||||
|
int Int(const std::wstring & name, int def);
|
||||||
|
long Long(const wchar_t *);
|
||||||
|
long Long(const wchar_t * name, long def);
|
||||||
|
long Long(const std::wstring & name, long def);
|
||||||
|
size_t Size(const wchar_t *);
|
||||||
|
size_t Size(const wchar_t * name, size_t def);
|
||||||
|
size_t Size(const std::wstring & name, size_t def);
|
||||||
|
bool Bool(const wchar_t *);
|
||||||
|
bool Bool(const wchar_t * name, bool def);
|
||||||
|
bool Bool(const std::wstring & name, bool def);
|
||||||
|
bool ListText(const wchar_t * name, std::vector<std::wstring> & list);
|
||||||
|
bool ListText(const std::wstring & name, std::vector<std::wstring> & list);
|
||||||
|
|
||||||
|
// for debug
|
||||||
|
void Print(std::wostream & out);
|
||||||
|
|
||||||
|
// raw access to the config
|
||||||
|
PT::Space space;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfParser conf_parser;
|
|
||||||
void ShowError();
|
|
||||||
void AssignValues();
|
|
||||||
|
|
||||||
std::string Text(const char * name);
|
|
||||||
std::string Text(const char * name, const char * def);
|
|
||||||
std::string Text(const std::string & name, const std::string & def);
|
|
||||||
|
|
||||||
int Int(const char *);
|
|
||||||
int Int(const char * name, int def);
|
|
||||||
int Int(const std::string & name, int def);
|
|
||||||
|
|
||||||
bool Bool(const char *);
|
|
||||||
bool Bool(const char * name, bool def);
|
|
||||||
bool Bool(const std::string & name, bool def);
|
|
||||||
|
|
||||||
|
PT::SpaceParser parser;
|
||||||
std::string default_str;
|
std::string default_str;
|
||||||
int default_int;
|
|
||||||
bool default_bool;
|
|
||||||
|
|
||||||
|
|
||||||
bool errors_to_stdout;
|
bool errors_to_stdout;
|
||||||
|
|
||||||
void NoLastSlash(std::string & s);
|
void ShowError();
|
||||||
void NoFirstHttp(std::string & s);
|
void AssignValues(bool stdout_is_closed);
|
||||||
|
void SetAdditionalVariables();
|
||||||
|
void CheckPasswd();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorecookieparser
|
#ifndef headerfile_winix_core_cookieparser
|
||||||
#define headerfilecmslucorecookieparser
|
#define headerfile_winix_core_cookieparser
|
||||||
|
|
||||||
#include <fcgiapp.h>
|
#include <fcgiapp.h>
|
||||||
#include "httpsimpleparser.h"
|
#include "httpsimpleparser.h"
|
||||||
@@ -21,7 +21,7 @@ class CookieParser : public HttpSimpleParser
|
|||||||
{
|
{
|
||||||
|
|
||||||
const char * cookie_string;
|
const char * cookie_string;
|
||||||
CookieTable & cookie_table;
|
CookieTab * cookie_tab;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -41,7 +41,7 @@ protected:
|
|||||||
// Cookie names are case insensitive according to section 3.1 of RFC 2965
|
// Cookie names are case insensitive according to section 3.1 of RFC 2965
|
||||||
ToLower(name);
|
ToLower(name);
|
||||||
|
|
||||||
std::pair<CookieTable::iterator, bool> res = cookie_table.insert( std::make_pair(name, value) );
|
std::pair<CookieTab::iterator, bool> res = cookie_tab->insert( std::make_pair(name, value) );
|
||||||
|
|
||||||
log << log2 << "Cookie, name: \"" << name << "\", value: \"" << value << "\"";
|
log << log2 << "Cookie, name: \"" << name << "\", value: \"" << value << "\"";
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
CookieParser(const char * cookie_string_, CookieTable & cookie_table_) : cookie_string(cookie_string_), cookie_table(cookie_table_)
|
CookieParser()
|
||||||
{
|
{
|
||||||
HttpSimpleParser::separator = ';';
|
HttpSimpleParser::separator = ';';
|
||||||
HttpSimpleParser::value_can_be_quoted = true;
|
HttpSimpleParser::value_can_be_quoted = true;
|
||||||
@@ -66,6 +66,16 @@ public:
|
|||||||
HttpSimpleParser::recognize_special_chars = false;
|
HttpSimpleParser::recognize_special_chars = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// cookie_string can be null
|
||||||
|
void Parse(const char * cookie_string_, CookieTab & cookie_tab_)
|
||||||
|
{
|
||||||
|
cookie_string = cookie_string_;
|
||||||
|
cookie_tab = &cookie_tab_;
|
||||||
|
|
||||||
|
HttpSimpleParser::Parse();
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
314
core/crypt.cpp
Executable file
314
core/crypt.cpp
Executable file
@@ -0,0 +1,314 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011-2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "utf8/utf8.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Crypt::SetConfig(Config * pconfig)
|
||||||
|
{
|
||||||
|
config = pconfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char Crypt::ConvertToHexForm(int val)
|
||||||
|
{
|
||||||
|
if( val < 10 )
|
||||||
|
return val + '0';
|
||||||
|
|
||||||
|
return val - 10 + 'a';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const char * in, size_t inlen, std::string & out)
|
||||||
|
{
|
||||||
|
out.clear();
|
||||||
|
|
||||||
|
if( !config )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
run.Clear();
|
||||||
|
PT::WideToUTF8(config->opensll_path, command);
|
||||||
|
run.Cmd(command);
|
||||||
|
run.Par("dgst");
|
||||||
|
run.Par("-binary");
|
||||||
|
|
||||||
|
switch(hash)
|
||||||
|
{
|
||||||
|
case WINIX_CRYPT_HASH_MD4: run.Par("-md4"); break;
|
||||||
|
case WINIX_CRYPT_HASH_MD5: run.Par("-md5"); break;
|
||||||
|
case WINIX_CRYPT_HASH_SHA1: run.Par("-sha1"); break;
|
||||||
|
case WINIX_CRYPT_HASH_SHA224: run.Par("-sha224"); break;
|
||||||
|
case WINIX_CRYPT_HASH_SHA256: run.Par("-sha256"); break;
|
||||||
|
case WINIX_CRYPT_HASH_SHA384: run.Par("-sha384"); break;
|
||||||
|
case WINIX_CRYPT_HASH_SHA512: run.Par("-sha512"); break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return run.Go(in, inlen, out) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const char * in, std::string & out)
|
||||||
|
{
|
||||||
|
size_t len = strlen(in);
|
||||||
|
return HashBin(hash, in, len, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return HashBin(hash, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const wchar_t * in, size_t inlen, std::string & out)
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(in, inlen, bufina);
|
||||||
|
int res = HashBin(hash, bufina.c_str(), bufina.size(), out);
|
||||||
|
bufina.clear();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const wchar_t * in, std::string & out)
|
||||||
|
{
|
||||||
|
size_t len = wcslen(in);
|
||||||
|
return HashBin(hash, in, len, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashBin(int hash, const std::wstring & in, std::string & out)
|
||||||
|
{
|
||||||
|
return HashBin(hash, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const char * in, size_t inlen, std::string & out)
|
||||||
|
{
|
||||||
|
int res = HashBin(hash, in, inlen, out_temp);
|
||||||
|
|
||||||
|
ConvertToHexForm(out_temp, out);
|
||||||
|
out_temp.clear();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const char * in, std::string & out)
|
||||||
|
{
|
||||||
|
size_t len = strlen(in);
|
||||||
|
return HashHex(hash, in, len, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return HashHex(hash, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const wchar_t * in, size_t inlen, std::wstring & out)
|
||||||
|
{
|
||||||
|
int res = HashBin(hash, in, inlen, out_temp);
|
||||||
|
|
||||||
|
ConvertToHexForm(out_temp, out);
|
||||||
|
out_temp.clear();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const wchar_t * in, std::wstring & out)
|
||||||
|
{
|
||||||
|
size_t len = wcslen(in);
|
||||||
|
return HashHex(hash, in, len, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::HashHex(int hash, const std::wstring & in, std::wstring & out)
|
||||||
|
{
|
||||||
|
return HashHex(hash, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IsAllWhite(const char * str)
|
||||||
|
{
|
||||||
|
for( ; *str ; ++str)
|
||||||
|
{
|
||||||
|
if( !(IsWhite(*str) || *str==10) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const char * keypath, const char * in, size_t inlen, std::string & out)
|
||||||
|
{
|
||||||
|
out.clear();
|
||||||
|
|
||||||
|
if( !config || IsAllWhite(keypath) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
run.Clear();
|
||||||
|
PT::WideToUTF8(config->opensll_path, command);
|
||||||
|
run.Cmd(command);
|
||||||
|
|
||||||
|
run.Par("rsautl");
|
||||||
|
run.Par("-inkey");
|
||||||
|
run.Par(keypath);
|
||||||
|
|
||||||
|
if(encrypt)
|
||||||
|
run.Par("-encrypt");
|
||||||
|
else
|
||||||
|
run.Par("-decrypt");
|
||||||
|
|
||||||
|
return run.Go(in, inlen, out) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const char * keypath, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return RSA(encrypt, keypath, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const std::string & keypath, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return RSA(encrypt, keypath.c_str(), in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const wchar_t * keypath, const char * in, size_t inlen, std::string & out)
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(keypath, keypatha);
|
||||||
|
return RSA(encrypt, keypatha.c_str(), in, inlen, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const wchar_t * keypath, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return RSA(encrypt, keypath, in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::RSA(bool encrypt, const std::wstring & keypath, const std::string & in, std::string & out)
|
||||||
|
{
|
||||||
|
return RSA(encrypt, keypath.c_str(), in.c_str(), in.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::PassHash(const std::wstring & salt, UserPass & up)
|
||||||
|
{
|
||||||
|
bool result = true;
|
||||||
|
up.pass_hash_salted = false;
|
||||||
|
|
||||||
|
if( up.pass_type != WINIX_CRYPT_HASH_NONE )
|
||||||
|
{
|
||||||
|
pass_org = up.pass;
|
||||||
|
pass_salted = up.pass;
|
||||||
|
pass_salted += salt;
|
||||||
|
|
||||||
|
if( HashHex(up.pass_type, pass_salted, up.pass) )
|
||||||
|
{
|
||||||
|
if( !salt.empty() )
|
||||||
|
up.pass_hash_salted = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log << log1 << "Crypt: problem with generating a hash, the password will not be hashed" << logend;
|
||||||
|
|
||||||
|
up.pass = pass_org;
|
||||||
|
up.pass_type = WINIX_CRYPT_HASH_NONE;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClearString(pass_salted);
|
||||||
|
ClearString(pass_org);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Crypt::PassCrypt(const std::wstring & path_to_rsa_private_key, UserPass & up)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
ClearString(up.pass_encrypted);
|
||||||
|
|
||||||
|
if( !path_to_rsa_private_key.empty() )
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(up.pass, passa);
|
||||||
|
|
||||||
|
if( RSA(true, path_to_rsa_private_key, passa, up.pass_encrypted) )
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClearString(up.pass_encrypted);
|
||||||
|
log << log1 << "AddUser: problem with encrypting, the password will not be encrypted!" << logend;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClearString(passa);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Crypt::PassHashCrypt(const std::wstring & salt, const std::wstring & path_to_rsa_private_key, UserPass & up)
|
||||||
|
{
|
||||||
|
PassHash(salt, up);
|
||||||
|
PassCrypt(path_to_rsa_private_key, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Crypt::PassHashCrypt(UserPass & up)
|
||||||
|
{
|
||||||
|
up.pass_type = config->pass_type;
|
||||||
|
empty.clear();
|
||||||
|
|
||||||
|
if( config->pass_hash_use_salt && !config->pass_hash_salt.empty() )
|
||||||
|
PassHash(config->pass_hash_salt, up);
|
||||||
|
else
|
||||||
|
PassHash(empty, up);
|
||||||
|
|
||||||
|
|
||||||
|
if( config->pass_use_rsa && !config->pass_rsa_private_key.empty() )
|
||||||
|
PassCrypt(config->pass_rsa_private_key, up);
|
||||||
|
}
|
||||||
|
|
||||||
262
core/crypt.h
Executable file
262
core/crypt.h
Executable file
@@ -0,0 +1,262 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011-2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_crypt
|
||||||
|
#define headerfile_winix_core_crypt
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "run.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
the kind of hashes we are able to obtain in winix
|
||||||
|
*/
|
||||||
|
#define WINIX_CRYPT_HASH_NONE 0
|
||||||
|
#define WINIX_CRYPT_HASH_MD4 1
|
||||||
|
#define WINIX_CRYPT_HASH_MD5 2
|
||||||
|
#define WINIX_CRYPT_HASH_SHA1 10
|
||||||
|
#define WINIX_CRYPT_HASH_SHA224 11
|
||||||
|
#define WINIX_CRYPT_HASH_SHA256 12
|
||||||
|
#define WINIX_CRYPT_HASH_SHA384 13
|
||||||
|
#define WINIX_CRYPT_HASH_SHA512 14
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
calculating hashes, encrypting and decrypting with RSA
|
||||||
|
*/
|
||||||
|
class Crypt
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
void SetConfig(Config * pconfig);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
calculating a hash from a given input
|
||||||
|
|
||||||
|
input:
|
||||||
|
hash - the kind of the hash - WINIX_CRYPT_HASH_*
|
||||||
|
in - input buffer
|
||||||
|
inlen - the length of the buffer
|
||||||
|
output:
|
||||||
|
out - the hash in binary form
|
||||||
|
*/
|
||||||
|
bool HashBin(int hash, const char * in, size_t inlen, std::string & out);
|
||||||
|
bool HashBin(int hash, const char * in, std::string & out);
|
||||||
|
bool HashBin(int hash, const std::string & in, std::string & out);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
calculating a hash from a given input
|
||||||
|
the input string is first changed to UTF8 and then hash is calculated
|
||||||
|
|
||||||
|
input:
|
||||||
|
hash - the kind of the hash - WINIX_CRYPT_HASH_*
|
||||||
|
in - input buffer
|
||||||
|
inlen - the length of the buffer
|
||||||
|
output:
|
||||||
|
out - the hash in binary form
|
||||||
|
*/
|
||||||
|
bool HashBin(int hash, const wchar_t * in, size_t inlen, std::string & out);
|
||||||
|
bool HashBin(int hash, const wchar_t * in, std::string & out);
|
||||||
|
bool HashBin(int hash, const std::wstring & in, std::string & out);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
calculating a hash from a given input
|
||||||
|
|
||||||
|
input:
|
||||||
|
hash - the kind of the hash - WINIX_CRYPT_HASH_*
|
||||||
|
in - input buffer
|
||||||
|
inlen - the length of the buffer
|
||||||
|
output:
|
||||||
|
out - the hash in the hex form (one byte is saved as two hex digits)
|
||||||
|
*/
|
||||||
|
bool HashHex(int hash, const char * in, size_t inlen, std::string & out);
|
||||||
|
bool HashHex(int hash, const char * in, std::string & out);
|
||||||
|
bool HashHex(int hash, const std::string & in, std::string & out);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
calculating a hash from a given input
|
||||||
|
the input string is first changed to UTF8 and then hash is calculated
|
||||||
|
|
||||||
|
input:
|
||||||
|
hash - the kind of the hash - WINIX_CRYPT_HASH_*
|
||||||
|
in - input buffer
|
||||||
|
inlen - the length of the buffer
|
||||||
|
output:
|
||||||
|
out - the hash in the hex form (one byte is saved as two hex digits)
|
||||||
|
the 'out' here is std::wstring (not std::string like beforehand)
|
||||||
|
*/
|
||||||
|
bool HashHex(int hash, const wchar_t * in, size_t inlen, std::wstring & out);
|
||||||
|
bool HashHex(int hash, const wchar_t * in, std::wstring & out);
|
||||||
|
bool HashHex(int hash, const std::wstring & in, std::wstring & out);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
encrypt/decrypt by using RSA algorithm
|
||||||
|
|
||||||
|
input:
|
||||||
|
encrypt - true means encrypting, false means decrypting
|
||||||
|
keypath - path to a RSA private key (this is a private and public key in one file)
|
||||||
|
in - input buffer
|
||||||
|
inlen - the size of the buffer
|
||||||
|
|
||||||
|
output:
|
||||||
|
out - encrypted or decrypted buffer (always binary)
|
||||||
|
*/
|
||||||
|
bool RSA(bool encrypt, const char * keypath, const char * in, size_t inlen, std::string & out);
|
||||||
|
bool RSA(bool encrypt, const char * keypath, const std::string & in, std::string & out);
|
||||||
|
bool RSA(bool encrypt, const std::string & keypath, const std::string & in, std::string & out);
|
||||||
|
bool RSA(bool encrypt, const wchar_t * keypath, const char * in, size_t inlen, std::string & out);
|
||||||
|
bool RSA(bool encrypt, const wchar_t * keypath, const std::string & in, std::string & out);
|
||||||
|
bool RSA(bool encrypt, const std::wstring & keypath, const std::string & in, std::string & out);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
this method creates a hash from the given plain text password
|
||||||
|
|
||||||
|
input.
|
||||||
|
salt - salt for the hash
|
||||||
|
up.pass_type - what kind of hash do you want - look at WINIX_CRYPT_HASH_* macros (in crypt.h)
|
||||||
|
up.pass - plain text password
|
||||||
|
|
||||||
|
if salt is empty then the hash will not be salted
|
||||||
|
|
||||||
|
output:
|
||||||
|
up.pass_type - (can be changed to 0 when there is a problem with generating a hash)
|
||||||
|
up.pass - hash from the password (or plain text if up.pass_type was zero)
|
||||||
|
up.pass_hash_salted (true if the hash is salted - when salt was not empty)
|
||||||
|
|
||||||
|
if there is a problem with generating a hash the method stores a plain text password
|
||||||
|
and changes up.pass_type to zero (plain text passwords are not salted)
|
||||||
|
*/
|
||||||
|
bool PassHash(const std::wstring & salt, UserPass & up);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
this method encrypts the given password
|
||||||
|
|
||||||
|
input:
|
||||||
|
path_to_rsa_private_key - a path to rsa private key (this are a private and public keys both in one file)
|
||||||
|
up.pass - given password (can be a plain text or a hash)
|
||||||
|
|
||||||
|
if path_to_rsa_private_key is empty then the password will not be encrypted
|
||||||
|
|
||||||
|
output:
|
||||||
|
up.pass_encrypted
|
||||||
|
|
||||||
|
if there is a problem (or the path to the key is empty) then up.pass_encrypted will be empty
|
||||||
|
and the method returns false
|
||||||
|
*/
|
||||||
|
bool PassCrypt(const std::wstring & path_to_rsa_private_key, UserPass & up);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
this method creates a hash from the given plain text password and then encrypts it
|
||||||
|
|
||||||
|
input:
|
||||||
|
salt - salt for the hash
|
||||||
|
path_to_rsa_private_key - a path to rsa private key (this are a private and public keys both in one file)
|
||||||
|
up.pass_type - what kind of hash do you want - look at WINIX_CRYPT_HASH_* macros (in crypt.h)
|
||||||
|
up.pass - plain text password
|
||||||
|
|
||||||
|
if salt is empty then the hash will not be salted
|
||||||
|
if path_to_rsa_private_key is empty then the password will not be encrypted
|
||||||
|
|
||||||
|
output:
|
||||||
|
up.pass_type - (can be changed to 0 when there is a problem with generating a hash)
|
||||||
|
up.pass - hash from the password (or plain text if up.pass_type was zero)
|
||||||
|
up.pass_hash_salted (true if the hash is salted - when salt was not empty)
|
||||||
|
up.pass_encrypted - encrypted password (if not empty)
|
||||||
|
|
||||||
|
*/
|
||||||
|
void PassHashCrypt(const std::wstring & salt, const std::wstring & path_to_rsa_private_key, UserPass & up);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
this method creates a hash from the given plain text password and then encrypts it
|
||||||
|
|
||||||
|
input:
|
||||||
|
up.pass - plain text password
|
||||||
|
|
||||||
|
output:
|
||||||
|
up.pass_type - what kind of hash there is in up.pass
|
||||||
|
up.pass - hash from the password (or plain text if up.pass_type is zero)
|
||||||
|
up.pass_hash_salted - true if the hash is salted (plain text are never salted)
|
||||||
|
up.pass_encrypted - encrypted password (if not empty)
|
||||||
|
*/
|
||||||
|
void PassHashCrypt(UserPass & up);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
putting some characters into the string and then calling clear()
|
||||||
|
*/
|
||||||
|
template<class StringType>
|
||||||
|
void ClearString(StringType & str);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Config * config;
|
||||||
|
Run run;
|
||||||
|
std::string command, bufina, keypatha;
|
||||||
|
//std::wstring pass_salted;//, pass_hashed;
|
||||||
|
//std::string pass_hasheda, pass_encrypteda;
|
||||||
|
|
||||||
|
std::wstring pass_salted, pass_org;
|
||||||
|
std::string passa, out_temp;
|
||||||
|
std::wstring empty;
|
||||||
|
|
||||||
|
|
||||||
|
template<typename StringType>
|
||||||
|
void ConvertToHexForm(const std::string & in, StringType & out);
|
||||||
|
|
||||||
|
char ConvertToHexForm(int val);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename StringType>
|
||||||
|
void Crypt::ClearString(StringType & str)
|
||||||
|
{
|
||||||
|
for(size_t i=0 ; i<str.size() ; ++i)
|
||||||
|
str[i] = 0x0c;
|
||||||
|
|
||||||
|
str.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename StringType>
|
||||||
|
void Crypt::ConvertToHexForm(const std::string & in, StringType & out)
|
||||||
|
{
|
||||||
|
out.clear();
|
||||||
|
|
||||||
|
if( in.size() * 2 > out.capacity() )
|
||||||
|
out.reserve(in.size() * 2);
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<in.size() ; ++i)
|
||||||
|
{
|
||||||
|
out += ConvertToHexForm(((unsigned char)in[i]) >> 4);
|
||||||
|
out += ConvertToHexForm(((unsigned char)in[i]) & 0x0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
36
core/cur.h
Executable file
36
core/cur.h
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2011, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_cur
|
||||||
|
#define headerfile_winix_core_cur
|
||||||
|
|
||||||
|
#include "request.h"
|
||||||
|
#include "session.h"
|
||||||
|
#include "mount.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
current request and session
|
||||||
|
*/
|
||||||
|
struct Cur
|
||||||
|
{
|
||||||
|
Request * request;
|
||||||
|
Session * session;
|
||||||
|
Mount * mount;
|
||||||
|
|
||||||
|
// those pointers are never null, if there is no a session for the user
|
||||||
|
// the 'session' pointer pointers at a special temporary session
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Data::Data()
|
|
||||||
{
|
|
||||||
signal_hup = false;
|
|
||||||
stdout_is_closed = false;
|
|
||||||
how_many_logged = 0;
|
|
||||||
|
|
||||||
// the rest will be read from a config file
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Data::SetAdditionalVariables()
|
|
||||||
{
|
|
||||||
SetHttpHost(base_url, base_url_http_host);
|
|
||||||
SetHttpHost(base_url_auth, base_url_auth_http_host);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Data::SetHttpHost(const std::string & in, std::string & out)
|
|
||||||
{
|
|
||||||
if( strncmp(in.c_str(), "http://", 7) == 0 )
|
|
||||||
out = in.substr(7);
|
|
||||||
else
|
|
||||||
if( strncmp(in.c_str(), "https://", 8) == 0 )
|
|
||||||
out = in.substr(8);
|
|
||||||
else
|
|
||||||
out.clear(); // if empty the RequestController::BaseUrlRedirect() returns false and no redirecting will be done
|
|
||||||
}
|
|
||||||
213
core/data.h
213
core/data.h
@@ -1,213 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucoredata
|
|
||||||
#define headerfilecmslucoredata
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "dirs.h"
|
|
||||||
#include "users.h"
|
|
||||||
#include "groups.h"
|
|
||||||
#include "functions.h"
|
|
||||||
#include "lastcontainer.h"
|
|
||||||
#include "mounts.h"
|
|
||||||
#include "rebus.h"
|
|
||||||
#include "loadavg.h"
|
|
||||||
|
|
||||||
|
|
||||||
class Data
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
|
||||||
// members read from a config file
|
|
||||||
|
|
||||||
// name of the config file (full path can be)
|
|
||||||
std::string config_file;
|
|
||||||
|
|
||||||
// log file name, log file name for notifications (sending emails, etc)
|
|
||||||
std::string log_file, log_notify_file;
|
|
||||||
|
|
||||||
// 1 - minimum
|
|
||||||
// 2 - (default)
|
|
||||||
// 3 - maximum - all logs
|
|
||||||
int log_level;
|
|
||||||
|
|
||||||
// logging to stdout too
|
|
||||||
bool log_stdout;
|
|
||||||
|
|
||||||
// how many requests should be logged in the same time
|
|
||||||
// default: 1
|
|
||||||
int log_request;
|
|
||||||
|
|
||||||
// fast cgi: socket (unix domain)
|
|
||||||
std::string fcgi_socket;
|
|
||||||
|
|
||||||
// fast cgi: socket permissions
|
|
||||||
int fcgi_socket_chmod;
|
|
||||||
|
|
||||||
// fast cgi: owner of the socket
|
|
||||||
std::string fcgi_socket_user;
|
|
||||||
|
|
||||||
// fast cgi: group of the socket
|
|
||||||
std::string fcgi_socket_group;
|
|
||||||
|
|
||||||
std::string templates_dir;
|
|
||||||
std::string templates_dir_default; // templates from winix
|
|
||||||
|
|
||||||
std::string db_database;
|
|
||||||
std::string db_user;
|
|
||||||
std::string db_pass;
|
|
||||||
|
|
||||||
std::string http_session_id_name;
|
|
||||||
|
|
||||||
// when the HOST_HTTP environment variable doesn't point into 'base_url' (the part 'http://' and the last slash is removed)
|
|
||||||
// the server will redirect into 'base_url' + 'REQUEST_URI'
|
|
||||||
// it's useful when you want to redirect from 'mydomain.tld' into 'www.mydomain.tld' etc.
|
|
||||||
bool base_url_redirect;
|
|
||||||
|
|
||||||
// string used in a place where is a user (or group) selected
|
|
||||||
std::string priv_no_user;
|
|
||||||
std::string priv_no_group;
|
|
||||||
|
|
||||||
// time in seconds when the user will be automatically logged out (iddle time)
|
|
||||||
int session_max_idle;
|
|
||||||
|
|
||||||
// time in seconds when the user will be automatically logged out (when he selected 'remember me' option)
|
|
||||||
// this time is usually greater than session_max_idle
|
|
||||||
int session_remember_max_idle;
|
|
||||||
|
|
||||||
// this file is used when the program is starting and ending
|
|
||||||
std::string session_file;
|
|
||||||
|
|
||||||
// allow the html ouput to be compressed
|
|
||||||
bool compression;
|
|
||||||
|
|
||||||
// plugins
|
|
||||||
std::vector<std::string> plugin_file;
|
|
||||||
|
|
||||||
// the html code is cleaned by our filter
|
|
||||||
bool html_filter;
|
|
||||||
|
|
||||||
// the url of a new empty item (if there is not the subject too)
|
|
||||||
std::string item_url_empty;
|
|
||||||
|
|
||||||
// maximum length of a file send by post multipart form
|
|
||||||
// 0 - not used
|
|
||||||
int post_file_max;
|
|
||||||
|
|
||||||
// directories for static files
|
|
||||||
std::string auth_simplefs_dir;
|
|
||||||
std::string auth_hashfs_dir;
|
|
||||||
|
|
||||||
// temporary directory for static content used by the upload function
|
|
||||||
// should be on the same partition as auth_simplefs_dir and auth_hashfs_dir
|
|
||||||
std::string auth_tmp_dir;
|
|
||||||
|
|
||||||
// default locale: en pl
|
|
||||||
std::string locale_str;
|
|
||||||
|
|
||||||
// directory with locale files
|
|
||||||
std::string locale_dir;
|
|
||||||
|
|
||||||
// directory with default locale files (those from winix)
|
|
||||||
std::string locale_dir_default;
|
|
||||||
|
|
||||||
// the main address of the server (e.g. someserver.com) (without the 'www' part etc)
|
|
||||||
std::string base_server;
|
|
||||||
|
|
||||||
// the main address of the site (e.g. http://www.someserver.com)
|
|
||||||
std::string base_url;
|
|
||||||
|
|
||||||
// static content authorized by winix
|
|
||||||
std::string base_url_auth;
|
|
||||||
|
|
||||||
// static content not authorized by winix
|
|
||||||
std::string base_url_static;
|
|
||||||
|
|
||||||
// additional static server for common content (not authorized)
|
|
||||||
std::string base_url_common;
|
|
||||||
|
|
||||||
// separator used in <title> html tag
|
|
||||||
std::string title_separator;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// end config members
|
|
||||||
// -----------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// false at the beginning
|
|
||||||
bool stdout_is_closed;
|
|
||||||
|
|
||||||
// true if there was SIGHUP signal
|
|
||||||
volatile bool signal_hup;
|
|
||||||
|
|
||||||
// contains current directories tree
|
|
||||||
Dirs dirs;
|
|
||||||
|
|
||||||
// based on base_url
|
|
||||||
// set by SetAdditionalVariables()
|
|
||||||
// without the first part http:// (or https://) or the whole string is empty
|
|
||||||
std::string base_url_http_host;
|
|
||||||
std::string base_url_auth_http_host;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// call this method after the config file is read
|
|
||||||
void SetAdditionalVariables();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// users
|
|
||||||
Users users;
|
|
||||||
|
|
||||||
// groups
|
|
||||||
Groups groups;
|
|
||||||
|
|
||||||
// functions (ls, cat, etc)
|
|
||||||
Functions functions;
|
|
||||||
|
|
||||||
// for 'last' function
|
|
||||||
LastContainer last;
|
|
||||||
|
|
||||||
// mount points
|
|
||||||
Mounts mounts;
|
|
||||||
|
|
||||||
// rebus (captcha)
|
|
||||||
Rebus rebus;
|
|
||||||
|
|
||||||
// the time when the winix starts
|
|
||||||
time_t system_start;
|
|
||||||
|
|
||||||
// how many logged users
|
|
||||||
long how_many_logged;
|
|
||||||
|
|
||||||
// load averages
|
|
||||||
LoadAvg load_avg;
|
|
||||||
|
|
||||||
Data();
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SetHttpHost(const std::string & in, std::string & out);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern Data data;
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
2135
core/db.cpp
2135
core/db.cpp
File diff suppressed because it is too large
Load Diff
248
core/db.h
248
core/db.h
@@ -1,248 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucoredb
|
|
||||||
#define headerfilecmslucoredb
|
|
||||||
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <sstream>
|
|
||||||
#include <libpq-fe.h>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <ctime>
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "item.h"
|
|
||||||
#include "user.h"
|
|
||||||
#include "group.h"
|
|
||||||
#include "thread.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "dircontainer.h"
|
|
||||||
#include "ugcontainer.h"
|
|
||||||
#include "ticket.h"
|
|
||||||
|
|
||||||
|
|
||||||
class Db
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
Db(bool close_at_end_ = true);
|
|
||||||
~Db();
|
|
||||||
|
|
||||||
// !! przerobic tak aby GetItem zwracalo wszystkie pozycja
|
|
||||||
// !! GetFile tylko dla plikow
|
|
||||||
// !! GetDir tylko dla katalogow
|
|
||||||
// !! GetFile i GetDir beda uzywac GetItem
|
|
||||||
|
|
||||||
void Init(const std::string & database, const std::string & user, const std::string & pass);
|
|
||||||
bool CheckUser(std::string & login, std::string & password, long & user_id);
|
|
||||||
Error AddUser(User & user, const std::string & password);
|
|
||||||
|
|
||||||
Error AddItem(Item & item);
|
|
||||||
Error EditItemById(Item & item, bool with_url = true);
|
|
||||||
Error EditItemByUrl(Item & item, bool with_url = true);
|
|
||||||
void CheckAllUrlSubject();
|
|
||||||
|
|
||||||
|
|
||||||
struct ItemQuery
|
|
||||||
{
|
|
||||||
// id is selected always
|
|
||||||
bool sel_parent_id; // parent_id
|
|
||||||
bool sel_user_id; // user_id
|
|
||||||
bool sel_group_id; // group_id
|
|
||||||
bool sel_guest_name; // guest_name
|
|
||||||
bool sel_privileges; // privileges
|
|
||||||
bool sel_date; // date_creation, date_modification
|
|
||||||
bool sel_subject; // subject
|
|
||||||
bool sel_content; // content, content_type, (content_id)
|
|
||||||
bool sel_url; // url
|
|
||||||
bool sel_type; // type (dir, file, none)
|
|
||||||
bool sel_default_item; // default_item
|
|
||||||
bool sel_auth; // auth, auth_path
|
|
||||||
|
|
||||||
bool where_id; //
|
|
||||||
bool where_parent_id; //
|
|
||||||
bool where_type;
|
|
||||||
bool where_auth;
|
|
||||||
|
|
||||||
long id; // if where_id is true
|
|
||||||
long parent_id; // if where_parent_id is true
|
|
||||||
Item::Type type;
|
|
||||||
Item::Auth auth;
|
|
||||||
bool auth_equal; // if true means auth should be equal
|
|
||||||
|
|
||||||
bool sort_asc;
|
|
||||||
|
|
||||||
|
|
||||||
void SetAll(bool sel, bool where_)
|
|
||||||
{
|
|
||||||
sel_parent_id = sel;
|
|
||||||
sel_user_id = sel;
|
|
||||||
sel_group_id = sel;
|
|
||||||
sel_guest_name = sel;
|
|
||||||
sel_privileges = sel;
|
|
||||||
sel_date = sel;
|
|
||||||
sel_subject = sel;
|
|
||||||
sel_content = sel;
|
|
||||||
sel_url = sel;
|
|
||||||
sel_type = sel;
|
|
||||||
sel_default_item= sel;
|
|
||||||
sel_auth = sel;
|
|
||||||
|
|
||||||
where_id = where_;
|
|
||||||
where_parent_id = where_;
|
|
||||||
where_type = where_;
|
|
||||||
where_auth = where_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WhereId(long id_) { where_id = true; id = id_; }
|
|
||||||
void WhereParentId(long parent_id_) { where_parent_id = true; parent_id = parent_id_; }
|
|
||||||
void WhereType(Item::Type type_) { where_type = true; type = type_; }
|
|
||||||
void WhereAuth(Item::Auth st,
|
|
||||||
bool equal = true) { where_auth = true; auth = st; auth_equal = equal; }
|
|
||||||
|
|
||||||
ItemQuery()
|
|
||||||
{
|
|
||||||
sort_asc = true;
|
|
||||||
auth_equal = true;
|
|
||||||
|
|
||||||
SetAll(true, false);
|
|
||||||
|
|
||||||
id = -1;
|
|
||||||
parent_id = -1;
|
|
||||||
type = Item::none;
|
|
||||||
auth = Item::auth_none;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void GetItems(std::vector<Item> & item_table, const ItemQuery & item_query);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// !! pobiera tylko jeden item (cos wymyslec innego z nazwa albo argumentem)
|
|
||||||
void GetItem(std::vector<Item> & item_table, long id);
|
|
||||||
|
|
||||||
|
|
||||||
bool GetPriv(Item & item, long id);
|
|
||||||
Error EditPrivById(Item & item, long id);
|
|
||||||
Error EditParentUrlById(Item & item, long id);
|
|
||||||
Error EditAuthById(Item & item, long id);
|
|
||||||
Error DelDirById(long id);
|
|
||||||
|
|
||||||
Error EditSubjectById(Item & item, long id);
|
|
||||||
|
|
||||||
|
|
||||||
bool DelItem(const Item & item);
|
|
||||||
void GetDirs(DirContainer & dir_table);
|
|
||||||
void GetUsers(UGContainer<User> & user_table);
|
|
||||||
void GetGroups(UGContainer<Group> & group_table);
|
|
||||||
|
|
||||||
// !! nowy interfejs
|
|
||||||
long Size(long parent_id, Item::Type type = Item::none);
|
|
||||||
|
|
||||||
Error GetItemById(long item_id, Item & item);
|
|
||||||
Error GetItem(long parent_id, const std::string & url, Item & item);
|
|
||||||
Error EditDefaultItem(long id, long new_default_item);
|
|
||||||
|
|
||||||
long GetItemId(long parent_id, const std::string & url, Item::Type type);
|
|
||||||
long GetFileId(long parent_id, const std::string & url);
|
|
||||||
long GetDirId(long parent_id, const std::string & url);
|
|
||||||
|
|
||||||
static tm ConvertTime(const char * str);
|
|
||||||
static const char * ConvertTime(const tm & t);
|
|
||||||
|
|
||||||
PGconn * GetPGconn();
|
|
||||||
|
|
||||||
virtual void Connect();
|
|
||||||
|
|
||||||
|
|
||||||
Error AddThread(Thread & thread);
|
|
||||||
Error GetThreadByDirId(long dir_id, Thread & thread);
|
|
||||||
Error GetThreads(long parent_id, std::vector<Thread> & thread_tab);
|
|
||||||
Error EditThreadAddItem(long dir_id, long item_id);
|
|
||||||
Error EditThreadRemoveItem(long dir_id);
|
|
||||||
Error RemoveThread(long dir_id);
|
|
||||||
|
|
||||||
|
|
||||||
Error GetTicketByDirId(long dir_id, Ticket & ticket);
|
|
||||||
Error GetTickets(long parent_id, std::vector<Ticket> & ticket_tab);
|
|
||||||
//bool IsTicket(long dir_id);
|
|
||||||
Error AddTicket(Ticket & ticket);
|
|
||||||
Error EditTicketById(Ticket & ticket);
|
|
||||||
Error EditTicketRemoveItem(long item_id);
|
|
||||||
Error RemoveTicket(long dir_id);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
PGconn * pg_conn;
|
|
||||||
std::string db_database, db_user, db_pass;
|
|
||||||
bool close_at_end;
|
|
||||||
|
|
||||||
void SetDbParameters();
|
|
||||||
|
|
||||||
void Close();
|
|
||||||
|
|
||||||
void AssertConnection();
|
|
||||||
std::string Escape(const std::string & s);
|
|
||||||
std::string Escape(const char * s);
|
|
||||||
PGresult * AssertQuery(const std::string & q);
|
|
||||||
void AssertResultStatus(PGresult * r, ExecStatusType t);
|
|
||||||
static int AssertColumn(PGresult * r, const char * column_name);
|
|
||||||
static const char * AssertValue(PGresult * r, int row, int col);
|
|
||||||
void ClearResult(PGresult * r);
|
|
||||||
long AssertCurrval(const char * table);
|
|
||||||
bool AddItemCreateUrlSubject(Item & item);
|
|
||||||
|
|
||||||
Error AddItemIntoContent(Item & item);
|
|
||||||
Error AddItemIntoItem(Item & item);
|
|
||||||
|
|
||||||
Error EditItemInItem(Item & item, bool with_url);
|
|
||||||
Error EditItemInContent(Item & item);
|
|
||||||
Error EditItemGetId(Item & item);
|
|
||||||
Error EditItemGetContentId(Item & item);
|
|
||||||
|
|
||||||
void CheckAllUrlSubjectModifyItem(Item & item);
|
|
||||||
|
|
||||||
PGresult * GetItemsQuery(const ItemQuery & iq);
|
|
||||||
|
|
||||||
bool DelItemDelItem(const Item & item);
|
|
||||||
void DelItemDelContent(const Item & item);
|
|
||||||
Error DelItemCountContents(const Item & item, long & contents);
|
|
||||||
|
|
||||||
|
|
||||||
struct ItemColumns
|
|
||||||
{
|
|
||||||
int id, user_id, group_id, privileges, date_creation, date_modification, url, type, parent_id,
|
|
||||||
content_id, default_item, subject, content, content_type, guest_name, auth, auth_path;
|
|
||||||
|
|
||||||
void SetColumns(PGresult * r);
|
|
||||||
void SetItem(PGresult * r, long row, Item & item);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct TicketColumns
|
|
||||||
{
|
|
||||||
int id, dir_id, parent_id, type, status, priority, category, expected, progress, item_id;
|
|
||||||
|
|
||||||
void SetColumns(PGresult * r);
|
|
||||||
void SetTicket(PGresult * r, long row, Ticket & ticket);
|
|
||||||
};
|
|
||||||
|
|
||||||
}; // class Db
|
|
||||||
|
|
||||||
|
|
||||||
extern Db db;
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Db::ItemColumns::SetColumns(PGresult * r)
|
|
||||||
{
|
|
||||||
// PQfnumber returns -1 if there is no such a column
|
|
||||||
id = PQfnumber(r, "id");
|
|
||||||
user_id = PQfnumber(r, "user_id");
|
|
||||||
group_id = PQfnumber(r, "group_id");
|
|
||||||
privileges = PQfnumber(r, "privileges");
|
|
||||||
date_creation = PQfnumber(r, "date_creation");
|
|
||||||
date_modification = PQfnumber(r, "date_modification");
|
|
||||||
url = PQfnumber(r, "url");
|
|
||||||
type = PQfnumber(r, "type");
|
|
||||||
parent_id = PQfnumber(r, "parent_id");
|
|
||||||
content_id = PQfnumber(r, "content_id");
|
|
||||||
default_item = PQfnumber(r, "default_item");
|
|
||||||
subject = PQfnumber(r, "subject");
|
|
||||||
content = PQfnumber(r, "content");
|
|
||||||
content_type = PQfnumber(r, "content_type");
|
|
||||||
guest_name = PQfnumber(r, "guest_name");
|
|
||||||
auth = PQfnumber(r, "auth");
|
|
||||||
auth_path = PQfnumber(r, "auth_path");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Db::ItemColumns::SetItem(PGresult * r, long row, Item & item)
|
|
||||||
{
|
|
||||||
if( id != -1 ) item.id = atol( Db::AssertValue(r, row, id) );
|
|
||||||
if( user_id != -1 ) item.user_id = atol( Db::AssertValue(r, row, user_id) );
|
|
||||||
if( group_id != -1 ) item.group_id = atol( Db::AssertValue(r, row, group_id) );
|
|
||||||
if( privileges != -1 ) item.privileges = atoi( Db::AssertValue(r, row, privileges) );
|
|
||||||
if( date_creation != -1 ) item.date_creation = ConvertTime( Db::AssertValue(r, row, date_creation) );
|
|
||||||
if( date_modification != -1 ) item.date_modification = ConvertTime( Db::AssertValue(r, row, date_modification) );
|
|
||||||
if( url != -1 ) item.url = Db::AssertValue(r, row, url);
|
|
||||||
if( type != -1 ) item.type = static_cast<Item::Type>( atoi(Db::AssertValue(r, row, type)) );
|
|
||||||
if( parent_id != -1 ) item.parent_id = atol( Db::AssertValue(r, row, parent_id) );
|
|
||||||
if( content_id != -1 ) item.content_id = atol( Db::AssertValue(r, row, content_id) );
|
|
||||||
if( default_item != -1 ) item.default_item = atol( Db::AssertValue(r, row, default_item) );
|
|
||||||
if( subject != -1 ) item.subject = Db::AssertValue(r, row, subject);
|
|
||||||
if( content != -1 ) item.content = Db::AssertValue(r, row, content);
|
|
||||||
if( content_type != -1 ) item.content_type = static_cast<Item::ContentType>( atoi(Db::AssertValue(r, row, content_type)) );
|
|
||||||
if( guest_name != -1 ) item.guest_name = Db::AssertValue(r, row, guest_name);
|
|
||||||
if( auth != -1 ) item.auth = static_cast<Item::Auth>( atoi(Db::AssertValue(r, row, auth)) );
|
|
||||||
if( auth_path != -1 ) item.auth_path = Db::AssertValue(r, row, auth_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Db::TicketColumns::SetColumns(PGresult * r)
|
|
||||||
{
|
|
||||||
// PQfnumber returns -1 if there is no such a column
|
|
||||||
id = PQfnumber(r, "id");
|
|
||||||
dir_id = PQfnumber(r, "dir_id");
|
|
||||||
parent_id = PQfnumber(r, "parent_id");
|
|
||||||
type = PQfnumber(r, "type");
|
|
||||||
status = PQfnumber(r, "status");
|
|
||||||
priority = PQfnumber(r, "priority");
|
|
||||||
category = PQfnumber(r, "category");
|
|
||||||
expected = PQfnumber(r, "expected");
|
|
||||||
progress = PQfnumber(r, "progress");
|
|
||||||
item_id = PQfnumber(r, "item_id");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Db::TicketColumns::SetTicket(PGresult * r, long row, Ticket & ticket)
|
|
||||||
{
|
|
||||||
if( id != -1 ) ticket.id = atol( Db::AssertValue(r, row, id) );
|
|
||||||
if( dir_id != -1 ) ticket.dir_id = atol( Db::AssertValue(r, row, dir_id) );
|
|
||||||
if( parent_id != -1 ) ticket.parent_id = atol( Db::AssertValue(r, row, parent_id) );
|
|
||||||
if( type != -1 ) ticket.type = atoi( Db::AssertValue(r, row, type) );
|
|
||||||
if( status != -1 ) ticket.status = atoi( Db::AssertValue(r, row, status) );
|
|
||||||
if( priority != -1 ) ticket.priority = atoi( Db::AssertValue(r, row, priority) );
|
|
||||||
if( category != -1 ) ticket.category = atoi( Db::AssertValue(r, row, category) );
|
|
||||||
if( expected != -1 ) ticket.expected = atoi( Db::AssertValue(r, row, expected) );
|
|
||||||
if( progress != -1 ) ticket.progress = atoi( Db::AssertValue(r, row, progress) );
|
|
||||||
if( item_id != -1 ) ticket.item_id = atol( Db::AssertValue(r, row, item_id) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -11,13 +11,15 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
std::string DirContainer::dir_etc = "etc";
|
std::wstring DirContainer::dir_etc = L"etc";
|
||||||
|
std::wstring DirContainer::dir_var = L"var";
|
||||||
|
|
||||||
|
|
||||||
DirContainer::DirContainer()
|
DirContainer::DirContainer()
|
||||||
{
|
{
|
||||||
is_root = false;
|
is_root = false;
|
||||||
is_etc = false;
|
is_etc = false;
|
||||||
|
is_var = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -40,6 +42,15 @@ return etc_iter;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DirContainer::Iterator DirContainer::GetVar()
|
||||||
|
{
|
||||||
|
if( !is_var )
|
||||||
|
return table.end();
|
||||||
|
|
||||||
|
return var_iter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::Iterator DirContainer::Begin()
|
DirContainer::Iterator DirContainer::Begin()
|
||||||
{
|
{
|
||||||
return table.begin();
|
return table.begin();
|
||||||
@@ -54,7 +65,7 @@ DirContainer::Iterator DirContainer::End()
|
|||||||
|
|
||||||
DirContainer::SizeType DirContainer::Size()
|
DirContainer::SizeType DirContainer::Size()
|
||||||
{
|
{
|
||||||
return table.size();
|
return table.size(); // !! warning: it has O(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DirContainer::Empty()
|
bool DirContainer::Empty()
|
||||||
@@ -63,25 +74,37 @@ bool DirContainer::Empty()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool DirContainer::IsNameOfSpecialFolder(const std::wstring & name)
|
||||||
|
{
|
||||||
|
return name == dir_etc || name == dir_var;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// looking for '/etc'
|
// looking for '/etc'
|
||||||
// 'root' is found beforehand
|
// 'root' is found beforehand
|
||||||
// CheckSpecialFolder() may not find everything (when the first is a special folder and then the root)
|
// CheckSpecialFolder() may not find everything (when the first is a special folder and then the root)
|
||||||
void DirContainer::FindSpecialFolders()
|
void DirContainer::FindSpecialFolders()
|
||||||
{
|
{
|
||||||
is_etc = false;
|
is_etc = false;
|
||||||
|
is_var = false;
|
||||||
|
|
||||||
if( !is_root )
|
if( !is_root )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DirContainer::ParentIterator i = FindFirstParent(root_iter->id);
|
DirContainer::ParentIterator i = FindFirstChild(root_iter->id);
|
||||||
|
|
||||||
for( ; i!=ParentEnd() ; i = NextParent(i) )
|
for( ; i!=ParentEnd() ; i = NextChild(i) )
|
||||||
{
|
{
|
||||||
if( i->second->url == dir_etc )
|
if( i->second->url == dir_etc )
|
||||||
{
|
{
|
||||||
is_etc = true;
|
is_etc = true;
|
||||||
etc_iter = i->second;
|
etc_iter = i->second;
|
||||||
break;
|
}
|
||||||
|
else
|
||||||
|
if( i->second->url == dir_var )
|
||||||
|
{
|
||||||
|
is_var = true;
|
||||||
|
var_iter = i->second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,8 +126,16 @@ void DirContainer::CheckSpecialFolder(const Item & item, Iterator iter)
|
|||||||
{
|
{
|
||||||
is_etc = true;
|
is_etc = true;
|
||||||
etc_iter = iter;
|
etc_iter = iter;
|
||||||
log << log1 << "DirCont: added special folder: /etc" << logend;
|
log << log2 << "DirCont: added special folder: /etc" << logend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( item.parent_id==root_iter->id && item.url==dir_var )
|
||||||
|
{
|
||||||
|
is_var = true;
|
||||||
|
var_iter = iter;
|
||||||
|
log << log2 << "DirCont: added special folder: /var" << logend;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -141,10 +172,10 @@ bool DirContainer::ChangeParent(long dir_id, long new_parent_id)
|
|||||||
if( i->parent_id == new_parent_id )
|
if( i->parent_id == new_parent_id )
|
||||||
return true; // nothing to do
|
return true; // nothing to do
|
||||||
|
|
||||||
ParentIterator p = FindFirstParent(i->parent_id);
|
ParentIterator p = FindFirstChild(i->parent_id);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
for( ; p != table_parent.end() ; p = NextParent(p) )
|
for( ; p != table_parent.end() ; p = NextChild(p) )
|
||||||
{
|
{
|
||||||
if( p->second->id == dir_id )
|
if( p->second->id == dir_id )
|
||||||
{
|
{
|
||||||
@@ -157,7 +188,7 @@ bool DirContainer::ChangeParent(long dir_id, long new_parent_id)
|
|||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
|
|
||||||
if( i->url == "etc" ) // !! in the future can be more special folders
|
if( IsNameOfSpecialFolder(i->url) )
|
||||||
FindSpecialFolders();
|
FindSpecialFolders();
|
||||||
|
|
||||||
break; // that iterator (p) is only one
|
break; // that iterator (p) is only one
|
||||||
@@ -220,7 +251,7 @@ bool DirContainer::ParentEmpty()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator DirContainer::FindFirstParent(long parent)
|
DirContainer::ParentIterator DirContainer::FindFirstChild(long parent)
|
||||||
{
|
{
|
||||||
ParentIterator i = table_parent.lower_bound(parent);
|
ParentIterator i = table_parent.lower_bound(parent);
|
||||||
|
|
||||||
@@ -231,7 +262,7 @@ return i;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator DirContainer::NextParent(ParentIterator i)
|
DirContainer::ParentIterator DirContainer::NextChild(ParentIterator i)
|
||||||
{
|
{
|
||||||
if( i == table_parent.end() )
|
if( i == table_parent.end() )
|
||||||
return table_parent.end();
|
return table_parent.end();
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoredircontainer
|
#ifndef headerfile_winix_core_dircontainer
|
||||||
#define headerfilecmslucoredircontainer
|
#define headerfile_winix_core_dircontainer
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -34,6 +34,7 @@ public:
|
|||||||
|
|
||||||
Iterator GetRoot();
|
Iterator GetRoot();
|
||||||
Iterator GetEtc();
|
Iterator GetEtc();
|
||||||
|
Iterator GetVar();
|
||||||
|
|
||||||
Iterator Begin();
|
Iterator Begin();
|
||||||
Iterator End();
|
Iterator End();
|
||||||
@@ -47,13 +48,14 @@ public:
|
|||||||
|
|
||||||
bool DelById(long id);
|
bool DelById(long id);
|
||||||
|
|
||||||
ParentIterator ParentBegin();
|
ParentIterator ParentBegin(); // IMPROVE ME: may it should be renamed to ChildBegin() similarly as FindFirstChild() ?
|
||||||
ParentIterator ParentEnd();
|
ParentIterator ParentEnd();
|
||||||
ParentSizeType ParentSize();
|
ParentSizeType ParentSize();
|
||||||
bool ParentEmpty();
|
bool ParentEmpty();
|
||||||
ParentIterator FindFirstParent(long parent);
|
ParentIterator FindFirstChild(long parent);
|
||||||
ParentIterator NextParent(ParentIterator pi);
|
ParentIterator NextChild(ParentIterator pi);
|
||||||
|
|
||||||
|
bool IsNameOfSpecialFolder(const std::wstring & name);
|
||||||
void FindSpecialFolders();
|
void FindSpecialFolders();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -75,12 +77,18 @@ private:
|
|||||||
// etc
|
// etc
|
||||||
Iterator etc_iter;
|
Iterator etc_iter;
|
||||||
|
|
||||||
|
// true if there is a var dir in the table
|
||||||
|
bool is_var;
|
||||||
|
|
||||||
|
// var
|
||||||
|
Iterator var_iter;
|
||||||
|
|
||||||
// indexes
|
// indexes
|
||||||
TableId table_id;
|
TableId table_id;
|
||||||
TableParent table_parent;
|
TableParent table_parent;
|
||||||
|
|
||||||
// names of folders
|
// names of folders
|
||||||
static std::string dir_etc;
|
static std::wstring dir_etc, dir_var;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
502
core/dirs.cpp
502
core/dirs.cpp
@@ -2,7 +2,7 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -10,36 +10,59 @@
|
|||||||
#include "dirs.h"
|
#include "dirs.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "db.h"
|
|
||||||
#include "data.h"
|
|
||||||
#include "request.h"
|
|
||||||
|
|
||||||
|
void Dirs::SetDb(Db * pdb)
|
||||||
|
{
|
||||||
|
db = pdb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Dirs::SetCur(Cur * pcur)
|
||||||
|
{
|
||||||
|
cur = pcur;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Dirs::SetNotify(Notify * pnotify)
|
||||||
|
{
|
||||||
|
notify = pnotify;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Dirs::Clear()
|
void Dirs::Clear()
|
||||||
{
|
{
|
||||||
dir_table.Clear();
|
dir_tab.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Dirs::HasReadExecAccessForRoot(const Item & item)
|
||||||
|
{
|
||||||
|
// there must be at least one 'x' (for the root)
|
||||||
|
return (item.privileges & 01111) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Dirs::CheckRootDir()
|
void Dirs::CheckRootDir()
|
||||||
{
|
{
|
||||||
DirContainer::Iterator i = dir_table.GetRoot();
|
DirContainer::Iterator i = dir_tab.GetRoot();
|
||||||
|
|
||||||
if( i != dir_table.End() )
|
if( i != dir_tab.End() )
|
||||||
{
|
{
|
||||||
if( !request.HasReadExecAccessForRoot(*i) )
|
if( !HasReadExecAccessForRoot(*i) )
|
||||||
{
|
{
|
||||||
i->privileges = 0755;
|
i->privileges = 07555;
|
||||||
log << log1 << "Dirs: there is no access for root (admin) to the root dir, setting 0755 for root dir" << logend;
|
log << log1 << "Dirs: there is no access for a root (admin) to the root dir, setting 07555 for the root directory" << logend;
|
||||||
db.EditPrivById(*i, i->id);
|
db->EditPrivById(*i, i->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log << log1 << "Dirs: there is no a root dir in the database (creating one)" << logend;
|
log << log1 << "Dirs: there is no a root directory in the database (creating one)" << logend;
|
||||||
|
|
||||||
Item root;
|
Item root;
|
||||||
|
|
||||||
@@ -47,14 +70,13 @@ void Dirs::CheckRootDir()
|
|||||||
root.parent_id = -1;
|
root.parent_id = -1;
|
||||||
root.user_id = -1;
|
root.user_id = -1;
|
||||||
root.group_id = -1;
|
root.group_id = -1;
|
||||||
root.privileges = 0755;
|
root.privileges = 07555;
|
||||||
root.default_item = -1;
|
|
||||||
|
|
||||||
// !! upewnic sie ze baza nie zmieni url (gdyby wczesniej juz byl w bazie pusty url)
|
// !! upewnic sie ze baza nie zmieni url (gdyby wczesniej juz byl w bazie pusty url)
|
||||||
// !! zrobic jakis wyjatek do wprowadzania roota?
|
// !! zrobic jakis wyjatek do wprowadzania roota?
|
||||||
if( db.AddItem(root) == WINIX_ERR_OK )
|
if( db->AddItem(root) == WINIX_ERR_OK )
|
||||||
{
|
{
|
||||||
dir_table.PushBack(root);
|
dir_tab.PushBack(root);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,13 +87,13 @@ void Dirs::ReadDirs()
|
|||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
db.GetDirs(dir_table);
|
db->GetDirs(dir_tab);
|
||||||
CheckRootDir();
|
CheckRootDir();
|
||||||
dir_table.FindSpecialFolders();
|
dir_tab.FindSpecialFolders();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Dirs::ExtractName(const char * & s, std::string & name)
|
bool Dirs::ExtractName(const wchar_t * & s, std::wstring & name)
|
||||||
{
|
{
|
||||||
name.clear();
|
name.clear();
|
||||||
|
|
||||||
@@ -90,9 +112,9 @@ return !name.empty();
|
|||||||
|
|
||||||
bool Dirs::IsDir(long id)
|
bool Dirs::IsDir(long id)
|
||||||
{
|
{
|
||||||
DirContainer::Iterator i = dir_table.FindId(id);
|
DirContainer::Iterator i = dir_tab.FindId(id);
|
||||||
|
|
||||||
if( i == dir_table.End() )
|
if( i == dir_tab.End() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -100,75 +122,147 @@ return true;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// !! dac clearowanie childs_tab
|
||||||
bool Dirs::GetDirChilds(long parent, std::vector<Item*> & childs_table)
|
// !! ewentualnie mozna dodac trzeci domyslny parametr bool clear_tab = true
|
||||||
|
bool Dirs::GetDirChilds(long parent, std::vector<Item*> & childs_tab)
|
||||||
{
|
{
|
||||||
if( parent != -1 && !IsDir(parent) )
|
if( parent != -1 && !IsDir(parent) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DirContainer::ParentIterator i = dir_table.FindFirstParent(parent);
|
DirContainer::ParentIterator i = dir_tab.FindFirstChild(parent);
|
||||||
|
|
||||||
for( ; i != dir_table.ParentEnd() ; i = dir_table.NextParent(i) )
|
for( ; i != dir_tab.ParentEnd() ; i = dir_tab.NextChild(i) )
|
||||||
childs_table.push_back( &(*i->second) );
|
childs_tab.push_back( &(*i->second) );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator Dirs::FindFirstParent(long parent_id)
|
DirContainer::ParentIterator Dirs::FindFirstChild(long parent_id)
|
||||||
{
|
{
|
||||||
DirContainer::ParentIterator i = dir_table.FindFirstParent(parent_id);
|
DirContainer::ParentIterator i = dir_tab.FindFirstChild(parent_id);
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator Dirs::NextParent(DirContainer::ParentIterator i)
|
DirContainer::ParentIterator Dirs::NextChild(DirContainer::ParentIterator i)
|
||||||
{
|
{
|
||||||
return dir_table.NextParent(i);
|
return dir_tab.NextChild(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirContainer::ParentIterator Dirs::ParentEnd()
|
DirContainer::ParentIterator Dirs::ParentEnd()
|
||||||
{
|
{
|
||||||
return dir_table.ParentEnd();
|
return dir_tab.ParentEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// dodatkowo moze metoda AppendPath dodajaca sciezke do biezacego stringa?
|
// !! dodatkowo moze metoda AppendPath dodajaca sciezke do biezacego stringa?
|
||||||
// albo tutaj stringa nie czyscic?
|
// albo tutaj stringa nie czyscic?
|
||||||
// O(m * log n) (m- how many parts are in 'id')
|
// O(m * log n) (m- how many parts are in 'id')
|
||||||
// path with a slash at the end
|
// path with a slash at the end and at the beginning
|
||||||
bool Dirs::MakePath(long id, std::string & path)
|
bool Dirs::MakePath(long id, std::wstring & path, bool clear_path)
|
||||||
{
|
{
|
||||||
DirContainer::Iterator i;
|
DirContainer::Iterator i;
|
||||||
|
|
||||||
path = '/';
|
if( clear_path )
|
||||||
|
path.clear();
|
||||||
|
|
||||||
|
temp_path = '/';
|
||||||
|
|
||||||
while( true )
|
while( true )
|
||||||
{
|
{
|
||||||
i = dir_table.FindId(id);
|
i = dir_tab.FindId(id);
|
||||||
|
|
||||||
if( i == dir_table.End() ||
|
if( i == dir_tab.End() ||
|
||||||
i->parent_id == id ) // means a loop (something wrong in the db)
|
i->parent_id == id ) // means a loop (something wrong in the db)
|
||||||
|
{
|
||||||
|
// we don't change path if there is no such a directory
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if( i->parent_id == -1 )
|
if( i->parent_id == -1 )
|
||||||
|
{
|
||||||
|
path += temp_path;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
id = i->parent_id;
|
id = i->parent_id;
|
||||||
|
|
||||||
|
temp_path.insert(0, i->url);
|
||||||
path.insert(0, i->url);
|
temp_path.insert(temp_path.begin(), '/');
|
||||||
path.insert(path.begin(), '/');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Dirs::MakePath(const std::vector<Item*> dir_tab, std::wstring & path, bool clear_path)
|
||||||
|
{
|
||||||
|
if( clear_path )
|
||||||
|
path.clear();
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<dir_tab.size() ; ++i)
|
||||||
|
{
|
||||||
|
path += dir_tab[i]->url;
|
||||||
|
path += '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t Dirs::DirLevel(long id)
|
||||||
|
{
|
||||||
|
DirContainer::Iterator i;
|
||||||
|
size_t level = 0;
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
i = dir_tab.FindId(id);
|
||||||
|
|
||||||
|
if( i == dir_tab.End() ||
|
||||||
|
i->parent_id == id ) // means a loop (something wrong in the db)
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( i->parent_id == -1 )
|
||||||
|
return level;
|
||||||
|
|
||||||
|
id = i->parent_id;
|
||||||
|
level += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Dirs::IsChild(long parent_id, long child_id)
|
||||||
|
{
|
||||||
|
if( child_id == parent_id )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
DirContainer::Iterator i;
|
||||||
|
|
||||||
|
while( child_id != -1 )
|
||||||
|
{
|
||||||
|
i = dir_tab.FindId(child_id);
|
||||||
|
|
||||||
|
if( i == dir_tab.End() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( i->parent_id == parent_id )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
child_id = i->parent_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Dirs::ChangeParent(long dir_id, long new_parent_id)
|
bool Dirs::ChangeParent(long dir_id, long new_parent_id)
|
||||||
{
|
{
|
||||||
return dir_table.ChangeParent(dir_id, new_parent_id);
|
return dir_tab.ChangeParent(dir_id, new_parent_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -182,9 +276,9 @@ DirContainer::Iterator i;
|
|||||||
|
|
||||||
while( true )
|
while( true )
|
||||||
{
|
{
|
||||||
i = dir_table.FindId(dir_id);
|
i = dir_tab.FindId(dir_id);
|
||||||
|
|
||||||
if( i==dir_table.End() || i->parent_id==-1 )
|
if( i==dir_tab.End() || i->parent_id==-1 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if( i->parent_id == parent_id )
|
if( i->parent_id == parent_id )
|
||||||
@@ -197,11 +291,38 @@ DirContainer::Iterator i;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Dirs::CreateDirTab(long dir_id, std::vector<Item*> & out_dir_tab)
|
||||||
|
{
|
||||||
|
DirContainer::Iterator i;
|
||||||
|
|
||||||
|
out_dir_tab.clear();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i = dir_tab.FindId(dir_id);
|
||||||
|
|
||||||
|
if( i == dir_tab.End() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( out_dir_tab.empty() )
|
||||||
|
out_dir_tab.insert(out_dir_tab.end(), &(*i)); // !! I am not sure whether begin() can be used on an empty container
|
||||||
|
else
|
||||||
|
out_dir_tab.insert(out_dir_tab.begin(), &(*i));
|
||||||
|
|
||||||
|
dir_id = i->parent_id;
|
||||||
|
}
|
||||||
|
while( dir_id != -1 );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Item * Dirs::GetRootDir()
|
Item * Dirs::GetRootDir()
|
||||||
{
|
{
|
||||||
DirContainer::Iterator root = dir_table.GetRoot();
|
DirContainer::Iterator root = dir_tab.GetRoot();
|
||||||
|
|
||||||
if( root == dir_table.End() )
|
if( root == dir_tab.End() )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return &(*root);
|
return &(*root);
|
||||||
@@ -210,20 +331,31 @@ return &(*root);
|
|||||||
|
|
||||||
Item * Dirs::GetEtcDir()
|
Item * Dirs::GetEtcDir()
|
||||||
{
|
{
|
||||||
DirContainer::Iterator etc = dir_table.GetEtc();
|
DirContainer::Iterator etc = dir_tab.GetEtc();
|
||||||
|
|
||||||
if( etc == dir_table.End() )
|
if( etc == dir_tab.End() )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return &(*etc);
|
return &(*etc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Item * Dirs::GetDir(const std::string & name, long parent)
|
Item * Dirs::GetVarDir()
|
||||||
{
|
{
|
||||||
DirContainer::ParentIterator i = dir_table.FindFirstParent(parent);
|
DirContainer::Iterator etc = dir_tab.GetVar();
|
||||||
|
|
||||||
for( ; i!=dir_table.ParentEnd() ; i = dir_table.NextParent(i) )
|
if( etc == dir_tab.End() )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return &(*etc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Item * Dirs::GetDir(const wchar_t * name, long parent)
|
||||||
|
{
|
||||||
|
DirContainer::ParentIterator i = dir_tab.FindFirstChild(parent);
|
||||||
|
|
||||||
|
for( ; i!=dir_tab.ParentEnd() ; i = dir_tab.NextChild(i) )
|
||||||
if( i->second->url == name )
|
if( i->second->url == name )
|
||||||
return &(*i->second);
|
return &(*i->second);
|
||||||
|
|
||||||
@@ -231,38 +363,51 @@ return 0;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Item * Dirs::GetDir(const std::wstring & name, long parent)
|
||||||
Item * Dirs::GetDir(const std::string & path)
|
|
||||||
{
|
{
|
||||||
DirContainer::Iterator root = dir_table.GetRoot();
|
return GetDir(name.c_str(), parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Item * Dirs::GetDir(const wchar_t * path)
|
||||||
|
{
|
||||||
|
if( *path == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DirContainer::Iterator root = dir_tab.GetRoot();
|
||||||
|
|
||||||
if( root == dir_table.End() )
|
if( root == dir_tab.End() )
|
||||||
// ops, we do not have a root dir
|
// ops, we do not have a root dir
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Item * pitem = &(*root);
|
Item * pitem = &(*root);
|
||||||
|
const wchar_t * s = path;
|
||||||
std::string name;
|
|
||||||
const char * s = path.c_str();
|
|
||||||
|
|
||||||
while( ExtractName(s, name) )
|
while( ExtractName(s, get_dir_temp) )
|
||||||
{
|
{
|
||||||
pitem = GetDir(name, pitem->id);
|
pitem = GetDir(get_dir_temp, pitem->id);
|
||||||
|
|
||||||
if( !pitem )
|
if( !pitem )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return pitem;
|
return pitem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Item * Dirs::GetDir(const std::wstring & path)
|
||||||
|
{
|
||||||
|
return GetDir(path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Item * Dirs::GetDir(long id)
|
Item * Dirs::GetDir(long id)
|
||||||
{
|
{
|
||||||
DirContainer::Iterator i = dir_table.FindId(id);
|
DirContainer::Iterator i = dir_tab.FindId(id);
|
||||||
|
|
||||||
if( i == dir_table.End() )
|
if( i == dir_tab.End() )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return &(*i);
|
return &(*i);
|
||||||
@@ -273,13 +418,13 @@ return &(*i);
|
|||||||
|
|
||||||
Item * Dirs::AddDir(const Item & item)
|
Item * Dirs::AddDir(const Item & item)
|
||||||
{
|
{
|
||||||
return &(*dir_table.PushBack(item));
|
return &(*dir_tab.PushBack(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
size_t Dirs::AnalyzeDir(Item * pdir, const std::string & path, long & dir_id, std::string & dir)
|
size_t Dirs::AnalyzeDir(Item * pdir, const std::wstring & path, long & dir_id, std::wstring & dir)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
size_t old_i;
|
size_t old_i;
|
||||||
@@ -301,7 +446,7 @@ size_t Dirs::AnalyzeDir(Item * pdir, const std::string & path, long & dir_id, st
|
|||||||
for( ; i<path.size() && path[i] != '/' ; ++i)
|
for( ; i<path.size() && path[i] != '/' ; ++i)
|
||||||
analyze_temp += path[i];
|
analyze_temp += path[i];
|
||||||
|
|
||||||
pdir = data.dirs.GetDir(analyze_temp, pdir->id);
|
pdir = GetDir(analyze_temp, pdir->id);
|
||||||
|
|
||||||
if( !pdir )
|
if( !pdir )
|
||||||
return old_i; // analyze_temp is not a directory
|
return old_i; // analyze_temp is not a directory
|
||||||
@@ -325,9 +470,9 @@ size_t Dirs::AnalyzeDir(Item * pdir, const std::string & path, long & dir_id, st
|
|||||||
2 - the path is empty
|
2 - the path is empty
|
||||||
3 - there is not such a directory
|
3 - there is not such a directory
|
||||||
*/
|
*/
|
||||||
int Dirs::AnalyzePath(const std::string & path, long & dir_id, std::string & dir, std::string & file)
|
int Dirs::AnalyzePath(const std::wstring & path, long & dir_id, std::wstring & dir, std::wstring & file)
|
||||||
{
|
{
|
||||||
Item * pdir = data.dirs.GetRootDir();
|
Item * pdir = GetRootDir();
|
||||||
dir = '/';
|
dir = '/';
|
||||||
file.clear();
|
file.clear();
|
||||||
|
|
||||||
@@ -358,10 +503,156 @@ return 0;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// current_dir_tab can be the same container as out_dir_tab
|
||||||
void Dirs::SplitPath(const std::string & path, std::string & dir, std::string & file)
|
void Dirs::CopyDirTab(const std::vector<Item*> & in, std::vector<Item*> & out)
|
||||||
{
|
{
|
||||||
std::string::size_type i;
|
if( &in != &out )
|
||||||
|
{
|
||||||
|
out.resize(in.size());
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<in.size() ; ++i)
|
||||||
|
out[i] = in[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Dirs::AnalyzeDir(std::vector<Item*> & dir_tab, const std::wstring & link_to, size_t & i)
|
||||||
|
{
|
||||||
|
size_t old_i;
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if( dir_tab.empty() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
// skipping slashes
|
||||||
|
for( ; i<link_to.size() && link_to[i] == '/' ; ++i);
|
||||||
|
|
||||||
|
if( i == link_to.size() )
|
||||||
|
return true; // end of the path
|
||||||
|
|
||||||
|
// creating a name
|
||||||
|
old_i = i;
|
||||||
|
analyze_temp.clear();
|
||||||
|
|
||||||
|
for( ; i<link_to.size() && link_to[i] != '/' ; ++i)
|
||||||
|
analyze_temp += link_to[i];
|
||||||
|
|
||||||
|
if( analyze_temp == L".." )
|
||||||
|
{
|
||||||
|
if( dir_tab.size() <= 1 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dir_tab.pop_back();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( analyze_temp != L"." )
|
||||||
|
{
|
||||||
|
Item * pdir = GetDir(analyze_temp, dir_tab.back()->id);
|
||||||
|
|
||||||
|
if( !pdir )
|
||||||
|
{
|
||||||
|
i = old_i;
|
||||||
|
return true; // analyze_temp is not a directory
|
||||||
|
}
|
||||||
|
|
||||||
|
dir_tab.push_back(pdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int Dirs::FollowLink(std::vector<Item*> & dir_tab, const std::wstring & link_to, std::wstring & out_item)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if( !AnalyzeDir(dir_tab, link_to, i) )
|
||||||
|
return 2; // incorrect link_to
|
||||||
|
|
||||||
|
if( i < link_to.size() )
|
||||||
|
{
|
||||||
|
// checking if at least one slash has left
|
||||||
|
for(size_t a=i ; a < link_to.size() ; ++a)
|
||||||
|
if( link_to[a] == '/' )
|
||||||
|
return 2; // there is not such a directory
|
||||||
|
|
||||||
|
// the rest of the path is a file name
|
||||||
|
out_item = link_to.c_str() + i;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
return codes:
|
||||||
|
ok:
|
||||||
|
0 - the link_to is a path to a directory (out_item skipped, out_dir_tab will not be empty)
|
||||||
|
1 - the link_to is a path to a file (out_item is used, out_dir_tab will not be empty)
|
||||||
|
|
||||||
|
error:
|
||||||
|
2 - incorrect link_to
|
||||||
|
3 - there is not a root dir
|
||||||
|
4 - current_dir_tab was empty
|
||||||
|
|
||||||
|
current_dir_tab can be the same container as out_dir_tab
|
||||||
|
link_to can be a relative path (without the first slash) and can contain ".." or "."
|
||||||
|
*/
|
||||||
|
int Dirs::FollowLink(const std::vector<Item*> & current_dir_tab, const std::wstring & link_to,
|
||||||
|
std::vector<Item*> & out_dir_tab, std::wstring & out_item)
|
||||||
|
{
|
||||||
|
temp_link_to = link_to; // link_to can be from the out_item and would be cleared next
|
||||||
|
out_item.clear();
|
||||||
|
|
||||||
|
if( current_dir_tab.empty() )
|
||||||
|
return 4;
|
||||||
|
|
||||||
|
if( temp_link_to.empty() )
|
||||||
|
{
|
||||||
|
CopyDirTab(current_dir_tab, out_dir_tab);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( temp_link_to[0] == '/' )
|
||||||
|
{
|
||||||
|
// temp_link_to is an absolute path
|
||||||
|
Item * pdir = GetRootDir();
|
||||||
|
|
||||||
|
if( !pdir )
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
out_dir_tab.clear();
|
||||||
|
out_dir_tab.push_back(pdir);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// temp_link_to is a relative path
|
||||||
|
CopyDirTab(current_dir_tab, out_dir_tab);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FollowLink(out_dir_tab, temp_link_to, out_item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Dirs::SplitPath(const std::wstring & path, std::wstring & dir, std::wstring & file)
|
||||||
|
{
|
||||||
|
std::wstring::size_type i;
|
||||||
|
|
||||||
dir.clear();
|
dir.clear();
|
||||||
file.clear();
|
file.clear();
|
||||||
@@ -386,15 +677,78 @@ void Dirs::SplitPath(const std::string & path, std::string & dir, std::string &
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// !! dodac kasowanie z bazy
|
||||||
bool Dirs::DelDir(long dir_id)
|
bool Dirs::DelDir(long dir_id)
|
||||||
{
|
{
|
||||||
return dir_table.DelById(dir_id);
|
return dir_tab.DelById(dir_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Error Dirs::AddDirectory(Item & item, bool add_to_dir_tab, Item ** pdir, int notify_code)
|
||||||
|
{
|
||||||
|
if( pdir )
|
||||||
|
*pdir = 0;
|
||||||
|
|
||||||
|
if( item.type != Item::dir )
|
||||||
|
return WINIX_ERR_DIR_EXPECTED;
|
||||||
|
|
||||||
|
Error status = db->AddItem(item);
|
||||||
|
|
||||||
|
if( status == WINIX_ERR_OK )
|
||||||
|
{
|
||||||
|
Item * d = AddDir(item);
|
||||||
|
|
||||||
|
if( add_to_dir_tab && !cur->request->dir_tab.empty() && cur->request->dir_tab.back()->id == item.parent_id )
|
||||||
|
cur->request->dir_tab.push_back(d);
|
||||||
|
|
||||||
|
if( pdir )
|
||||||
|
*pdir = d;
|
||||||
|
|
||||||
|
if( notify_code )
|
||||||
|
notify->ItemChanged(notify_code, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Item * Dirs::CreateVarDir()
|
||||||
|
{
|
||||||
|
Item * var = GetVarDir();
|
||||||
|
|
||||||
|
if( var )
|
||||||
|
return var;
|
||||||
|
|
||||||
|
Item v;
|
||||||
|
Item * root = GetRootDir();
|
||||||
|
|
||||||
|
if( root )
|
||||||
|
{
|
||||||
|
v.parent_id = root->id;
|
||||||
|
v.user_id = root->user_id;
|
||||||
|
v.group_id = root->group_id;
|
||||||
|
v.privileges = root->privileges;
|
||||||
|
v.subject = L"var";
|
||||||
|
v.url = L"var";
|
||||||
|
v.type = Item::dir;
|
||||||
|
|
||||||
|
AddDirectory(v, false, &var);
|
||||||
|
}
|
||||||
|
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// printing first and last slash
|
||||||
|
void Dirs::LogDir(const std::vector<Item*> & dir_tab)
|
||||||
|
{
|
||||||
|
log << '/';
|
||||||
|
|
||||||
|
// skipping the first (root) directory
|
||||||
|
for(size_t i=1 ; i<dir_tab.size() ; ++i)
|
||||||
|
log << dir_tab[i]->url << '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
81
core/dirs.h
81
core/dirs.h
@@ -2,13 +2,13 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoredirs
|
#ifndef headerfile_winix_core_dirs
|
||||||
#define headerfilecmslucoredirs
|
#define headerfile_winix_core_dirs
|
||||||
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "dircontainer.h"
|
#include "dircontainer.h"
|
||||||
|
#include "db/db.h"
|
||||||
|
#include "request.h"
|
||||||
|
#include "notify/notify.h"
|
||||||
|
|
||||||
|
|
||||||
// we do not support '..' in a path (for simplicity and security reasons)
|
// we do not support '..' in a path (for simplicity and security reasons)
|
||||||
@@ -28,44 +31,86 @@ public:
|
|||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
void ReadDirs();
|
void ReadDirs();
|
||||||
|
|
||||||
|
void SetCur(Cur * pcur);
|
||||||
|
void SetDb(Db * pdb);
|
||||||
|
void SetNotify(Notify * pnotify);
|
||||||
|
|
||||||
// these methods return false if there is no such a dir
|
// these methods return false if there is no such a dir
|
||||||
bool IsDir(long dir_id);
|
bool IsDir(long dir_id);
|
||||||
bool GetDirChilds(long parent_id, std::vector<Item*> & childs_table);
|
bool GetDirChilds(long parent_id, std::vector<Item*> & childs_tab); // !! zamienic na GetChilds()
|
||||||
bool MakePath(long dir_id, std::string & path);
|
bool MakePath(long dir_id, std::wstring & path, bool clear_path = true);
|
||||||
|
void MakePath(const std::vector<Item*> dir_tab, std::wstring & path, bool clear_path = true);
|
||||||
bool ChangeParent(long dir_id, long new_parent_id);
|
bool ChangeParent(long dir_id, long new_parent_id);
|
||||||
|
|
||||||
bool HasParent(long dir_id, long parent_id);
|
bool HasParent(long dir_id, long parent_id);
|
||||||
|
|
||||||
bool DelDir(long dir_id);
|
bool DelDir(long dir_id);
|
||||||
|
|
||||||
int AnalyzePath(const std::string & path, long & dir_id, std::string & dir, std::string & file);
|
// if returns true then out_dir_tab is not empty
|
||||||
static void SplitPath(const std::string & path, std::string & dir, std::string & file);
|
bool CreateDirTab(long dir_id, std::vector<Item*> & out_dir_tab);
|
||||||
|
|
||||||
DirContainer::ParentIterator FindFirstParent(long parent_id);
|
void LogDir(const std::vector<Item*> & dir_tab);
|
||||||
DirContainer::ParentIterator NextParent(DirContainer::ParentIterator i);
|
|
||||||
DirContainer::ParentIterator ParentEnd();
|
int AnalyzePath(const std::wstring & path, long & dir_id, std::wstring & dir, std::wstring & file);
|
||||||
|
int FollowLink(const std::vector<Item*> & current_dir_tab, const std::wstring & link_to,
|
||||||
|
std::vector<Item*> & out_dir_tab, std::wstring & out_item);
|
||||||
|
static void SplitPath(const std::wstring & path, std::wstring & dir, std::wstring & file);
|
||||||
|
|
||||||
|
DirContainer::ParentIterator FindFirstChild(long parent_id);
|
||||||
|
DirContainer::ParentIterator NextChild(DirContainer::ParentIterator i);
|
||||||
|
DirContainer::ParentIterator ParentEnd(); // !! pozostalo do zamiany na child
|
||||||
|
|
||||||
|
|
||||||
// these methods return null if there is no such a dir
|
// these methods return null if there is no such a dir
|
||||||
|
// !! zmienic nazwy wskazujace ze operujemy tylko na lokalnej tablicy
|
||||||
Item * GetRootDir();
|
Item * GetRootDir();
|
||||||
Item * GetEtcDir();
|
Item * GetEtcDir();
|
||||||
Item * GetDir(const std::string & name, long parent);
|
Item * GetVarDir();
|
||||||
Item * GetDir(const std::string & path);
|
|
||||||
|
Item * GetDir(const wchar_t * name, long parent);
|
||||||
|
Item * GetDir(const std::wstring & name, long parent);
|
||||||
|
Item * GetDir(const wchar_t * path);
|
||||||
|
Item * GetDir(const std::wstring & path);
|
||||||
Item * GetDir(long id);
|
Item * GetDir(long id);
|
||||||
Item * AddDir(const Item & item);
|
Item * AddDir(const Item & item);
|
||||||
|
|
||||||
void CheckRootDir();
|
void CheckRootDir();
|
||||||
|
|
||||||
|
Item * CreateVarDir();
|
||||||
|
|
||||||
|
// !! jak juz wczesniejsze nazwy beda zmienione to tutaj damy AddDir() /AddDir() juz istnieje przeciez?/
|
||||||
|
Error AddDirectory(Item & item, bool add_to_dir_tab = false, Item ** pdir = 0, int notify_code = 0);
|
||||||
|
|
||||||
|
// returns how many levels of directories there are
|
||||||
|
// "/" -> 0 (root dir)
|
||||||
|
// "/abc" -> 1
|
||||||
|
// "/abc/def" -> 2
|
||||||
|
size_t DirLevel(long id);
|
||||||
|
|
||||||
|
// checking if child_id is really a child of parent_id
|
||||||
|
bool IsChild(long parent_id, long child_id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
DirContainer dir_table;
|
Cur * cur;
|
||||||
|
Db * db;
|
||||||
|
Notify * notify;
|
||||||
|
|
||||||
size_t AnalyzeDir(Item * pdir, const std::string & path, long & dir_id, std::string & dir);
|
DirContainer dir_tab;
|
||||||
std::string analyze_temp;
|
std::wstring temp_path;
|
||||||
|
std::wstring temp_link_to;
|
||||||
|
|
||||||
bool ExtractName(const char * & s, std::string & name);
|
size_t AnalyzeDir(Item * pdir, const std::wstring & path, long & dir_id, std::wstring & dir);
|
||||||
|
bool AnalyzeDir(std::vector<Item*> & dir_tab, const std::wstring & link_to, size_t & i);
|
||||||
|
std::wstring analyze_temp;
|
||||||
|
std::wstring get_dir_temp;
|
||||||
|
|
||||||
|
void CopyDirTab(const std::vector<Item*> & in, std::vector<Item*> & out);
|
||||||
|
int FollowLink(std::vector<Item*> & dir_tab, const std::wstring & link_to, std::wstring & out_item);
|
||||||
|
|
||||||
|
bool ExtractName(const wchar_t * & s, std::wstring & name);
|
||||||
|
bool HasReadExecAccessForRoot(const Item & item);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
25
core/error.h
25
core/error.h
@@ -2,16 +2,16 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreerror
|
#ifndef headerfile_winix_core_error
|
||||||
#define headerfilecmslucoreerror
|
#define headerfile_winix_core_error
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
#define WINIX_ERR_OK 0
|
#define WINIX_ERR_OK 0
|
||||||
//#define WINIX_ERR_INCORRECT_PATH 1
|
//#define WINIX_ERR_INCORRECT_PATH 1
|
||||||
@@ -48,14 +48,13 @@
|
|||||||
|
|
||||||
#define WINIX_ERR_NO_TICKET 24
|
#define WINIX_ERR_NO_TICKET 24
|
||||||
|
|
||||||
#define WINIX_ERR_PASSWORDS_DIFFERENT 25
|
//#define WINIX_ERR_PASSWORDS_DIFFERENT 25
|
||||||
#define WINIX_ERR_PASSWORD_TOO_SHORT 26
|
//#define WINIX_ERR_PASSWORD_TOO_SHORT 26
|
||||||
#define WINIX_ERR_USER_EXISTS 27
|
//#define WINIX_ERR_USER_EXISTS 27
|
||||||
#define WINIX_ERR_LOGIN_EMPTY 28
|
//#define WINIX_ERR_LOGIN_EMPTY 28
|
||||||
#define WINIX_DIFFERENT_MOUNT_POINTS 29
|
#define WINIX_DIFFERENT_MOUNT_POINTS 29
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define WINIX_ERR_DB_FATAL_ERROR_DURING_CONNECTING 100
|
#define WINIX_ERR_DB_FATAL_ERROR_DURING_CONNECTING 100
|
||||||
#define WINIX_ERR_DB_INCORRECT_QUERY 101
|
#define WINIX_ERR_DB_INCORRECT_QUERY 101
|
||||||
#define WINIX_ERR_DB_INCORRENT_RESULT_STATUS 102
|
#define WINIX_ERR_DB_INCORRENT_RESULT_STATUS 102
|
||||||
@@ -64,8 +63,14 @@
|
|||||||
#define WINIX_ERR_DB_MORE_THAN_ONE_LOGIN 105
|
#define WINIX_ERR_DB_MORE_THAN_ONE_LOGIN 105
|
||||||
#define WINIX_ERR_DB_ERR_CURRVAL 106
|
#define WINIX_ERR_DB_ERR_CURRVAL 106
|
||||||
|
|
||||||
|
#define WINIX_ERR_FILE_EXPECTED 107
|
||||||
|
#define WINIX_ERR_DIR_EXPECTED 108
|
||||||
|
|
||||||
//#define WINIX_ERR_UNKNOWN 1000
|
//#define WINIX_ERR_UNKNOWN 1000
|
||||||
|
#define WINIX_NOTHING_TO_DO 109
|
||||||
|
#define WINIX_ERR_INCORRECT_URI 110
|
||||||
|
|
||||||
|
#define WINIX_ERR_INTERNAL_ERROR 2000
|
||||||
|
|
||||||
|
|
||||||
typedef int Error;
|
typedef int Error;
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "function.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function::Function()
|
|
||||||
{
|
|
||||||
code = FUN_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Function::Clear()
|
|
||||||
{
|
|
||||||
code = FUN_NONE;
|
|
||||||
item.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Function::Function(const Function & f)
|
|
||||||
{
|
|
||||||
code = f.code;
|
|
||||||
item = f.item;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function & Function::operator=(const Function & f)
|
|
||||||
{
|
|
||||||
code = f.code;
|
|
||||||
item = f.item;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucorefunction
|
|
||||||
#define headerfilecmslucorefunction
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "item.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define FUN_NONE 0
|
|
||||||
#define FUN_LS 1
|
|
||||||
#define FUN_CAT 2
|
|
||||||
#define FUN_NODE 3
|
|
||||||
#define FUN_EMACS 4
|
|
||||||
#define FUN_MKDIR 5
|
|
||||||
#define FUN_DEFAULT 6
|
|
||||||
#define FUN_PRIV 7
|
|
||||||
#define FUN_RM 8
|
|
||||||
#define FUN_LOGIN 9
|
|
||||||
#define FUN_LOGOUT 10
|
|
||||||
#define FUN_RUN 11
|
|
||||||
#define FUN_WHO 12
|
|
||||||
#define FUN_LAST 13
|
|
||||||
#define FUN_CREATETHREAD 14
|
|
||||||
#define FUN_THREAD 15
|
|
||||||
#define FUN_RELOAD 16
|
|
||||||
#define FUN_UPLOAD 17
|
|
||||||
#define FUN_CREATETICKET 18
|
|
||||||
#define FUN_EDITTICKET 19
|
|
||||||
#define FUN_TICKET 20
|
|
||||||
#define FUN_UPTIME 21
|
|
||||||
#define FUN_MV 23
|
|
||||||
#define FUN_UNAME 24
|
|
||||||
#define FUN_CHMOD 25
|
|
||||||
#define FUN_CHOWN 26
|
|
||||||
#define FUN_CKEDITOR 27
|
|
||||||
#define FUN_DOWNLOAD 28
|
|
||||||
#define FUN_ADDUSER 29
|
|
||||||
#define FUN_SUBJECT 30
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Function
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
int code;
|
|
||||||
Item item;
|
|
||||||
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
Function();
|
|
||||||
Function(const Function & f);
|
|
||||||
Function & operator=(const Function & f);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "functioncodeparser.h"
|
|
||||||
#include "function.h"
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool FunctionCodeParser::ContentHasOneRow(const Item & item)
|
|
||||||
{
|
|
||||||
for(size_t i=0 ; i<item.content.size() ; ++i)
|
|
||||||
if( item.content[i] == '\n' )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int FunctionCodeParser::ParseValue(const char * s)
|
|
||||||
{
|
|
||||||
if( strncmp(s, "[fun:", 5) != 0 )
|
|
||||||
return FUN_NONE;
|
|
||||||
|
|
||||||
const char * send;
|
|
||||||
int result = strtol(s+5, (char**)&send, 10);
|
|
||||||
|
|
||||||
if( send==s+5 || strcmp(send, "]") != 0 )
|
|
||||||
return FUN_NONE;
|
|
||||||
|
|
||||||
log << log2 << "FCP: function code: " << result << logend;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int FunctionCodeParser::Parse(const Item & item)
|
|
||||||
{
|
|
||||||
// format: [fun:1]
|
|
||||||
// minimum size: 7 characters
|
|
||||||
if( item.content.size() < 7 )
|
|
||||||
return FUN_NONE;
|
|
||||||
|
|
||||||
if( !ContentHasOneRow(item) )
|
|
||||||
return FUN_NONE;
|
|
||||||
|
|
||||||
return ParseValue(item.content.c_str());
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucorefunctioncodeparser
|
|
||||||
#define headerfilecmslucorefunctioncodeparser
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <cstdlib>
|
|
||||||
|
|
||||||
#include "item.h"
|
|
||||||
|
|
||||||
|
|
||||||
class FunctionCodeParser
|
|
||||||
{
|
|
||||||
bool ContentHasOneRow(const Item & item);
|
|
||||||
int ParseValue(const char * s);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
int Parse(const Item & item);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "functionparser.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "item.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "data.h"
|
|
||||||
#include "db.h"
|
|
||||||
#include "request.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::SkipEmptyString(const char * msg)
|
|
||||||
{
|
|
||||||
for( ; get_index != get_table_len && request.get_table[get_index].empty() ; ++get_index )
|
|
||||||
log << log3 << msg << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::ParseDirectories()
|
|
||||||
{
|
|
||||||
Item * pdir = data.dirs.GetRootDir();
|
|
||||||
|
|
||||||
if( !pdir )
|
|
||||||
{
|
|
||||||
// there is no the root dir
|
|
||||||
request.status = WINIX_ERR_NO_ROOT_DIR;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
while( true )
|
|
||||||
{
|
|
||||||
request.dir_table.push_back( pdir );
|
|
||||||
log << log3 << "FP: Directory: ";
|
|
||||||
|
|
||||||
if( pdir->parent_id == -1 )
|
|
||||||
log << "(root)" << logend;
|
|
||||||
else
|
|
||||||
log << pdir->url << logend;
|
|
||||||
|
|
||||||
SkipEmptyString("FP: Directory: skipped empty string");
|
|
||||||
|
|
||||||
if( get_index == get_table_len )
|
|
||||||
break;
|
|
||||||
|
|
||||||
pdir = data.dirs.GetDir(request.get_table[get_index], pdir->id);
|
|
||||||
|
|
||||||
if( !pdir )
|
|
||||||
break;
|
|
||||||
|
|
||||||
++get_index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::ParseItem()
|
|
||||||
{
|
|
||||||
SkipEmptyString("FP: Item: skipped empty string");
|
|
||||||
|
|
||||||
if( get_index == get_table_len )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// request.dir_table has at least one element
|
|
||||||
long parent_id = request.dir_table.back()->id;
|
|
||||||
const std::string & url = request.get_table[get_index];
|
|
||||||
|
|
||||||
request.status = db.GetItem(parent_id, url, request.item);
|
|
||||||
|
|
||||||
if( request.status == WINIX_ERR_OK )
|
|
||||||
{
|
|
||||||
if( request.role == Request::authorizer && request.item.auth == Item::auth_none )
|
|
||||||
{
|
|
||||||
log << log1 << "FP: item.url: " << url << " exists but has not a static content (authorizer role)" << logend;
|
|
||||||
request.status = WINIX_ERR_NO_ITEM;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
++get_index;
|
|
||||||
request.is_item = true;
|
|
||||||
log << log3 << "FP: Item: id: " << request.item.id << ", url: " << request.item.url << logend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log << log3 << "FP: No Item: url: " << url << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::ParseFunction()
|
|
||||||
{
|
|
||||||
SkipEmptyString("FP: Function: skipped empty string");
|
|
||||||
|
|
||||||
if( get_index == get_table_len )
|
|
||||||
return;
|
|
||||||
|
|
||||||
request.pfunction = data.functions.GetFunction(request.get_table[get_index]);
|
|
||||||
|
|
||||||
|
|
||||||
if( request.pfunction )
|
|
||||||
{
|
|
||||||
++get_index;
|
|
||||||
log << log3 << "FP: Function: " << request.pfunction->item.url << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::ParseParams()
|
|
||||||
{
|
|
||||||
while( true )
|
|
||||||
{
|
|
||||||
SkipEmptyString("FP: Params: skipped empty string");
|
|
||||||
|
|
||||||
if( get_index == get_table_len )
|
|
||||||
break;
|
|
||||||
|
|
||||||
request.param_table.push_back( &request.get_table[get_index] );
|
|
||||||
log << log3 << "FP: Params: " << request.get_table[get_index] << logend;
|
|
||||||
|
|
||||||
++get_index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FunctionParser::Parse()
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_OK;
|
|
||||||
get_index = 0;
|
|
||||||
get_table_len = request.get_table.size();
|
|
||||||
request.pfunction = 0;
|
|
||||||
request.is_item = false;
|
|
||||||
|
|
||||||
ParseDirectories();
|
|
||||||
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
ParseFunction();
|
|
||||||
|
|
||||||
if( !request.pfunction )
|
|
||||||
{
|
|
||||||
ParseItem();
|
|
||||||
|
|
||||||
if( request.status != WINIX_ERR_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
ParseFunction();
|
|
||||||
|
|
||||||
if( !request.pfunction && get_index != get_table_len )
|
|
||||||
{
|
|
||||||
request.status = WINIX_ERR_NO_FUNCTION;
|
|
||||||
log << log3 << "FP: Parse: unknown function: \"" << request.get_table[get_index] << "\"" << logend;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ParseParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucorefunctionparser
|
|
||||||
#define headerfilecmslucorefunctionparser
|
|
||||||
|
|
||||||
#include "requesttypes.h"
|
|
||||||
|
|
||||||
|
|
||||||
class FunctionParser
|
|
||||||
{
|
|
||||||
GetTable::size_type get_index;
|
|
||||||
GetTable::size_type get_table_len;
|
|
||||||
|
|
||||||
void SkipEmptyString(const char * msg);
|
|
||||||
|
|
||||||
void ParseDirectories();
|
|
||||||
void ParseItem();
|
|
||||||
bool IsAppFunction();
|
|
||||||
void ParseFunction();
|
|
||||||
void ParseParams();
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
|
|
||||||
void Parse();
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "functions.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Functions::Clear()
|
|
||||||
{
|
|
||||||
table.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Functions::AddFun(int code, const char * url)
|
|
||||||
{
|
|
||||||
fun.code = code;
|
|
||||||
fun.item.url = url;
|
|
||||||
table.insert( std::make_pair(fun.item.url, fun) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// in the future we will read these functions from the database
|
|
||||||
void Functions::ReadFunctions()
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
|
|
||||||
fun.item.user_id = -1;
|
|
||||||
fun.item.group_id = -1;
|
|
||||||
fun.item.privileges = 0755;
|
|
||||||
fun.item.parent_id = -1; // !! temporarily doesn't matter
|
|
||||||
fun.item.id = -1;
|
|
||||||
fun.item.type = Item::file;
|
|
||||||
|
|
||||||
|
|
||||||
AddFun(FUN_LS, "ls");
|
|
||||||
AddFun(FUN_CAT, "cat");
|
|
||||||
AddFun(FUN_NODE, "node");
|
|
||||||
AddFun(FUN_EMACS, "emacs");
|
|
||||||
AddFun(FUN_MKDIR, "mkdir");
|
|
||||||
AddFun(FUN_DEFAULT, "default");
|
|
||||||
AddFun(FUN_PRIV, "priv");
|
|
||||||
AddFun(FUN_RM, "rm");
|
|
||||||
AddFun(FUN_LOGOUT, "logout");
|
|
||||||
AddFun(FUN_LOGIN, "login");
|
|
||||||
AddFun(FUN_RUN, "run");
|
|
||||||
AddFun(FUN_WHO, "who");
|
|
||||||
AddFun(FUN_LAST, "last");
|
|
||||||
AddFun(FUN_CREATETHREAD, "createthread");
|
|
||||||
AddFun(FUN_THREAD, "thread");
|
|
||||||
AddFun(FUN_UPLOAD, "upload");
|
|
||||||
AddFun(FUN_CREATETICKET, "createticket");
|
|
||||||
AddFun(FUN_EDITTICKET, "editticket");
|
|
||||||
AddFun(FUN_TICKET, "ticket");
|
|
||||||
AddFun(FUN_UPTIME, "uptime");
|
|
||||||
AddFun(FUN_MV, "mv");
|
|
||||||
AddFun(FUN_UNAME, "uname");
|
|
||||||
AddFun(FUN_CHMOD, "chmod");
|
|
||||||
AddFun(FUN_CHOWN, "chown");
|
|
||||||
AddFun(FUN_CKEDITOR, "ckeditor");
|
|
||||||
AddFun(FUN_DOWNLOAD, "download");
|
|
||||||
AddFun(FUN_ADDUSER, "adduser");
|
|
||||||
AddFun(FUN_SUBJECT, "subject");
|
|
||||||
|
|
||||||
|
|
||||||
// functions which need more privileges
|
|
||||||
fun.item.privileges = 0700;
|
|
||||||
|
|
||||||
AddFun(FUN_RELOAD, "reload");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function * Functions::GetFunction(const std::string & name)
|
|
||||||
{
|
|
||||||
Table::iterator i = table.find(name);
|
|
||||||
|
|
||||||
if( i == table.end() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return &(i->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// !! in the future there will be a special container where we can search through the Code object
|
|
||||||
Function * Functions::GetFunction(int code)
|
|
||||||
{
|
|
||||||
Table::iterator i = table.begin();
|
|
||||||
|
|
||||||
for( ; i != table.end() ; ++i )
|
|
||||||
{
|
|
||||||
if( i->second.code == code )
|
|
||||||
return &(i->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucorefunctions
|
|
||||||
#define headerfilecmslucorefunctions
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "function.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Functions
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef std::map<std::string, Function> Table;
|
|
||||||
Table table;
|
|
||||||
|
|
||||||
Function fun;
|
|
||||||
|
|
||||||
void AddFun(int code, const char * url);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
|
|
||||||
void Clear();
|
|
||||||
void ReadFunctions();
|
|
||||||
|
|
||||||
Function * GetFunction(const std::string & name);
|
|
||||||
Function * GetFunction(int code);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucoregetparser
|
|
||||||
#define headerfilecmslucoregetparser
|
|
||||||
|
|
||||||
#include "httpsimpleparser.h"
|
|
||||||
#include "requesttypes.h"
|
|
||||||
|
|
||||||
|
|
||||||
class GetParser : public HttpSimpleParser
|
|
||||||
{
|
|
||||||
|
|
||||||
const char * get_string;
|
|
||||||
GetTable & get_table;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual int GetChar()
|
|
||||||
{
|
|
||||||
if( !get_string || *get_string == 0 )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return (int)(unsigned char)*(get_string++);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual void Parameter(std::string &, std::string & value)
|
|
||||||
{
|
|
||||||
get_table.push_back(value);
|
|
||||||
|
|
||||||
log << log2 << "Get, value: \"" << value << "\"" << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
GetParser(const char * get_string_, GetTable & get_table_) : get_string(get_string_), get_table(get_table_)
|
|
||||||
{
|
|
||||||
HttpSimpleParser::separator = '/';
|
|
||||||
HttpSimpleParser::read_name = false;
|
|
||||||
|
|
||||||
if( get_string && *get_string == separator ) // one '/' at the beginning
|
|
||||||
++get_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -7,8 +7,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoregroup
|
#ifndef headerfile_winix_core_group
|
||||||
#define headerfilecmslucoregroup
|
#define headerfile_winix_core_group
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
struct Group
|
struct Group
|
||||||
{
|
{
|
||||||
long id;
|
long id;
|
||||||
std::string name; // group name
|
std::wstring name; // group name
|
||||||
std::vector<long> members; // users id
|
std::vector<long> members; // users id
|
||||||
|
|
||||||
Group()
|
Group()
|
||||||
|
|||||||
@@ -2,13 +2,12 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "groups.h"
|
#include "groups.h"
|
||||||
#include "db.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,11 +24,11 @@ void Groups::Clear()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Groups::ReadGroups()
|
void Groups::ReadGroups(Db * db)
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
db.GetGroups(table);
|
db->GetGroups(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ return &(*i);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Group * Groups::GetGroup(const std::string & name)
|
Group * Groups::GetGroup(const std::wstring & name)
|
||||||
{
|
{
|
||||||
Table::Iterator i = table.FindName(name);
|
Table::Iterator i = table.FindName(name);
|
||||||
|
|
||||||
@@ -55,7 +54,7 @@ return &(*i);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
long Groups::GetGroupId(const std::string & name)
|
long Groups::GetGroupId(const std::wstring & name)
|
||||||
{
|
{
|
||||||
Group * pgroup = GetGroup(name);
|
Group * pgroup = GetGroup(name);
|
||||||
|
|
||||||
@@ -87,9 +86,9 @@ Groups::SizeType Groups::Size()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Group & Groups::operator[](Groups::SizeType pos)
|
bool Groups::Remove(long group_id)
|
||||||
{
|
{
|
||||||
return table[pos];
|
return table.Remove(group_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,18 +2,20 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoregroups
|
#ifndef headerfile_winix_core_groups
|
||||||
#define headerfilecmslucoregroups
|
#define headerfile_winix_core_groups
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "group.h"
|
#include "group.h"
|
||||||
#include "ugcontainer.h"
|
#include "ugcontainer.h"
|
||||||
|
#include "db/db.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Groups
|
class Groups
|
||||||
@@ -29,14 +31,14 @@ public:
|
|||||||
|
|
||||||
Groups();
|
Groups();
|
||||||
void Clear();
|
void Clear();
|
||||||
void ReadGroups();
|
void ReadGroups(Db * db);
|
||||||
Group * GetGroup(long group_id);
|
Group * GetGroup(long group_id);
|
||||||
Group * GetGroup(const std::string & name);
|
Group * GetGroup(const std::wstring & name);
|
||||||
long GetGroupId(const std::string & name);
|
long GetGroupId(const std::wstring & name);
|
||||||
Iterator Begin();
|
Iterator Begin();
|
||||||
Iterator End();
|
Iterator End();
|
||||||
SizeType Size();
|
SizeType Size();
|
||||||
Group & operator[](SizeType pos);
|
bool Remove(long group_id);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
1106
core/htmlfilter.cpp
1106
core/htmlfilter.cpp
File diff suppressed because it is too large
Load Diff
@@ -2,28 +2,41 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorehtmlfilter
|
#ifndef headerfile_winix_core_htmlfilter
|
||||||
#define headerfilecmslucorehtmlfilter
|
#define headerfile_winix_core_htmlfilter
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// max length of a name of a html tag (with terminating null)
|
// max length of a name of a html tag (with terminating null)
|
||||||
#define WINIX_HTMLFILTER_ITEM_MAXLEN 30
|
#define WINIX_HTMLFILTER_ITEM_NAME_MAXLEN 30
|
||||||
|
|
||||||
|
// max length of a html lang attribute (e.g. "en", "pl")
|
||||||
|
#define WINIX_HTMLFILTER_ITEM_LANG_MAXLEN 10
|
||||||
|
|
||||||
|
|
||||||
|
#define WINIX_HTMLFILTER_ATTR_NAME_MAXLEN 40
|
||||||
|
|
||||||
|
|
||||||
|
#define WINIX_HTMLFILTER_ATTR_VALUE_MAXLEN 500
|
||||||
|
|
||||||
|
|
||||||
// depth of the html tree
|
// depth of the html tree
|
||||||
#define WINIX_HTMLFILTER_STACK_MAXLEN 100
|
#define WINIX_HTMLFILTER_STACK_MAXLEN 100
|
||||||
|
|
||||||
// length of a buffer used for printing
|
// length of a buffer used for printing
|
||||||
// it should be at least: WINIX_HTMLFILTER_ITEM_MAXLEN+3
|
// it should be at least: WINIX_HTMLFILTER_ITEM_NAME_MAXLEN+3
|
||||||
#define WINIX_HTMLFILTER_BUFFER_MAXLEN 1024
|
#define WINIX_HTMLFILTER_BUFFER_MAXLEN 2048
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -48,20 +61,35 @@ class HTMLFilter
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
enum OrphanMode
|
||||||
|
{
|
||||||
|
orphan_nbsp, // putting " " string
|
||||||
|
orphan_160space // putting 160 ascii code
|
||||||
|
};
|
||||||
|
|
||||||
HTMLFilter();
|
HTMLFilter();
|
||||||
HTMLFilter(const HTMLFilter & f);
|
HTMLFilter(const HTMLFilter & f);
|
||||||
HTMLFilter & operator=(const HTMLFilter & f);
|
HTMLFilter & operator=(const HTMLFilter & f);
|
||||||
~HTMLFilter();
|
~HTMLFilter();
|
||||||
|
|
||||||
// main methods used for filtering
|
|
||||||
void Filter(const char * in, std::string & out);
|
|
||||||
void Filter(const std::string & in, std::string & out);
|
|
||||||
|
|
||||||
// insert a white space into long lines
|
// main methods used for filtering
|
||||||
// only between html tags
|
void Filter(const wchar_t * in, std::wstring & out);
|
||||||
|
void Filter(const std::wstring & in, std::wstring & out);
|
||||||
|
|
||||||
|
|
||||||
|
// insert a white space into long words
|
||||||
|
// (only between html tags)
|
||||||
// skipped in such tags: script, pre, textarea
|
// skipped in such tags: script, pre, textarea
|
||||||
// false by default
|
// break_after - after how many characters insert a space (0 - off)
|
||||||
void BreakLongLines(bool break_lines);
|
void BreakWord(size_t break_after_);
|
||||||
|
|
||||||
|
// insert a new line character into long lines
|
||||||
|
// (only between html tags)
|
||||||
|
// skipped in such tags: script, pre, textarea
|
||||||
|
// wrap_line - after how many characters wrap a line (0 - off)
|
||||||
|
// lines are wrapped only in 'body' tag (useful for text in 'title' tag which is in 'head' section)
|
||||||
|
void WrapLine(size_t wrap_line_);
|
||||||
|
|
||||||
// trimming white characters (with new lines)
|
// trimming white characters (with new lines)
|
||||||
// at the beginning, at the end and in the middle of a string
|
// at the beginning, at the end and in the middle of a string
|
||||||
@@ -71,93 +99,198 @@ public:
|
|||||||
// false by default
|
// false by default
|
||||||
void TrimWhite(bool trim);
|
void TrimWhite(bool trim);
|
||||||
|
|
||||||
|
|
||||||
// first tabs in a tree
|
// first tabs in a tree
|
||||||
// default: 2 (spaces)
|
// default: 2 (spaces)
|
||||||
// set 0 to turn off
|
// set 0 to turn off
|
||||||
void InsertTabs(size_t tabsize);
|
void InsertTabs(size_t tabsize);
|
||||||
|
|
||||||
|
|
||||||
|
// orphans are checked only in 'body' tag
|
||||||
|
void AssignOrphans(const wchar_t * lang_code, const std::vector<std::wstring> & otab);
|
||||||
|
void AssignOrphans(const std::wstring & lang_code, const std::vector<std::wstring> & otab);
|
||||||
|
void ClearOrphans();
|
||||||
|
|
||||||
|
|
||||||
|
// check 'orphans' for the specicic language
|
||||||
|
// if an orphan is detected then the non-break space (" " or ascii 160 code) will be put
|
||||||
|
// default disable (lang_none)
|
||||||
|
void OrphansMode(OrphanMode mode = orphan_nbsp);
|
||||||
|
|
||||||
|
|
||||||
|
// skipping some unsafe tags
|
||||||
|
// (script, iframe, frame, frameset, applet, head, meta, html, link, body, ...)
|
||||||
|
void SafeMode(bool safe_mode_);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
// orphans for one language
|
||||||
|
struct Orphans
|
||||||
|
{
|
||||||
|
std::vector<std::wstring> tab;
|
||||||
|
size_t max_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// orphans for all languages
|
||||||
|
// map<language_code, Orphans>
|
||||||
|
typedef std::map<std::wstring, Orphans> OrphansTab;
|
||||||
|
OrphansTab orphans_tab;
|
||||||
|
|
||||||
|
|
||||||
struct Item
|
struct Item
|
||||||
{
|
{
|
||||||
char name[WINIX_HTMLFILTER_ITEM_MAXLEN];
|
std::wstring name; // max size: WINIX_HTMLFILTER_ITEM_NAME_MAXLEN
|
||||||
size_t name_len;
|
|
||||||
|
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
opening,
|
opening, /* sample: <h1> */
|
||||||
closing,
|
closing, /* sample: </h1> */
|
||||||
simple,
|
simple, /* sample: <br/> */
|
||||||
special,
|
special, /* sample: <!doctype> */
|
||||||
none
|
none
|
||||||
} type;
|
} type;
|
||||||
|
|
||||||
// is there a new line after this tag
|
// is there a new line after this tag
|
||||||
bool new_line;
|
bool new_line;
|
||||||
|
|
||||||
|
// current orphans table
|
||||||
|
// (will be propagated)
|
||||||
|
Orphans * porphans;
|
||||||
|
|
||||||
|
// this item or one from its parents is a 'body' html tag
|
||||||
|
// (will be propagated)
|
||||||
|
bool has_body_tag;
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
Item();
|
Item();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// only this method have direct access to the output string
|
/*
|
||||||
// you can easily change the output from a std::string to something else
|
virtual methods
|
||||||
void Put(const char * str, const char * end);
|
*/
|
||||||
|
virtual void Init();
|
||||||
|
virtual void Uninit();
|
||||||
|
|
||||||
|
virtual bool IsOpeningTagMark();
|
||||||
|
virtual bool IsOpeningCommentaryTagMark();
|
||||||
|
virtual bool IsClosingTagMark();
|
||||||
|
virtual bool IsClosingXmlSimpleTagMark();
|
||||||
|
|
||||||
|
virtual bool IsValidCharForName(int c);
|
||||||
|
virtual bool IsValidCharForAttrName(int c);
|
||||||
|
virtual void CheckExceptions();
|
||||||
|
virtual bool SkipCommentaryTagIfExists();
|
||||||
|
|
||||||
|
virtual void Put(wchar_t c);
|
||||||
|
virtual void Put(const wchar_t * str);
|
||||||
|
virtual void Put(const wchar_t * str, const wchar_t * end);
|
||||||
|
virtual void Put(const std::wstring & str);
|
||||||
|
|
||||||
|
virtual void PutOpeningTagMark();
|
||||||
|
virtual void PutClosingTagMark();
|
||||||
|
virtual bool PutOpeningTag();
|
||||||
|
virtual void PutClosingTag(const wchar_t * tag);
|
||||||
|
|
||||||
|
virtual void PutNormalText(const wchar_t * str, const wchar_t * end);
|
||||||
|
virtual void ReadNormalTextSkipWhite(const wchar_t * & start, const wchar_t * & last_non_white);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
others
|
||||||
|
*/
|
||||||
Item & GetItem(size_t i);
|
Item & GetItem(size_t i);
|
||||||
Item & LastItem();
|
Item & LastItem();
|
||||||
|
|
||||||
int ToLower(int c);
|
wchar_t ToLower(wchar_t c);
|
||||||
bool IsNameEqual(const char * name1, const char * name2);
|
void ToLower(std::wstring & str);
|
||||||
bool IsNameEqual(const char * name1, const char * name2, size_t len);
|
|
||||||
bool IsLastTag(const char * name);
|
bool IsNameEqual(const wchar_t * name1, const wchar_t * name2);
|
||||||
|
bool IsNameEqual(const wchar_t * name1, const std::wstring & name2);
|
||||||
|
bool IsNameEqual(const std::wstring & name1, const wchar_t * name2);
|
||||||
|
bool IsNameEqual(const std::wstring & name1, const std::wstring & name2);
|
||||||
|
|
||||||
|
bool IsNameEqual(const wchar_t * name1, const wchar_t * name2, size_t len);
|
||||||
|
bool IsNameEqual(const wchar_t * name1, const std::wstring & name2, size_t len);
|
||||||
|
bool IsNameEqual(const std::wstring & name1, const wchar_t * name2, size_t len);
|
||||||
|
bool IsNameEqual(const std::wstring & name1, const std::wstring & name2, size_t len);
|
||||||
|
|
||||||
|
bool IsLastTag(const wchar_t * name);
|
||||||
|
bool IsTagSafe(const wchar_t * tag);
|
||||||
|
bool IsTagSafe(const std::wstring & tag);
|
||||||
|
|
||||||
|
int CheckOrphan(const wchar_t * str, const wchar_t * end, const std::wstring & orphan_str);
|
||||||
|
bool CheckOrphan(const wchar_t * str, const wchar_t * end, const std::vector<std::wstring> & orphans);
|
||||||
|
bool CheckOrphan(const wchar_t * str, const wchar_t * end);
|
||||||
|
|
||||||
bool IsWhite(int c);
|
bool IsWhite(int c);
|
||||||
void SkipWhite();
|
void SkipWhite();
|
||||||
void SkipWhiteLines();
|
void SkipWhiteLines();
|
||||||
bool SkipTagCheck();
|
void SkipWhiteWithFirstNewLine();
|
||||||
void SkipNormalText();
|
void SkipWhiteLines(const wchar_t * & str, const wchar_t * end);
|
||||||
bool IsOpeningCommentaryTag();
|
bool IsClosingTagForLastItem();
|
||||||
bool SkipCommentaryTagIfExists();
|
size_t OpeningCommentaryTagMarkSize();
|
||||||
void SkipItem();
|
void SkipAndCheckClosingTag();
|
||||||
void SkipItemCheckXmlSimple();
|
|
||||||
|
|
||||||
void PopStack();
|
void PopStack();
|
||||||
bool PushStack();
|
bool PushStack();
|
||||||
bool IsValidCharForName(int c);
|
|
||||||
void CheckNewLine();
|
void CheckNewLine();
|
||||||
void CheckExceptions();
|
void CheckStackPrintRest();
|
||||||
void AddForgottenTags();
|
void AddForgottenTags();
|
||||||
void CheckClosingTags();
|
void CheckClosingTags();
|
||||||
void ReadNormalText();
|
void ReadNormalText();
|
||||||
void PrintRest();
|
bool PrintRest();
|
||||||
void PrintItem(const char * start, const char * end);
|
bool PrintOpeningItem();
|
||||||
void ReadItemName();
|
void ReadItemName();
|
||||||
|
void ReadItemAttrName();
|
||||||
|
void ReadItemAttrValue(bool has_quote);
|
||||||
|
|
||||||
|
bool ReadItemAttr();
|
||||||
|
bool CheckItemAttr();
|
||||||
|
void PrinItemAttr();
|
||||||
|
|
||||||
|
void ReadItemClosing();
|
||||||
|
void ReadItemSpecial();
|
||||||
|
void ReadItemOpening();
|
||||||
bool ReadItem();
|
bool ReadItem();
|
||||||
|
void ReadLoop();
|
||||||
void Read();
|
void Read();
|
||||||
|
|
||||||
size_t PutTrimFillBuffer(const char * & str, const char * & end);
|
void CheckChar(wchar_t c);
|
||||||
void PutTrim(const char * str, const char * end);
|
|
||||||
void PutLastTagWithClosingTag();
|
|
||||||
void PutOpeningTag(const char * tag);
|
|
||||||
void PutClosingTag(const char * tag);
|
|
||||||
void PutTabs(size_t len);
|
|
||||||
void PutNewLine();
|
|
||||||
|
|
||||||
const char * pchar;
|
void CheckLineWrap();
|
||||||
|
bool HasSemiloconAround(const wchar_t * str, const wchar_t * end);
|
||||||
|
void PutNormalNonWhite(const wchar_t * & str, const wchar_t * end);
|
||||||
|
void PutNormalWhite(const wchar_t * & str, const wchar_t * end);
|
||||||
|
void PutLastTagWithClosingTag();
|
||||||
|
void PutTabs(size_t len);
|
||||||
|
void PutNonBreakingSpace();
|
||||||
|
void PutNewLine();
|
||||||
|
void CalcOrphansMaxLen(Orphans & orphans);
|
||||||
|
|
||||||
|
const wchar_t * pchar;
|
||||||
Item empty;
|
Item empty;
|
||||||
Item * pstack; // stack pointer
|
Item * pstack; // stack pointer
|
||||||
size_t stack_len; // length of the stack
|
size_t stack_len; // length of the stack
|
||||||
char * buffer; // buffer used when printing
|
wchar_t * buffer; // buffer used when printing
|
||||||
std::string * out_string;
|
std::wstring * out_string;
|
||||||
bool last_new_line;
|
bool last_new_line;
|
||||||
bool break_long_lines; // insert a space into long lines
|
size_t break_after; // insert a space into long words after 'break_after' characters
|
||||||
|
size_t wrap_line; // insert a new line character into long lines
|
||||||
bool trim_white; // trimming white characters
|
bool trim_white; // trimming white characters
|
||||||
size_t tab_size;
|
size_t tab_size;
|
||||||
|
OrphanMode orphan_mode;
|
||||||
|
std::wstring attr_name;
|
||||||
|
std::wstring attr_value;
|
||||||
|
std::wstring attr_value_lower;
|
||||||
|
bool attr_has_value;
|
||||||
|
std::wstring lang_code_lower;
|
||||||
|
size_t line_len; //length of the current line (without first spaces which create the html tree)
|
||||||
|
bool safe_mode; // skipping some unsafe tags
|
||||||
|
Orphans orphans_temp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorehttpsimpleparser
|
#ifndef headerfile_winix_core_httpsimpleparser
|
||||||
#define headerfilecmslucorehttpsimpleparser
|
#define headerfile_winix_core_httpsimpleparser
|
||||||
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -46,7 +46,7 @@ protected:
|
|||||||
void TrimWhiteChars(std::string & s);
|
void TrimWhiteChars(std::string & s);
|
||||||
void CheckSpecialChar();
|
void CheckSpecialChar();
|
||||||
|
|
||||||
|
void Parse();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -60,12 +60,6 @@ public:
|
|||||||
skip_white_chars = false;
|
skip_white_chars = false;
|
||||||
recognize_special_chars = true;
|
recognize_special_chars = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Parse();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
594
core/image.cpp
Executable file
594
core/image.cpp
Executable file
@@ -0,0 +1,594 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
#include "image.h"
|
||||||
|
#include "utf8/utf8.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "system.h"
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "lock.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Image::SetDb(Db * pdb)
|
||||||
|
{
|
||||||
|
db = pdb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Image::SetConfig(Config * pconfig)
|
||||||
|
{
|
||||||
|
config = pconfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Image::SetSystem(System * psystem)
|
||||||
|
{
|
||||||
|
system = psystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
Image::Scale Image::GetImageScale(long dir_id)
|
||||||
|
{
|
||||||
|
Scale scale;
|
||||||
|
|
||||||
|
Mount * m = system->mounts.CalcMount(dir_id);
|
||||||
|
scale.cx = config->image_cx;
|
||||||
|
scale.cy = config->image_cy;
|
||||||
|
scale.aspect_mode = config->image_mode;
|
||||||
|
scale.quality = config->image_quality;
|
||||||
|
|
||||||
|
// reading width and height from the mount point (if exists)
|
||||||
|
int index = system->mounts.MountParImageSize();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 2 )
|
||||||
|
{
|
||||||
|
scale.cx = Tol(m->param[index].arg[0]);
|
||||||
|
scale.cy = Tol(m->param[index].arg[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reading image mode from the mount point (if exists)
|
||||||
|
index = system->mounts.MountParImageMode();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
|
||||||
|
scale.aspect_mode = Toi(m->param[index].arg[0]);
|
||||||
|
|
||||||
|
// reading image quality from the mount point (if exists)
|
||||||
|
index = system->mounts.MountParImageQuality();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
|
||||||
|
scale.quality = Toi(m->param[index].arg[0]);
|
||||||
|
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
Image::Scale Image::GetThumbScale(long dir_id)
|
||||||
|
{
|
||||||
|
Scale scale;
|
||||||
|
|
||||||
|
Mount * m = system->mounts.CalcMount(dir_id);
|
||||||
|
scale.cx = config->thumb_cx;
|
||||||
|
scale.cy = config->thumb_cy;
|
||||||
|
scale.aspect_mode = config->thumb_mode;
|
||||||
|
scale.quality = config->thumb_quality;
|
||||||
|
|
||||||
|
// reading width and height from the mount point (if exists)
|
||||||
|
int index = system->mounts.MountParThumbSize();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 2 )
|
||||||
|
{
|
||||||
|
scale.cx = Tol(m->param[index].arg[0]);
|
||||||
|
scale.cy = Tol(m->param[index].arg[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reading thumb mode from the mount point (if exists)
|
||||||
|
index = system->mounts.MountParThumbMode();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
|
||||||
|
scale.aspect_mode = Toi(m->param[index].arg[0]);
|
||||||
|
|
||||||
|
// reading image quality from the mount point (if exists)
|
||||||
|
index = system->mounts.MountParThumbQuality();
|
||||||
|
|
||||||
|
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
|
||||||
|
scale.quality = Toi(m->param[index].arg[0]);
|
||||||
|
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Image::Resize(long file_id, size_t cx, size_t cy, int aspect_mode, int quality)
|
||||||
|
{
|
||||||
|
item_temp.type = WINIX_IMAGE_TYPE_RESIZE;
|
||||||
|
item_temp.file_id = file_id;
|
||||||
|
item_temp.cx = cx;
|
||||||
|
item_temp.cy = cy;
|
||||||
|
item_temp.aspect_mode = aspect_mode;
|
||||||
|
item_temp.quality = quality;
|
||||||
|
|
||||||
|
CheckParam(item_temp);
|
||||||
|
image_tab.insert(image_tab.end(), item_temp);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Image::CreateThumb(long file_id, size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality)
|
||||||
|
{
|
||||||
|
item_temp.type = WINIX_IMAGE_TYPE_CREATE_THUMB;
|
||||||
|
item_temp.file_id = file_id;
|
||||||
|
item_temp.thumb_cx = thumb_cx;
|
||||||
|
item_temp.thumb_cy = thumb_cy;
|
||||||
|
item_temp.aspect_mode = aspect_mode;
|
||||||
|
item_temp.quality = quality;
|
||||||
|
|
||||||
|
CheckParam(item_temp);
|
||||||
|
image_tab.insert(image_tab.end(), item_temp);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Image::Crop(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality)
|
||||||
|
{
|
||||||
|
item_temp.type = WINIX_IMAGE_TYPE_CROP;
|
||||||
|
item_temp.file_id = file_id;
|
||||||
|
item_temp.xoffset = xoffset;
|
||||||
|
item_temp.yoffset = yoffset;
|
||||||
|
item_temp.cx = cx;
|
||||||
|
item_temp.cy = cy;
|
||||||
|
item_temp.quality = quality;
|
||||||
|
|
||||||
|
CheckParam(item_temp);
|
||||||
|
image_tab.insert(image_tab.end(), item_temp);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Image::CropThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality)
|
||||||
|
{
|
||||||
|
item_temp.type = WINIX_IMAGE_TYPE_CROP_THUMB;
|
||||||
|
item_temp.file_id = file_id;
|
||||||
|
item_temp.xoffset = xoffset;
|
||||||
|
item_temp.yoffset = yoffset;
|
||||||
|
item_temp.cx = cx;
|
||||||
|
item_temp.cy = cy;
|
||||||
|
item_temp.quality = quality;
|
||||||
|
|
||||||
|
CheckParam(item_temp);
|
||||||
|
image_tab.insert(image_tab.end(), item_temp);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Image::CropNewThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy,
|
||||||
|
size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality)
|
||||||
|
{
|
||||||
|
item_temp.type = WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB;
|
||||||
|
item_temp.file_id = file_id;
|
||||||
|
item_temp.xoffset = xoffset;
|
||||||
|
item_temp.yoffset = yoffset;
|
||||||
|
item_temp.cx = cx;
|
||||||
|
item_temp.cy = cy;
|
||||||
|
item_temp.thumb_cx = thumb_cx;
|
||||||
|
item_temp.thumb_cy = thumb_cy;
|
||||||
|
item_temp.aspect_mode = aspect_mode;
|
||||||
|
item_temp.quality = quality;
|
||||||
|
|
||||||
|
CheckParam(item_temp);
|
||||||
|
image_tab.insert(image_tab.end(), item_temp);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Image::CheckParam(ImageItem & item)
|
||||||
|
{
|
||||||
|
SetMinMax(item.aspect_mode, 1, 7);
|
||||||
|
SetMinMax(item.quality, 0, 100);
|
||||||
|
SetMinMax(item.cx, 1, 30000);
|
||||||
|
SetMinMax(item.cy, 1, 30000);
|
||||||
|
SetMinMax(item.thumb_cx, 1, 30000);
|
||||||
|
SetMinMax(item.thumb_cy, 1, 30000);
|
||||||
|
SetMinMax(item.xoffset, 0, 30000);
|
||||||
|
SetMinMax(item.yoffset, 0, 30000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects locked)
|
||||||
|
bool Image::SignalReceived()
|
||||||
|
{
|
||||||
|
return !image_tab.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects not locked)
|
||||||
|
void Image::Do()
|
||||||
|
{
|
||||||
|
ImageTab::iterator i;
|
||||||
|
bool end;
|
||||||
|
|
||||||
|
Lock();
|
||||||
|
i = image_tab.begin();
|
||||||
|
Unlock();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
class Lock lock_object(synchro);
|
||||||
|
|
||||||
|
if( i != image_tab.end() )
|
||||||
|
{
|
||||||
|
item_work = *i;
|
||||||
|
image_tab.erase(i++);
|
||||||
|
end = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
end = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock_object.Unlock();
|
||||||
|
|
||||||
|
if( !end )
|
||||||
|
CreateImage();
|
||||||
|
|
||||||
|
}
|
||||||
|
while( !end && !IsExitSignal() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Image::Add(const std::wstring & in, TextStream<std::string> & out)
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(in, add_tempa);
|
||||||
|
out << add_tempa;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Image::EscapePath(const std::string & path, TextStream<std::string> & out, bool clear_stream)
|
||||||
|
{
|
||||||
|
if( clear_stream )
|
||||||
|
out.Clear();
|
||||||
|
|
||||||
|
out << '"';
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<path.size() ; ++i)
|
||||||
|
{
|
||||||
|
if( path[i] == '"' )
|
||||||
|
out << '\\';
|
||||||
|
|
||||||
|
if( path[i] != 0 )
|
||||||
|
out << path[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
out << '\"';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
from: http://www.imagemagick.org/script/command-line-processing.php#geometry
|
||||||
|
|
||||||
|
scale% Height and width both scaled by specified percentage.
|
||||||
|
scale-x%xscale-y% Height and width individually scaled by specified percentages. (Only one % symbol needed.)
|
||||||
|
width Width given, height automagically selected to preserve aspect ratio.
|
||||||
|
xheight Height given, width automagically selected to preserve aspect ratio.
|
||||||
|
widthxheight Maximum values of height and width given, aspect ratio preserved.
|
||||||
|
widthxheight^ Minimum values of width and height given, aspect ratio preserved.
|
||||||
|
widthxheight! Width and height emphatically given, original aspect ratio ignored.
|
||||||
|
widthxheight> Change as per widthxheight but only if an image dimension exceeds a specified dimension.
|
||||||
|
widthxheight< Change dimensions only if both image dimensions exceed specified dimensions.
|
||||||
|
*/
|
||||||
|
void Image::SelectAspect(size_t cx, size_t cy)
|
||||||
|
{
|
||||||
|
switch( item_work.aspect_mode )
|
||||||
|
{
|
||||||
|
case WINIX_IMAGE_MODE_1:
|
||||||
|
command << cx;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_3:
|
||||||
|
command << cx << "x" << cy;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_4:
|
||||||
|
command << '"' << cx << "x" << cy << "^\"";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_5:
|
||||||
|
command << '"' << cx << "x" << cy << "!\"";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_6:
|
||||||
|
command << '"' << cx << "x" << cy << ">\"";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_7:
|
||||||
|
command << '"' << cx << "x" << cy << "<\"";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WINIX_IMAGE_MODE_2:
|
||||||
|
default:
|
||||||
|
command << "x" << cy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects locked)
|
||||||
|
bool Image::CreateInputFileName()
|
||||||
|
{
|
||||||
|
bool thumb = (item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB);
|
||||||
|
|
||||||
|
if( thumb && !file_work.has_thumb )
|
||||||
|
{
|
||||||
|
log << log1 << "Image: file id: " << file_work.id << ", url: " << file_work.url
|
||||||
|
<< " doesn't have a thumbnail yet (skipping)" << logend;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( system->MakeFilePath(file_work, src_path, thumb) )
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(src_path, input_file_name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log << log1 << "Image: cannot create a source path" << logend;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects locked)
|
||||||
|
void Image::CreateTmpFileName()
|
||||||
|
{
|
||||||
|
stream_tmp_path.Clear();
|
||||||
|
stream_tmp_path << config->upload_dir << L"/tmp/image_" << std::time(0);
|
||||||
|
PT::WideToUTF8(stream_tmp_path.Str(), tmp_file_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects are not locked)
|
||||||
|
bool Image::CreateCommand()
|
||||||
|
{
|
||||||
|
class Lock lock_object(synchro);
|
||||||
|
|
||||||
|
iq.SetAll(true, false);
|
||||||
|
iq.WhereId(item_work.file_id);
|
||||||
|
|
||||||
|
// the file could have been changed especially when there is a long queue of files
|
||||||
|
if( db->GetItem(file_work, iq) != WINIX_ERR_OK )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( !CreateInputFileName() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
command.Clear();
|
||||||
|
Add(config->convert_cmd, command);
|
||||||
|
|
||||||
|
command << " ";
|
||||||
|
EscapePath(input_file_name, command, false);
|
||||||
|
command << " -quiet -quality " << item_work.quality;
|
||||||
|
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_RESIZE )
|
||||||
|
{
|
||||||
|
command << " -resize ";
|
||||||
|
SelectAspect(item_work.cx, item_work.cy);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB )
|
||||||
|
{
|
||||||
|
command << " -strip -thumbnail ";
|
||||||
|
SelectAspect(item_work.thumb_cx, item_work.thumb_cy);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CROP )
|
||||||
|
{
|
||||||
|
command << " -crop " << item_work.cx << "x" << item_work.cy
|
||||||
|
<< "+" << item_work.xoffset << "+" << item_work.yoffset << " +repage ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB )
|
||||||
|
{
|
||||||
|
command << " -strip -crop " << item_work.cx << "x" << item_work.cy
|
||||||
|
<< "+" << item_work.xoffset << "+" << item_work.yoffset
|
||||||
|
<< " +repage ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB )
|
||||||
|
{
|
||||||
|
command << " -strip -crop " << item_work.cx << "x" << item_work.cy
|
||||||
|
<< "+" << item_work.xoffset << "+" << item_work.yoffset
|
||||||
|
<< " +repage -thumbnail ";
|
||||||
|
SelectAspect(item_work.thumb_cx, item_work.thumb_cy);
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateTmpFileName();
|
||||||
|
|
||||||
|
command << " ";
|
||||||
|
EscapePath(tmp_file_name, command, false);
|
||||||
|
|
||||||
|
log << log4 << "Image: running: " << command.Str() << logend;
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects are locked)
|
||||||
|
void Image::ImageSavedCorrectly()
|
||||||
|
{
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB )
|
||||||
|
{
|
||||||
|
if( !file_work.has_thumb )
|
||||||
|
{
|
||||||
|
file_work.has_thumb = true;
|
||||||
|
db->EditHasThumbById(true, file_work.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
log << log3 << "Image: generated a thumbnail: " << dst_path << logend;
|
||||||
|
plugin.Call((Session*)0, WINIX_CREATED_THUMB, &file_work);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_RESIZE )
|
||||||
|
{
|
||||||
|
log << log3 << "Image: image resized: " << dst_path << logend;
|
||||||
|
plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CROP )
|
||||||
|
{
|
||||||
|
log << log3 << "Image: image cropped: " << dst_path << logend;
|
||||||
|
// !! IMPROVE ME add a correct message
|
||||||
|
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB )
|
||||||
|
{
|
||||||
|
log << log3 << "Image: image thumbnail cropped: " << dst_path << logend;
|
||||||
|
// !! IMPROVE ME add a correct message
|
||||||
|
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB )
|
||||||
|
{
|
||||||
|
log << log3 << "Image: a new thumbnail from an original image was cropped: " << dst_path << logend;
|
||||||
|
// !! IMPROVE ME add a correct message
|
||||||
|
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects are not locked)
|
||||||
|
void Image::SaveImage()
|
||||||
|
{
|
||||||
|
class Lock lock_object(synchro);
|
||||||
|
|
||||||
|
// the file could have been changed especially when creating the image lasted too long
|
||||||
|
iq.SetAll(true, false);
|
||||||
|
iq.WhereId(item_work.file_id);
|
||||||
|
|
||||||
|
if( db->GetItem(file_work, iq) == WINIX_ERR_OK )
|
||||||
|
{
|
||||||
|
bool thumb = (item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB ||
|
||||||
|
item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB ||
|
||||||
|
item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB );
|
||||||
|
|
||||||
|
if( system->MakeFilePath(file_work, dst_path, thumb, true, config->upload_dirs_chmod) )
|
||||||
|
{
|
||||||
|
if( RenameFile(stream_tmp_path.Str(), dst_path) )
|
||||||
|
{
|
||||||
|
ImageSavedCorrectly();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log << log1 << "Image: cannot move a temporary file: " << stream_tmp_path.Str()
|
||||||
|
<< ", to: " << dst_path << logend;
|
||||||
|
|
||||||
|
::RemoveFile(stream_tmp_path.Str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log << log1 << "Image: cannot create a destination path" << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects are not locked)
|
||||||
|
void Image::CreateImage()
|
||||||
|
{
|
||||||
|
if( CreateCommand() )
|
||||||
|
{
|
||||||
|
int res = std::system(command.CStr());
|
||||||
|
|
||||||
|
if( res == 0 )
|
||||||
|
{
|
||||||
|
SaveImage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
class Lock lock_object(synchro);
|
||||||
|
log << log3 << "Image: some problems with creating an image"
|
||||||
|
<< ", 'convert' process returned: " << res << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects are not locked)
|
||||||
|
// !! there is a problem with GIF files
|
||||||
|
// Bus error (core dumped)
|
||||||
|
/*
|
||||||
|
#include "wand/MagickWand.h"
|
||||||
|
|
||||||
|
// compiler options:
|
||||||
|
// include: -I/usr/local/include/ImageMagick
|
||||||
|
// link with: `MagickWand-config --ldflags --libs`
|
||||||
|
|
||||||
|
void Image::CreateThumbnail()
|
||||||
|
{
|
||||||
|
PT::WideToUTF8(item_work.source, sourcea);
|
||||||
|
PT::WideToUTF8(item_work.dst, dsta);
|
||||||
|
|
||||||
|
MagickWandGenesis();
|
||||||
|
|
||||||
|
MagickWand * wand = NewMagickWand();
|
||||||
|
|
||||||
|
if( MagickReadImage(wand, sourcea.c_str()) )
|
||||||
|
{
|
||||||
|
MagickThumbnailImage(wand, item_work.cx, item_work.cy);
|
||||||
|
|
||||||
|
if( MagickWriteImage(wand, dsta.c_str()) )
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
log << log3 << "Image: created a thumbnail: " << dsta << logend;
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DestroyMagickWand(wand);
|
||||||
|
|
||||||
|
MagickWandTerminus();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
182
core/image.h
Executable file
182
core/image.h
Executable file
@@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_image
|
||||||
|
#define headerfile_winix_core_image
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
#include "basethread.h"
|
||||||
|
#include "textstream.h"
|
||||||
|
#include "db/db.h"
|
||||||
|
#include "core/item.h"
|
||||||
|
#include "core/config.h"
|
||||||
|
|
||||||
|
|
||||||
|
class System;
|
||||||
|
|
||||||
|
|
||||||
|
// aspect modes:
|
||||||
|
// Width given, height automagically selected to preserve aspect ratio.
|
||||||
|
#define WINIX_IMAGE_MODE_1 1
|
||||||
|
|
||||||
|
// Height given, width automagically selected to preserve aspect ratio.
|
||||||
|
#define WINIX_IMAGE_MODE_2 2
|
||||||
|
|
||||||
|
// Maximum values of height and width given, aspect ratio preserved.
|
||||||
|
#define WINIX_IMAGE_MODE_3 3
|
||||||
|
|
||||||
|
// Minimum values of width and height given, aspect ratio preserved.
|
||||||
|
#define WINIX_IMAGE_MODE_4 4
|
||||||
|
|
||||||
|
// Width and height emphatically given, original aspect ratio ignored.
|
||||||
|
#define WINIX_IMAGE_MODE_5 5
|
||||||
|
|
||||||
|
// Change as per widthxheight but only if an image dimension exceeds a specified dimension.
|
||||||
|
#define WINIX_IMAGE_MODE_6 6
|
||||||
|
|
||||||
|
// Change dimensions only if both image dimensions are less than specified dimensions.
|
||||||
|
#define WINIX_IMAGE_MODE_7 7
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// resizing
|
||||||
|
#define WINIX_IMAGE_TYPE_RESIZE 1
|
||||||
|
|
||||||
|
// generating a thumbnail
|
||||||
|
#define WINIX_IMAGE_TYPE_CREATE_THUMB 2
|
||||||
|
|
||||||
|
// cropping an image
|
||||||
|
#define WINIX_IMAGE_TYPE_CROP 3
|
||||||
|
|
||||||
|
// cropping an thumbnail
|
||||||
|
#define WINIX_IMAGE_TYPE_CROP_THUMB 4
|
||||||
|
|
||||||
|
// creating by cropping a new thumbnail (from an original image)
|
||||||
|
#define WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB 5
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
*/
|
||||||
|
class Image : public BaseThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct Scale
|
||||||
|
{
|
||||||
|
size_t cx;
|
||||||
|
size_t cy;
|
||||||
|
int aspect_mode;
|
||||||
|
int quality;
|
||||||
|
|
||||||
|
Scale()
|
||||||
|
{
|
||||||
|
cx = cy = 1;
|
||||||
|
aspect_mode = 2;
|
||||||
|
quality = 100;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void SetDb(Db * pdb);
|
||||||
|
void SetConfig(Config * pconfig);
|
||||||
|
void SetSystem(System * psystem);
|
||||||
|
|
||||||
|
|
||||||
|
// returning scale info for a directory
|
||||||
|
Scale GetImageScale(long dir_id);
|
||||||
|
|
||||||
|
// returning scale info (for thumbnails) for a directory
|
||||||
|
Scale GetThumbScale(long dir_id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Resize(long file_id, size_t cx, size_t cy, int aspect_mode, int quality);
|
||||||
|
|
||||||
|
// creating a new thumbnail from an original image
|
||||||
|
void CreateThumb(long file_id, size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality);
|
||||||
|
|
||||||
|
// cropping an image (the thumbnail is not changed)
|
||||||
|
void Crop(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality);
|
||||||
|
|
||||||
|
// cropping an existing thumbnail
|
||||||
|
void CropThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality);
|
||||||
|
|
||||||
|
// creating and cropping a new thumbnail (from an original image)
|
||||||
|
void CropNewThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy,
|
||||||
|
size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Db * db;
|
||||||
|
Config * config;
|
||||||
|
System * system;
|
||||||
|
|
||||||
|
struct ImageItem
|
||||||
|
{
|
||||||
|
int type; // WINIX_IMAGE_TYPE_*
|
||||||
|
long file_id;
|
||||||
|
size_t cx;
|
||||||
|
size_t cy;
|
||||||
|
size_t xoffset; // xoffset and yoffset are used when cropping
|
||||||
|
size_t yoffset;
|
||||||
|
size_t thumb_cx;
|
||||||
|
size_t thumb_cy;
|
||||||
|
int aspect_mode;
|
||||||
|
int quality;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename int_type>
|
||||||
|
void SetMinMax(int_type & var, int var_min, int var_max)
|
||||||
|
{
|
||||||
|
if( static_cast<int>(var) < var_min )
|
||||||
|
var = var_min;
|
||||||
|
|
||||||
|
if( static_cast<int>(var) > var_max )
|
||||||
|
var = var_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// queue of thumbnails to create
|
||||||
|
typedef std::list<ImageItem> ImageTab;
|
||||||
|
ImageTab image_tab;
|
||||||
|
ImageItem item_temp;
|
||||||
|
|
||||||
|
// only for second thread
|
||||||
|
ImageItem item_work;
|
||||||
|
std::wstring src_path, dst_path;
|
||||||
|
TextStream<std::string> command;
|
||||||
|
TextStream<std::wstring> stream_tmp_path;
|
||||||
|
DbItemQuery iq;
|
||||||
|
std::string add_tempa;
|
||||||
|
std::string input_file_name;
|
||||||
|
std::string tmp_file_name;
|
||||||
|
Item file_work;
|
||||||
|
|
||||||
|
virtual bool SignalReceived();
|
||||||
|
virtual void Do();
|
||||||
|
bool CreateCommand();
|
||||||
|
bool CreateInputFileName();
|
||||||
|
void CreateTmpFileName();
|
||||||
|
void SaveImage();
|
||||||
|
void CreateImage();
|
||||||
|
void SelectAspect(size_t cx, size_t cy);
|
||||||
|
void EscapePath(const std::string & path, TextStream<std::string> & out, bool clear_stream = true);
|
||||||
|
void CheckParam(ImageItem & item);
|
||||||
|
void Add(const std::wstring & in, TextStream<std::string> & out);
|
||||||
|
void ImageSavedCorrectly();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
148
core/ipban.h
Normal file
148
core/ipban.h
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_ipban
|
||||||
|
#define headerfile_winix_core_ipban
|
||||||
|
|
||||||
|
|
||||||
|
// telling if the IPBan record is active
|
||||||
|
// we have two records: active and non active
|
||||||
|
// non active records is something like a history
|
||||||
|
// it is used to remember the last ban level
|
||||||
|
// so based on this in the future a next greater ban can be calculated
|
||||||
|
#define WINIX_IPBAN_FLAG_ACTIVE 1
|
||||||
|
|
||||||
|
// current ban level
|
||||||
|
// (if one of these flag is set and the record is active then it means the IP is banned at the moment)
|
||||||
|
// level 1: banned for short time
|
||||||
|
// level 2: can be set after level 1 has expired and the attacker still have not given up
|
||||||
|
// banned for some longer time in level 1
|
||||||
|
// level 3: can be set after level 2
|
||||||
|
// banned for much more time
|
||||||
|
#define WINIX_IPBAN_FLAG_BAN_LEVEL1 2
|
||||||
|
#define WINIX_IPBAN_FLAG_BAN_LEVEL2 4
|
||||||
|
#define WINIX_IPBAN_FLAG_BAN_LEVEL3 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
struct defining some restrictions to an IP address
|
||||||
|
*/
|
||||||
|
struct IPBan
|
||||||
|
{
|
||||||
|
// at the moment only IPv4 are supported
|
||||||
|
int ip;
|
||||||
|
|
||||||
|
// one or more flags from WINIX_IPBAN_FLAG_*
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
// when this record was last used
|
||||||
|
time_t last_used;
|
||||||
|
|
||||||
|
// when the restrictions (ban) should be removed
|
||||||
|
// valid only if some of WINIX_IPBAN_FLAG_BAN_LEVELX flags are set
|
||||||
|
// actually we do not remove the record but unsets WINIX_IPBAN_FLAG_ACTIVE flag
|
||||||
|
// so in the future we can check whether we need to change
|
||||||
|
// the ban level to a greater value
|
||||||
|
time_t expires;
|
||||||
|
|
||||||
|
// how many incorrect login attempts there are
|
||||||
|
unsigned int incorrect_login_events;
|
||||||
|
|
||||||
|
// in the future there can be more *_events fields
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool HasFlag(int flag) const
|
||||||
|
{
|
||||||
|
return (flags & flag) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetFlag(int flag)
|
||||||
|
{
|
||||||
|
flags = flags | flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ClearFlag(int flag)
|
||||||
|
{
|
||||||
|
flags = flags & (~flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IsIPBanned() const
|
||||||
|
{
|
||||||
|
if( !HasFlag(WINIX_IPBAN_FLAG_ACTIVE) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1) ||
|
||||||
|
HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2) ||
|
||||||
|
HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AddNextBanLevel(time_t level1_expires, time_t level2_expires, time_t level3_expires)
|
||||||
|
{
|
||||||
|
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3) )
|
||||||
|
{
|
||||||
|
expires = level3_expires;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2) )
|
||||||
|
{
|
||||||
|
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3);
|
||||||
|
expires = level3_expires;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1) )
|
||||||
|
{
|
||||||
|
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2);
|
||||||
|
expires = level2_expires;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1);
|
||||||
|
expires = level1_expires;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IPBan()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
ip = 0;
|
||||||
|
flags = 0;
|
||||||
|
last_used = 0;
|
||||||
|
expires = 0;
|
||||||
|
incorrect_login_events = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ClearAfterRemovingBan()
|
||||||
|
{
|
||||||
|
ClearFlag(WINIX_IPBAN_FLAG_ACTIVE);
|
||||||
|
incorrect_login_events = 0;
|
||||||
|
expires = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
221
core/ipbancontainer.cpp
Normal file
221
core/ipbancontainer.cpp
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include "ipbancontainer.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "date/date.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IPBanContainer::IPBanContainer()
|
||||||
|
{
|
||||||
|
is_ipban_tab_sorted = true; // an empty list is sorted
|
||||||
|
soft_max_size = 100;
|
||||||
|
max_size = 110;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IPBanContainer::SetMaxSize(size_t soft_size, size_t size)
|
||||||
|
{
|
||||||
|
soft_max_size = soft_size;
|
||||||
|
max_size = size;
|
||||||
|
|
||||||
|
if( max_size < soft_max_size )
|
||||||
|
max_size = soft_max_size + 1;
|
||||||
|
|
||||||
|
ipban_tab.reserve(max_size);
|
||||||
|
sort_helper_tab.reserve(max_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returning a reference to the added (or existed) record
|
||||||
|
IPBan & IPBanContainer::AddIP(int ip)
|
||||||
|
{
|
||||||
|
IPBan * old_ip_ban = FindIP(ip);
|
||||||
|
|
||||||
|
if( !old_ip_ban )
|
||||||
|
{
|
||||||
|
IPBan ip_ban;
|
||||||
|
ip_ban.ip = ip;
|
||||||
|
|
||||||
|
if( ipban_tab.size() >= max_size )
|
||||||
|
RemoveOldRecords();
|
||||||
|
|
||||||
|
ipban_tab.push_back(ip_ban);
|
||||||
|
is_ipban_tab_sorted = false;
|
||||||
|
return ipban_tab.back();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return *old_ip_ban;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IPBanContainer::RemoveIP(int ip)
|
||||||
|
{
|
||||||
|
IPBan * ipban = FindIP(ip);
|
||||||
|
|
||||||
|
if( ipban )
|
||||||
|
{
|
||||||
|
size_t index = ipban - &ipban_tab[0];
|
||||||
|
ipban_tab.erase(ipban_tab.begin() + index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IPBanContainer::IsSorted()
|
||||||
|
{
|
||||||
|
return is_ipban_tab_sorted;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IPBanContainer::Clear()
|
||||||
|
{
|
||||||
|
ipban_tab.clear();
|
||||||
|
is_ipban_tab_sorted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// we need to remove some old records for the size of the container
|
||||||
|
// to be less or equal to soft_max_size
|
||||||
|
void IPBanContainer::RemoveOldRecords()
|
||||||
|
{
|
||||||
|
size_t to_remove = 0;
|
||||||
|
|
||||||
|
if( ipban_tab.size() >= soft_max_size )
|
||||||
|
to_remove = ipban_tab.size() - soft_max_size;
|
||||||
|
|
||||||
|
if( to_remove > 0 )
|
||||||
|
{
|
||||||
|
sort_helper_tab.resize(ipban_tab.size());
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
|
||||||
|
sort_helper_tab[i] = i;
|
||||||
|
|
||||||
|
std::sort(sort_helper_tab.begin(), sort_helper_tab.end(), SortByLastUsedHelper(this));
|
||||||
|
sort_helper_tab.resize(to_remove);
|
||||||
|
std::sort(sort_helper_tab.begin(), sort_helper_tab.end());
|
||||||
|
|
||||||
|
while( to_remove-- > 0 )
|
||||||
|
ipban_tab.erase(ipban_tab.begin() + sort_helper_tab[to_remove]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// for debug purposes
|
||||||
|
void IPBanContainer::PrintTab()
|
||||||
|
{
|
||||||
|
log << log4 << "ipban_tab (size: " << ipban_tab.size() << ")" << logend;
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
|
||||||
|
{
|
||||||
|
log << log4 << i << ": ip: " << ipban_tab[i].ip << ", flags: " << ipban_tab[i].flags << ", last_used: ";
|
||||||
|
|
||||||
|
PT::Date date(ipban_tab[i].last_used);
|
||||||
|
log << date << ", expires: ";
|
||||||
|
|
||||||
|
date = ipban_tab[i].expires;
|
||||||
|
log << date << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// for debug purposes
|
||||||
|
void IPBanContainer::PrintTab2()
|
||||||
|
{
|
||||||
|
log << log4 << "sort_helper_tab (size: " << sort_helper_tab.size() << ")" << logend;
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<sort_helper_tab.size() ; ++i)
|
||||||
|
{
|
||||||
|
IPBan & ipban = ipban_tab[sort_helper_tab[i]];
|
||||||
|
|
||||||
|
log << log4 << i << ": ip: " << ipban.ip << ", flags: " << ipban.flags << ", last_used: ";
|
||||||
|
|
||||||
|
PT::Date date(ipban.last_used);
|
||||||
|
log << date << ", expires: ";
|
||||||
|
|
||||||
|
date = ipban.expires;
|
||||||
|
log << date << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IPBanContainer::SortByLastUsedHelper::operator()(size_t index1, size_t index2)
|
||||||
|
{
|
||||||
|
if( index1 < container->ipban_tab.size() &&
|
||||||
|
index2 < container->ipban_tab.size() )
|
||||||
|
{
|
||||||
|
IPBan & ip1 = container->ipban_tab[index1];
|
||||||
|
IPBan & ip2 = container->ipban_tab[index2];
|
||||||
|
|
||||||
|
// prefer to select records which do not have WINIX_IPBAN_FLAG_ACTIVE
|
||||||
|
if( ip1.HasFlag(WINIX_IPBAN_FLAG_ACTIVE) !=
|
||||||
|
ip2.HasFlag(WINIX_IPBAN_FLAG_ACTIVE) )
|
||||||
|
{
|
||||||
|
return ip2.HasFlag(WINIX_IPBAN_FLAG_ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ip1.last_used < ip2.last_used;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IPBan * IPBanContainer::FindIP(int ip)
|
||||||
|
{
|
||||||
|
// !! IMPROVE ME add binary search if is_ipban_tab_sorted is true
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
|
||||||
|
{
|
||||||
|
if( ipban_tab[i].ip == ip )
|
||||||
|
{
|
||||||
|
return &ipban_tab[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IPBan & IPBanContainer::GetIPBan(size_t index)
|
||||||
|
{
|
||||||
|
return ipban_tab[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IPBanContainer::Sort()
|
||||||
|
{
|
||||||
|
std::sort(ipban_tab.begin(), ipban_tab.end(), SortIPBansFunction);
|
||||||
|
is_ipban_tab_sorted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t IPBanContainer::Size()
|
||||||
|
{
|
||||||
|
return ipban_tab.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool IPBanContainer::SortIPBansFunction(const IPBan & ip1, const IPBan & ip2)
|
||||||
|
{
|
||||||
|
return ip1.ip < ip2.ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
58
core/ipbancontainer.h
Normal file
58
core/ipbancontainer.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_ipbancontainer
|
||||||
|
#define headerfile_winix_core_ipbancontainer
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "ipban.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class IPBanContainer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
IPBanContainer();
|
||||||
|
|
||||||
|
IPBan & AddIP(int ip);
|
||||||
|
IPBan * FindIP(int ip);
|
||||||
|
void Sort();
|
||||||
|
size_t Size();
|
||||||
|
IPBan & GetIPBan(size_t index);
|
||||||
|
void SetMaxSize(size_t soft_size, size_t size);
|
||||||
|
void RemoveIP(int ip);
|
||||||
|
void Clear();
|
||||||
|
bool IsSorted();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::vector<IPBan> ipban_tab;
|
||||||
|
bool is_ipban_tab_sorted;
|
||||||
|
size_t soft_max_size, max_size;
|
||||||
|
std::vector<size_t> sort_helper_tab;
|
||||||
|
|
||||||
|
static bool SortIPBansFunction(const IPBan & ip1, const IPBan & ip2);
|
||||||
|
void RemoveOldRecords();
|
||||||
|
void PrintTab();
|
||||||
|
void PrintTab2();
|
||||||
|
|
||||||
|
struct SortByLastUsedHelper
|
||||||
|
{
|
||||||
|
IPBanContainer * container;
|
||||||
|
|
||||||
|
SortByLastUsedHelper(IPBanContainer * c) : container(c) {}
|
||||||
|
bool operator()(size_t index1, size_t index2);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
82
core/item.cpp
Executable file
82
core/item.cpp
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "item.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "crypt.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Item::Item()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// !! IMPROVE ME
|
||||||
|
// now we have Request::start_time and Request::start_date
|
||||||
|
// we can somehow get the current time from the request
|
||||||
|
// may setting the date should be completetly removed from here?
|
||||||
|
void Item::SetDateToNow()
|
||||||
|
{
|
||||||
|
date_creation = std::time(0);
|
||||||
|
date_modification = date_creation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Item::SetDateModifyToNow()
|
||||||
|
{
|
||||||
|
date_modification = std::time(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Item::Clear()
|
||||||
|
{
|
||||||
|
id = -1;
|
||||||
|
|
||||||
|
user_id = -1;
|
||||||
|
group_id = -1;
|
||||||
|
privileges = 0;
|
||||||
|
modification_user_id = -1;
|
||||||
|
|
||||||
|
guest_name.clear();
|
||||||
|
|
||||||
|
subject.clear();
|
||||||
|
content.clear();
|
||||||
|
modify_index = 0;
|
||||||
|
url.clear();
|
||||||
|
|
||||||
|
content_type = ct_formatted_text;
|
||||||
|
|
||||||
|
type = none;
|
||||||
|
parent_id = -1;
|
||||||
|
|
||||||
|
link_to.clear();
|
||||||
|
link_redirect = false;
|
||||||
|
|
||||||
|
content_id = -1;
|
||||||
|
ref = 1;
|
||||||
|
|
||||||
|
file_path.clear();
|
||||||
|
file_fs = -1;
|
||||||
|
file_type = WINIX_ITEM_FILETYPE_NONE;
|
||||||
|
hash.clear();
|
||||||
|
hash_type = WINIX_CRYPT_HASH_NONE;
|
||||||
|
file_size = 0;
|
||||||
|
has_thumb = false;
|
||||||
|
|
||||||
|
html_template.clear();
|
||||||
|
sort_index = 0;
|
||||||
|
meta.Clear();
|
||||||
|
ameta.Clear();
|
||||||
|
|
||||||
|
SetDateToNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
168
core/item.h
168
core/item.h
@@ -2,139 +2,119 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreitem
|
#ifndef headerfile_winix_core_item
|
||||||
#define headerfilecmslucoreitem
|
#define headerfile_winix_core_item
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "space/space.h"
|
||||||
|
#include "date/date.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define WINIX_ITEM_FILETYPE_NONE 0
|
||||||
|
#define WINIX_ITEM_FILETYPE_IMAGE 1
|
||||||
|
#define WINIX_ITEM_FILETYPE_DOCUMENT 2
|
||||||
|
#define WINIX_ITEM_FILETYPE_VIDEO 3
|
||||||
|
#define WINIX_ITEM_FILETYPE_UNKNOWN 10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Item
|
struct Item
|
||||||
{
|
{
|
||||||
long id;
|
long id;
|
||||||
long parent_id;
|
long parent_id;
|
||||||
|
|
||||||
|
|
||||||
long user_id;
|
long user_id;
|
||||||
long group_id;
|
long group_id;
|
||||||
std::string guest_name; // used as a user name when user_id is equal -1
|
std::wstring guest_name; // used as a user name when user_id is equal -1
|
||||||
|
|
||||||
int privileges;
|
long modification_user_id; // who has modified the item last (not taken into account when checking permissions)
|
||||||
|
|
||||||
tm date_creation;
|
int privileges;
|
||||||
tm date_modification;
|
|
||||||
|
|
||||||
std::string subject;
|
PT::Date date_creation;
|
||||||
std::string content;
|
PT::Date date_modification;
|
||||||
long content_id; // used by the database
|
|
||||||
std::string url;
|
|
||||||
|
|
||||||
enum ContentType
|
std::wstring subject;
|
||||||
{
|
std::wstring content;
|
||||||
ct_text = 0,
|
|
||||||
ct_formatted_text,
|
|
||||||
ct_html,
|
|
||||||
ct_bbcode,
|
|
||||||
ct_raw
|
|
||||||
};
|
|
||||||
|
|
||||||
ContentType content_type;
|
std::wstring url;
|
||||||
|
int modify_index;
|
||||||
|
|
||||||
|
enum ContentType
|
||||||
|
{
|
||||||
|
ct_text = 0,
|
||||||
|
ct_formatted_text,
|
||||||
|
ct_html,
|
||||||
|
ct_bbcode,
|
||||||
|
ct_raw
|
||||||
|
};
|
||||||
|
|
||||||
|
ContentType content_type;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
dir = 0,
|
dir = 0,
|
||||||
file = 1,
|
file = 1,
|
||||||
|
symlink = 2,
|
||||||
|
|
||||||
none = 1000 // !! pozbyc sie tego
|
none = 1000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
|
|
||||||
|
|
||||||
long default_item;
|
// used when type is symlink or to a directory too (function 'default')
|
||||||
|
std::wstring link_to;
|
||||||
|
int link_redirect;
|
||||||
|
|
||||||
|
|
||||||
|
// static file (if exists)
|
||||||
|
std::wstring file_path; // relative file path
|
||||||
|
int file_fs; // file system type where the file was saved
|
||||||
|
int file_type; // file type (none, image, doc, etc)
|
||||||
|
bool has_thumb; // whether or not we have a thumbnail
|
||||||
|
std::wstring hash; // file hash (md4, md5, ...)
|
||||||
|
int hash_type; // hash type WINIX_CRYPT_HASH_* (see crypt.h)
|
||||||
|
size_t file_size; // size of the file
|
||||||
|
|
||||||
|
|
||||||
// external static file authorized by winix
|
std::wstring html_template;
|
||||||
enum Auth
|
|
||||||
{
|
|
||||||
auth_none = 0, /* there is not an external file */
|
|
||||||
auth_image = 1, /* png, gif, jpg - only types available to render by a web browser*/
|
|
||||||
auth_document = 2, /* pdf doc xls txt */
|
|
||||||
auth_other = 3 /* other file */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Auth auth;
|
|
||||||
std::string auth_path; // path to a file (if auth!=auth_none)
|
|
||||||
|
|
||||||
|
|
||||||
// methods
|
|
||||||
|
|
||||||
Item()
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SetDateToNow()
|
|
||||||
{
|
|
||||||
time_t t = std::time(0);
|
|
||||||
date_creation = *std::localtime( &t );
|
|
||||||
date_modification = date_creation;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SetDateModifyToNow()
|
|
||||||
{
|
|
||||||
time_t t = std::time(0);
|
|
||||||
date_modification = *std::localtime( &t );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Clear()
|
|
||||||
{
|
|
||||||
id = -1;
|
|
||||||
|
|
||||||
user_id = -1;
|
// sort index used when displaying a group of items
|
||||||
group_id = -1;
|
int sort_index;
|
||||||
privileges = 0;
|
|
||||||
|
|
||||||
guest_name.clear();
|
|
||||||
|
|
||||||
subject.clear();
|
|
||||||
content.clear();
|
|
||||||
url.clear();
|
|
||||||
|
|
||||||
content_type = ct_formatted_text;
|
|
||||||
|
|
||||||
type = none;
|
|
||||||
parent_id = -1;
|
|
||||||
default_item = -1;
|
|
||||||
|
|
||||||
content_id = -1;
|
|
||||||
|
|
||||||
auth = auth_none;
|
|
||||||
auth_path.clear();
|
|
||||||
|
|
||||||
SetDateToNow();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
// meta information
|
||||||
|
PT::Space meta;
|
||||||
|
PT::Space ameta;
|
||||||
|
|
||||||
|
|
||||||
|
// methods
|
||||||
|
Item();
|
||||||
|
void SetDateToNow();
|
||||||
|
void SetDateModifyToNow();
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
// used by the database
|
||||||
|
long content_id; // content id in 'content' table
|
||||||
|
int ref; // content references
|
||||||
|
|
||||||
|
friend class Db;
|
||||||
|
friend struct DbItemColumns;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
165
core/job.cpp
Executable file
165
core/job.cpp
Executable file
@@ -0,0 +1,165 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "job.h"
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Job::Job()
|
||||||
|
{
|
||||||
|
jobs_queue_tab.resize(WINIX_JOBS_HOW_MANY_PRIORITIES);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Job::CheckPriority(int & priority) const
|
||||||
|
{
|
||||||
|
if( priority < 0 )
|
||||||
|
priority = 0;
|
||||||
|
|
||||||
|
if( priority >= WINIX_JOBS_HOW_MANY_PRIORITIES )
|
||||||
|
priority = WINIX_JOBS_HOW_MANY_PRIORITIES - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// first thread (objects locked)
|
||||||
|
void Job::Add(PT::Space & job, int priority)
|
||||||
|
{
|
||||||
|
CheckPriority(priority);
|
||||||
|
jobs_queue_tab[priority].push(job);
|
||||||
|
WakeUpThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t Job::Size(int priority) const
|
||||||
|
{
|
||||||
|
CheckPriority(priority);
|
||||||
|
return jobs_queue_tab[priority].size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t Job::Size() const
|
||||||
|
{
|
||||||
|
size_t sum = 0;
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<WINIX_JOBS_HOW_MANY_PRIORITIES ; ++i)
|
||||||
|
sum += Size(i);
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Job::Empty(int priority) const
|
||||||
|
{
|
||||||
|
CheckPriority(priority);
|
||||||
|
return jobs_queue_tab[priority].empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Job::Empty() const
|
||||||
|
{
|
||||||
|
for(size_t i=0 ; i<WINIX_JOBS_HOW_MANY_PRIORITIES ; ++i)
|
||||||
|
if( !Empty(i) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
second thread
|
||||||
|
*/
|
||||||
|
|
||||||
|
// second thread (objects locked)
|
||||||
|
bool Job::SignalReceived()
|
||||||
|
{
|
||||||
|
return !Empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects not locked)
|
||||||
|
void Job::Do()
|
||||||
|
{
|
||||||
|
size_t i = WINIX_JOBS_HOW_MANY_PRIORITIES;
|
||||||
|
bool is_empty;
|
||||||
|
|
||||||
|
while( i-- > 0 && !IsExitSignal() )
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
is_empty = Empty(i);
|
||||||
|
Unlock();
|
||||||
|
|
||||||
|
if( !is_empty )
|
||||||
|
DoQueue(jobs_queue_tab[i]);
|
||||||
|
}
|
||||||
|
while( !is_empty && !IsExitSignal() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects not locked, jobs_queue is not empty)
|
||||||
|
void Job::DoQueue(JobsQueue & jobs_queue)
|
||||||
|
{
|
||||||
|
bool is_empty;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
// references will not be invalidated after insertion to jobs_queue
|
||||||
|
// (jobs_queue is std::queue and it uses std::deque by default)
|
||||||
|
PT::Space & job = jobs_queue.front();
|
||||||
|
Unlock();
|
||||||
|
|
||||||
|
DoJob(job);
|
||||||
|
|
||||||
|
Lock();
|
||||||
|
jobs_queue.pop();
|
||||||
|
is_empty = jobs_queue.empty();
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
while( !is_empty && !IsExitSignal() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects not locked)
|
||||||
|
void Job::DoJob(PT::Space & job)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
PluginRes res = plugin.Call((Session*)0, WINIX_JOB, &job);
|
||||||
|
|
||||||
|
if( res.res_true == 0 )
|
||||||
|
DoWinixJob(job);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// second thread (objects not locked)
|
||||||
|
void Job::DoWinixJob(PT::Space & job)
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
//log << log1 << "standard winix job: " << job.Text(L"type") << logend;
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
82
core/job.h
Executable file
82
core/job.h
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_jobs
|
||||||
|
#define headerfile_winix_core_jobs
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <queue>
|
||||||
|
#include "basethread.h"
|
||||||
|
#include "space/space.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define WINIX_JOBS_HOW_MANY_PRIORITIES 32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Job : public BaseThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
Job();
|
||||||
|
|
||||||
|
/*
|
||||||
|
add a new job to the queue
|
||||||
|
priority: 0-31 (0 - the lowest priority, 31 - the highest priority)
|
||||||
|
*/
|
||||||
|
void Add(PT::Space & job, int priority = 0);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
queue size, and size of all jobs in any priority
|
||||||
|
*/
|
||||||
|
size_t Size(int priority) const;
|
||||||
|
size_t Size() const;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
true if specified queue is empty
|
||||||
|
or if all queues are empty
|
||||||
|
*/
|
||||||
|
bool Empty(int priority) const;
|
||||||
|
bool Empty() const;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
typedef std::queue<PT::Space> JobsQueue;
|
||||||
|
typedef std::vector<JobsQueue> JobsQueueTab;
|
||||||
|
JobsQueueTab jobs_queue_tab;
|
||||||
|
|
||||||
|
void CheckPriority(int & priority) const;
|
||||||
|
void SaveToFile();
|
||||||
|
void ReadFromFile();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
second thread
|
||||||
|
*/
|
||||||
|
|
||||||
|
// standard winix jobs
|
||||||
|
// Image image;
|
||||||
|
// sending emails
|
||||||
|
// etc.
|
||||||
|
|
||||||
|
bool SignalReceived();
|
||||||
|
void Do();
|
||||||
|
void DoQueue(JobsQueue & jobs_queue);
|
||||||
|
void DoJob(PT::Space & job);
|
||||||
|
void DoWinixJob(PT::Space & job);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include "lastcontainer.h"
|
#include "lastcontainer.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
|
|
||||||
LastItem::LastItem()
|
LastItem::LastItem()
|
||||||
@@ -18,23 +18,12 @@ LastItem::LastItem()
|
|||||||
user_id = 0;
|
user_id = 0;
|
||||||
ip = 0;
|
ip = 0;
|
||||||
session_id = 0;
|
session_id = 0;
|
||||||
memset((char*)&start, 0, sizeof(start));
|
|
||||||
memset((char*)&end, 0, sizeof(end));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LastItem::IsLoggedOut()
|
bool LastItem::IsLoggedOut()
|
||||||
{
|
{
|
||||||
if( end.tm_sec == 0 &&
|
return end.year > 1970;
|
||||||
end.tm_min == 0 &&
|
|
||||||
end.tm_hour == 0 &&
|
|
||||||
end.tm_mday == 0 &&
|
|
||||||
end.tm_mon == 0 &&
|
|
||||||
end.tm_year == 0 )
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -68,7 +57,7 @@ return last_tab.end();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void LastContainer::UserLogin(long user_id, const std::string & name, unsigned int ip, long session_id)
|
void LastContainer::UserLogin(long user_id, const std::wstring & name, unsigned int ip, long session_id)
|
||||||
{
|
{
|
||||||
LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
|
LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
|
||||||
|
|
||||||
@@ -78,7 +67,7 @@ LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( last_tab.size() >= LAST_TABLE_SIZE )
|
if( last_tab.size() >= WINIX_LASTCONTAINER_TABLE_SIZE ) // last_tab has O(n) complexity
|
||||||
last_tab.erase(last_tab.begin());
|
last_tab.erase(last_tab.begin());
|
||||||
|
|
||||||
LastItem li;
|
LastItem li;
|
||||||
@@ -87,9 +76,7 @@ LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
|
|||||||
li.name = name;
|
li.name = name;
|
||||||
li.ip = ip;
|
li.ip = ip;
|
||||||
li.session_id = session_id;
|
li.session_id = session_id;
|
||||||
|
li.start = std::time(0);
|
||||||
time_t t = std::time(0);
|
|
||||||
li.start = *localtime(&t);
|
|
||||||
|
|
||||||
last_tab.insert(last_tab.end(), li);
|
last_tab.insert(last_tab.end(), li);
|
||||||
|
|
||||||
@@ -105,11 +92,17 @@ LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
|
|||||||
|
|
||||||
if( i != last_tab.end() )
|
if( i != last_tab.end() )
|
||||||
{
|
{
|
||||||
time_t t = std::time(0);
|
i->end = std::time(0);
|
||||||
i->end = *localtime(&t);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log << log1 << "LC: there is no such a user to log out" << logend;
|
/*
|
||||||
|
!! IMPROVE ME
|
||||||
|
users read from the session file (at boot time)
|
||||||
|
are not added to LastContainer
|
||||||
|
*/
|
||||||
|
|
||||||
|
log << log4 << "LC: there is no such a user to log out: user_id: "
|
||||||
|
<< user_id << " ses_id: " << session_id << logend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,18 +7,19 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorelastcontainer
|
#ifndef headerfile_winix_core_lastcontainer
|
||||||
#define headerfilecmslucorelastcontainer
|
#define headerfile_winix_core_lastcontainer
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include "date/date.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// how many items we store in the 'last' function
|
// how many items we store in the 'last' function
|
||||||
#define LAST_TABLE_SIZE 100
|
#define WINIX_LASTCONTAINER_TABLE_SIZE 100
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ struct LastItem
|
|||||||
|
|
||||||
// additional we store the whole string-name
|
// additional we store the whole string-name
|
||||||
// (you can delete a user from the database but we can still print the name)
|
// (you can delete a user from the database but we can still print the name)
|
||||||
std::string name;
|
std::wstring name;
|
||||||
|
|
||||||
// ip address
|
// ip address
|
||||||
unsigned int ip;
|
unsigned int ip;
|
||||||
@@ -37,8 +38,8 @@ struct LastItem
|
|||||||
long session_id;
|
long session_id;
|
||||||
|
|
||||||
// start logging and end logging
|
// start logging and end logging
|
||||||
tm start;
|
PT::Date start;
|
||||||
tm end;
|
PT::Date end;
|
||||||
|
|
||||||
|
|
||||||
LastItem();
|
LastItem();
|
||||||
@@ -62,7 +63,7 @@ public:
|
|||||||
|
|
||||||
Iterator Begin();
|
Iterator Begin();
|
||||||
Iterator End();
|
Iterator End();
|
||||||
void UserLogin(long user_id, const std::string & name, unsigned int ip, long session_id);
|
void UserLogin(long user_id, const std::wstring & name, unsigned int ip, long session_id);
|
||||||
void UserLogout(long user_id, long session_id);
|
void UserLogout(long user_id, long session_id);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucoreloadavg
|
#ifndef headerfile_winix_core_loadavg
|
||||||
#define headerfilecmslucoreloadavg
|
#define headerfile_winix_core_loadavg
|
||||||
|
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|||||||
237
core/locale.cpp
237
core/locale.cpp
@@ -1,237 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "locale.h"
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
|
|
||||||
Locale::Locale()
|
|
||||||
{
|
|
||||||
loc_tab.resize(lang_unknown);
|
|
||||||
default_lang = lang_en;
|
|
||||||
current_lang = lang_en;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::AddLocale(Lang lang)
|
|
||||||
{
|
|
||||||
ConfParser::Table::iterator i = loc_parser.table.begin();
|
|
||||||
|
|
||||||
for( ; i != loc_parser.table.end() ; ++i)
|
|
||||||
loc_tab[lang][i->first] = i->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::ReadFile(const char * dir, const char * dir_def, Lang lang, const char * file)
|
|
||||||
{
|
|
||||||
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
||||||
{
|
|
||||||
// ops, something wrong
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
loc_tab[lang].clear();
|
|
||||||
bool read = false;
|
|
||||||
|
|
||||||
if( dir_def )
|
|
||||||
{
|
|
||||||
file_name = dir_def;
|
|
||||||
file_name += '/';
|
|
||||||
file_name += file;
|
|
||||||
|
|
||||||
if( loc_parser.Parse(file_name.c_str()) == ConfParser::ok )
|
|
||||||
{
|
|
||||||
read = true;
|
|
||||||
AddLocale(lang);
|
|
||||||
log << log3 << "Locale: read locale from: " << file_name << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( dir )
|
|
||||||
{
|
|
||||||
file_name = dir;
|
|
||||||
file_name += '/';
|
|
||||||
file_name += file;
|
|
||||||
|
|
||||||
if( loc_parser.Parse(file_name.c_str()) == ConfParser::ok )
|
|
||||||
{
|
|
||||||
read = true;
|
|
||||||
AddLocale(lang);
|
|
||||||
log << log3 << "Locale: read locale from: " << file_name << logend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( !read )
|
|
||||||
log << log1 << "Locale: cant open file for locale: " << file << logend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::Read(const char * dir, const char * dir_def)
|
|
||||||
{
|
|
||||||
ReadFile(dir, dir_def, lang_pl, "pl");
|
|
||||||
ReadFile(dir, dir_def, lang_en, "en");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::Read(const std::string & dir, const std::string & dir_def)
|
|
||||||
{
|
|
||||||
if( dir_def.empty() )
|
|
||||||
Read(dir.c_str());
|
|
||||||
else
|
|
||||||
Read(dir.c_str(), dir_def.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::SetLang(Lang lang)
|
|
||||||
{
|
|
||||||
current_lang = lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Locale::Lang Locale::GetLang()
|
|
||||||
{
|
|
||||||
return current_lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Locale::SetLangDef(Lang lang)
|
|
||||||
{
|
|
||||||
default_lang = lang_en;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Locale::IsKey(const std::string & key) const
|
|
||||||
{
|
|
||||||
return IsKey(key, current_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Locale::IsKey(const std::string & key, Lang lang) const
|
|
||||||
{
|
|
||||||
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
||||||
{
|
|
||||||
// ops, something wrong
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// looking in the lang language
|
|
||||||
ConfParser::Table::const_iterator i = loc_tab[lang].find(key);
|
|
||||||
|
|
||||||
if( i != loc_tab[lang].end() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( lang == default_lang )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
|
||||||
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
|
|
||||||
{
|
|
||||||
// ops, something wrong
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// looking in a default language
|
|
||||||
i = loc_tab[default_lang].find(key);
|
|
||||||
|
|
||||||
if( i != loc_tab[default_lang].end() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// there is no such a key
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const std::string & Locale::Get(const std::string & key) const
|
|
||||||
{
|
|
||||||
return Get(key, current_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const std::string & Locale::Get(const std::string & key, Lang lang) const
|
|
||||||
{
|
|
||||||
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
||||||
{
|
|
||||||
// ops, something wrong
|
|
||||||
return empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
// looking in the lang language
|
|
||||||
ConfParser::Table::const_iterator i = loc_tab[lang].find(key);
|
|
||||||
|
|
||||||
if( i != loc_tab[lang].end() )
|
|
||||||
return i->second;
|
|
||||||
|
|
||||||
if( lang == default_lang )
|
|
||||||
return empty;
|
|
||||||
|
|
||||||
|
|
||||||
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
|
|
||||||
{
|
|
||||||
// ops, something wrong
|
|
||||||
return empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
// looking in a default language
|
|
||||||
i = loc_tab[default_lang].find(key);
|
|
||||||
|
|
||||||
if( i != loc_tab[default_lang].end() )
|
|
||||||
return i->second;
|
|
||||||
|
|
||||||
// there is no such a key
|
|
||||||
return empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Locale::Lang Locale::StrToLang(const std::string & str)
|
|
||||||
{
|
|
||||||
if( str == "en" )
|
|
||||||
return lang_en;
|
|
||||||
else
|
|
||||||
if( str == "pl" )
|
|
||||||
return lang_pl;
|
|
||||||
|
|
||||||
return lang_unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char * Locale::LangToStr(Lang lang)
|
|
||||||
{
|
|
||||||
static char buffer[30];
|
|
||||||
|
|
||||||
switch(lang)
|
|
||||||
{
|
|
||||||
case lang_en:
|
|
||||||
sprintf(buffer, "en");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case lang_pl:
|
|
||||||
sprintf(buffer, "pl");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sprintf(buffer, "unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
size_t Locale::Size()
|
|
||||||
{
|
|
||||||
return loc_tab.size();
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of Winix
|
|
||||||
* and is not publicly distributed
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010, Tomasz Sowa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef headerfilecmslucorelocale
|
|
||||||
#define headerfilecmslucorelocale
|
|
||||||
|
|
||||||
#include "../confparser/confparser.h"
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Locale
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
enum Lang
|
|
||||||
{
|
|
||||||
lang_en = 0,
|
|
||||||
lang_pl,
|
|
||||||
|
|
||||||
lang_unknown // should be last
|
|
||||||
};
|
|
||||||
|
|
||||||
Locale();
|
|
||||||
|
|
||||||
void Read(const char * dir, const char * dir_def = 0);
|
|
||||||
void Read(const std::string & dir, const std::string & dir_def);
|
|
||||||
|
|
||||||
bool IsKey(const std::string & key) const;
|
|
||||||
bool IsKey(const std::string & key, Lang lang) const;
|
|
||||||
const std::string & Get(const std::string & key) const;
|
|
||||||
const std::string & Get(const std::string & key, Lang lang) const;
|
|
||||||
|
|
||||||
// default is english
|
|
||||||
void SetLang(Lang lang);
|
|
||||||
Lang GetLang();
|
|
||||||
|
|
||||||
// which language is used instead if there is no a key in an other language
|
|
||||||
// default: lang_en
|
|
||||||
void SetLangDef(Lang lang);
|
|
||||||
|
|
||||||
|
|
||||||
static Lang StrToLang(const std::string & str);
|
|
||||||
static const char * LangToStr(Lang lang);
|
|
||||||
|
|
||||||
size_t Size();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void AddLocale(Lang lang);
|
|
||||||
void ReadFile(const char * dir, const char * dir_def, Lang lang, const char * file);
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<ConfParser::Table> loc_tab;
|
|
||||||
ConfParser loc_parser;
|
|
||||||
std::string file_name;
|
|
||||||
std::string empty;
|
|
||||||
Lang default_lang;
|
|
||||||
Lang current_lang;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
49
core/lock.cpp
Executable file
49
core/lock.cpp
Executable file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lock.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Lock::Lock()
|
||||||
|
{
|
||||||
|
synchro = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Lock::Lock(Synchro * synchro_)
|
||||||
|
{
|
||||||
|
synchro = synchro_;
|
||||||
|
synchro->Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Lock::Lock(Synchro & synchro_)
|
||||||
|
{
|
||||||
|
synchro = &synchro_;
|
||||||
|
synchro->Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Lock::~Lock()
|
||||||
|
{
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Lock::Unlock()
|
||||||
|
{
|
||||||
|
if( synchro )
|
||||||
|
{
|
||||||
|
synchro->Unlock();
|
||||||
|
synchro = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
37
core/lock.h
Executable file
37
core/lock.h
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_lock
|
||||||
|
#define headerfile_winix_core_lock
|
||||||
|
|
||||||
|
#include "synchro.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Lock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
Lock(Synchro * synchro_);
|
||||||
|
Lock(Synchro & synchro_);
|
||||||
|
|
||||||
|
~Lock();
|
||||||
|
|
||||||
|
void Unlock();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Synchro * synchro;
|
||||||
|
|
||||||
|
Lock();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
341
core/log.cpp
341
core/log.cpp
@@ -2,7 +2,7 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -10,57 +10,107 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "utf8/utf8.h"
|
||||||
|
#include "timezones.h"
|
||||||
|
|
||||||
|
|
||||||
Log::Log()
|
Log::Log()
|
||||||
{
|
{
|
||||||
log_level = 3;
|
log_level = 1;
|
||||||
current_level = 4; // nothing to log (call Init() first)
|
current_level = 100; // nothing to log (call Init() first)
|
||||||
item = 0;
|
request = 0;
|
||||||
item_save = 1;
|
max_requests = 1;
|
||||||
lines = 0;
|
lines = 0;
|
||||||
|
max_lines = 5000;
|
||||||
|
log_file_open = false;
|
||||||
|
time_zones = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log::Init(int log_l, const std::string & log_f, bool log_std, int log_request)
|
Log::~Log()
|
||||||
{
|
{
|
||||||
log_level = log_l;
|
SaveLogAndClear();
|
||||||
log_file = log_f;
|
}
|
||||||
log_stdout = log_std;
|
|
||||||
item_save = log_request;
|
|
||||||
|
|
||||||
OpenFile();
|
|
||||||
|
|
||||||
|
void Log::SetTimeZones(TimeZones * ptime_zones)
|
||||||
|
{
|
||||||
|
time_zones = ptime_zones;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int Log::LogLevel()
|
||||||
|
{
|
||||||
|
return log_level;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Log::Init(int log_level_, bool save_each_line_, const std::string & log_file_, bool log_std, int log_max_requests)
|
||||||
|
{
|
||||||
|
log_level = log_level_;
|
||||||
|
log_file = log_file_;
|
||||||
|
log_stdout = log_std;
|
||||||
|
max_requests = log_max_requests;
|
||||||
|
save_each_line = save_each_line_;
|
||||||
|
|
||||||
|
// don't open the file here
|
||||||
|
// because it would be created with the root as an owner
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log::OpenFile()
|
void Log::OpenFile()
|
||||||
{
|
{
|
||||||
if( !log_file.empty() )
|
if( !log_file.empty() )
|
||||||
|
{
|
||||||
file.open( log_file.c_str(), std::ios_base::out | std::ios_base::app );
|
file.open( log_file.c_str(), std::ios_base::out | std::ios_base::app );
|
||||||
|
log_file_open = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log::PutDate(Manipulators m)
|
void Log::PrintDate(const PT::Date & date, size_t time_zone_id)
|
||||||
{
|
{
|
||||||
time_t t = std::time(0);
|
if( time_zones )
|
||||||
std::tm * loct = std::localtime(&t);
|
{
|
||||||
|
TimeZone * tz = time_zones->GetZone(time_zone_id);
|
||||||
char buffer[70];
|
|
||||||
sprintf(buffer, "%d.%02d.%02d %02d:%02d:%02d ", int(loct->tm_year + 1900),
|
|
||||||
int(loct->tm_mon + 1),
|
|
||||||
int(loct->tm_mday),
|
|
||||||
int(loct->tm_hour),
|
|
||||||
int(loct->tm_min),
|
|
||||||
int(loct->tm_sec));
|
|
||||||
|
|
||||||
(*this) << m << buffer;
|
if( tz )
|
||||||
|
{
|
||||||
|
PT::Date local_date = tz->ToLocal(date);
|
||||||
|
log << local_date;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*this) << date << " UTC"; // unknown time zone identifier
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*this) << date << " UTC"; // time_zones object was not set
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(const void * s)
|
||||||
|
{
|
||||||
|
if( current_level > log_level )
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
buffer << s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(const char * s)
|
Log & Log::operator<<(const char * s)
|
||||||
{
|
{
|
||||||
|
if( current_level > log_level )
|
||||||
|
return *this;
|
||||||
|
|
||||||
if( !s )
|
if( !s )
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
@@ -73,8 +123,10 @@ return *this;
|
|||||||
|
|
||||||
Log & Log::operator<<(const std::string & s)
|
Log & Log::operator<<(const std::string & s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level > log_level )
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
buffer << s;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,23 +134,63 @@ Log & Log::operator<<(const std::string & s)
|
|||||||
|
|
||||||
Log & Log::operator<<(const std::string * s)
|
Log & Log::operator<<(const std::string * s)
|
||||||
{
|
{
|
||||||
buffer << *s;
|
if( current_level > log_level )
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
buffer << *s;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(const void * s)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(const wchar_t * s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
if( s )
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(const std::wstring & s)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(const std::wstring * s)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << *s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(int s)
|
Log & Log::operator<<(int s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -107,7 +199,10 @@ Log & Log::operator<<(int s)
|
|||||||
|
|
||||||
Log & Log::operator<<(long s)
|
Log & Log::operator<<(long s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -117,16 +212,32 @@ Log & Log::operator<<(long s)
|
|||||||
|
|
||||||
Log & Log::operator<<(char s)
|
Log & Log::operator<<(char s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(wchar_t s)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(size_t s)
|
Log & Log::operator<<(size_t s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -135,39 +246,62 @@ Log & Log::operator<<(size_t s)
|
|||||||
|
|
||||||
Log & Log::operator<<(double s)
|
Log & Log::operator<<(double s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(Manipulators m)
|
Log & Log::operator<<(const PT::Space & s)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(const PT::Date & date)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
buffer << date;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Log & Log::operator<<(LogManipulators m)
|
||||||
{
|
{
|
||||||
switch(m)
|
switch(m)
|
||||||
{
|
{
|
||||||
case logend:
|
case logend:
|
||||||
buffer << '\n';
|
if( current_level <= log_level )
|
||||||
lines += 1;
|
{
|
||||||
break;
|
buffer << '\n';
|
||||||
|
lines += 1;
|
||||||
|
|
||||||
case logsavenow:
|
if( save_each_line )
|
||||||
SaveLog();
|
SaveLogAndClear();
|
||||||
buffer.str( "" );
|
}
|
||||||
item = 0;
|
|
||||||
lines = 0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case logsave:
|
case logsave:
|
||||||
item += 1;
|
SaveLogAndClear();
|
||||||
|
break;
|
||||||
|
|
||||||
if( item >= item_save || lines > 3000 )
|
case logendrequest:
|
||||||
{
|
if( ++request >= max_requests || lines > max_lines )
|
||||||
SaveLog();
|
SaveLogAndClear();
|
||||||
buffer.str( "" );
|
|
||||||
item = 0;
|
|
||||||
lines = 0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case log1:
|
case log1:
|
||||||
@@ -181,12 +315,93 @@ Log & Log::operator<<(Manipulators m)
|
|||||||
case log3:
|
case log3:
|
||||||
current_level = 3;
|
current_level = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case log4:
|
||||||
|
current_level = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char Log::GetHEXdigit(unsigned char c)
|
||||||
|
{
|
||||||
|
if( c < 10 )
|
||||||
|
return c + '0';
|
||||||
|
|
||||||
|
return c - 10 + 'A';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Log::ToHEX(char * buf, unsigned char c)
|
||||||
|
{
|
||||||
|
buf[0] = GetHEXdigit(c >> 4);
|
||||||
|
buf[1] = GetHEXdigit(c & 0xf);
|
||||||
|
buf[2] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Log::LogBinary(const char * blob, size_t blob_len)
|
||||||
|
{
|
||||||
|
size_t i=0;
|
||||||
|
char buf[3];
|
||||||
|
|
||||||
|
|
||||||
|
while( i < blob_len )
|
||||||
|
{
|
||||||
|
size_t oldi = i;
|
||||||
|
|
||||||
|
for(size_t a=0 ; a<16 ; ++a)
|
||||||
|
{
|
||||||
|
if( i < blob_len )
|
||||||
|
{
|
||||||
|
ToHEX(buf, blob[i]);
|
||||||
|
buffer << buf << ' ';
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( a == 7 )
|
||||||
|
{
|
||||||
|
if( i < blob_len )
|
||||||
|
buffer << "- ";
|
||||||
|
else
|
||||||
|
buffer << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = oldi;
|
||||||
|
buffer << ' ';
|
||||||
|
|
||||||
|
for(size_t a=0 ; a<16 && i<blob_len ; ++a, ++i)
|
||||||
|
{
|
||||||
|
if( blob[i] > 31 && blob[i] < 127 )
|
||||||
|
buffer << blob[i];
|
||||||
|
else
|
||||||
|
buffer << '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
(*this) << logend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Log::LogBinary(const std::string & blob)
|
||||||
|
{
|
||||||
|
LogBinary(blob.c_str(), blob.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log::SystemErr(int err)
|
void Log::SystemErr(int err)
|
||||||
{
|
{
|
||||||
(*this) << "errno: " << err;
|
(*this) << "errno: " << err;
|
||||||
@@ -198,23 +413,28 @@ void Log::SystemErr(int err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Log::SaveLogAndClear()
|
||||||
|
{
|
||||||
|
SaveLog();
|
||||||
|
|
||||||
|
buffer.Clear();
|
||||||
|
request = 0;
|
||||||
|
lines = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log::SaveLog()
|
void Log::SaveLog()
|
||||||
{
|
{
|
||||||
if( current_level > log_level )
|
if( buffer.Str().empty() )
|
||||||
return;
|
|
||||||
|
|
||||||
const std::string & source = buffer.str();
|
|
||||||
|
|
||||||
if( source.empty() )
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( log_stdout )
|
if( log_stdout )
|
||||||
std::cout << source;
|
PT::WideToUTF8(buffer.Str(), std::cout);
|
||||||
|
|
||||||
if( log_file.empty() )
|
if( log_file.empty() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( !file )
|
if( !log_file_open || !file )
|
||||||
{
|
{
|
||||||
file.close();
|
file.close();
|
||||||
file.clear();
|
file.clear();
|
||||||
@@ -225,7 +445,8 @@ void Log::SaveLog()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
file << source << std::endl;
|
PT::WideToUTF8(buffer.Str(), file);
|
||||||
|
file.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
144
core/log.h
144
core/log.h
@@ -2,67 +2,161 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2010, Tomasz Sowa
|
* Copyright (c) 2008-2012, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef headerfilecmslucorelog
|
#ifndef headerfile_winix_core_log
|
||||||
#define headerfilecmslucorelog
|
#define headerfile_winix_core_log
|
||||||
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "textstream.h"
|
||||||
|
#include "logmanipulators.h"
|
||||||
|
#include "textstream/textstream.h"
|
||||||
|
|
||||||
|
|
||||||
// !! dodac manipulator logsave, logi zostana zapisane pod koniec wykonywania jednego requesta (albo po kilku w zaleznosci od jakiejs opcji w konfigu)
|
class TimeZones;
|
||||||
// logsave zostanie wywolane w requestcontroller.cpp przy konczeniu wykonywania requesta
|
|
||||||
enum Manipulators { logsave, logsavenow, logend, log1, log2, log3 };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Log
|
class Log
|
||||||
{
|
{
|
||||||
std::ostringstream buffer;
|
|
||||||
int log_level, current_level;
|
|
||||||
int item, item_save;
|
|
||||||
std::string log_file;
|
|
||||||
bool log_stdout;
|
|
||||||
std::ofstream file;
|
|
||||||
int lines;
|
|
||||||
|
|
||||||
void OpenFile();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Log();
|
|
||||||
|
|
||||||
void Init(int log_l, const std::string & log_f, bool log_std, int log_request);
|
|
||||||
|
|
||||||
void PutDate(Manipulators m);
|
Log();
|
||||||
Log & operator<<(const char * s);
|
~Log();
|
||||||
|
|
||||||
|
void SetTimeZones(TimeZones * ptime_zones);
|
||||||
|
void Init(int log_level_, bool save_each_line_, const std::string & log_file_, bool log_std, int log_max_requests);
|
||||||
|
|
||||||
Log & operator<<(const void * s);
|
Log & operator<<(const void * s);
|
||||||
|
Log & operator<<(const char * s);
|
||||||
Log & operator<<(const std::string * s);
|
Log & operator<<(const std::string * s);
|
||||||
Log & operator<<(const std::string & s);
|
Log & operator<<(const std::string & s);
|
||||||
|
Log & operator<<(const wchar_t * s);
|
||||||
|
Log & operator<<(const std::wstring * s);
|
||||||
|
Log & operator<<(const std::wstring & s);
|
||||||
Log & operator<<(int s);
|
Log & operator<<(int s);
|
||||||
Log & operator<<(long s);
|
Log & operator<<(long s);
|
||||||
Log & operator<<(char s);
|
Log & operator<<(char s);
|
||||||
|
Log & operator<<(wchar_t s);
|
||||||
Log & operator<<(size_t s);
|
Log & operator<<(size_t s);
|
||||||
Log & operator<<(double s);
|
Log & operator<<(double s);
|
||||||
Log & operator<<(Manipulators m);
|
Log & operator<<(const PT::Space & space);
|
||||||
|
Log & operator<<(LogManipulators m);
|
||||||
void SystemErr(int err);
|
Log & operator<<(const PT::Date & date);
|
||||||
|
|
||||||
|
void PrintDate(const PT::Date & date, size_t time_zone_id);
|
||||||
|
|
||||||
|
template<typename char_type, size_t stack_size, size_t heap_block_size>
|
||||||
|
Log & operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf);
|
||||||
|
|
||||||
|
|
||||||
|
template<class StringType>
|
||||||
|
void LogString(const StringType & value, size_t max_size);
|
||||||
|
|
||||||
|
void LogBinary(const char * blob, size_t blob_len);
|
||||||
|
void LogBinary(const std::string & blob);
|
||||||
|
|
||||||
|
|
||||||
|
void SystemErr(int err);
|
||||||
void SaveLog();
|
void SaveLog();
|
||||||
|
void SaveLogAndClear();
|
||||||
|
|
||||||
|
int LogLevel();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// time zones for printing the time in the log file
|
||||||
|
TimeZones * time_zones;
|
||||||
|
|
||||||
|
// buffer for the log
|
||||||
|
TextStream<std::wstring> buffer;
|
||||||
|
|
||||||
|
// log lovel from the config file
|
||||||
|
int log_level;
|
||||||
|
|
||||||
|
// current level set by a modifier (e.g. log << log3)
|
||||||
|
int current_level;
|
||||||
|
|
||||||
|
// current request for logging
|
||||||
|
// starts from zero and incremented after logendrequest modifier
|
||||||
|
int request;
|
||||||
|
|
||||||
|
// how many request to save at once
|
||||||
|
int max_requests;
|
||||||
|
|
||||||
|
// file log
|
||||||
|
std::string log_file;
|
||||||
|
std::ofstream file;
|
||||||
|
|
||||||
|
// logging to stdout
|
||||||
|
bool log_stdout;
|
||||||
|
|
||||||
|
// how many lines there are in the buffer
|
||||||
|
int lines;
|
||||||
|
|
||||||
|
// is the config file already open
|
||||||
|
bool log_file_open;
|
||||||
|
|
||||||
|
// how many lines can be in the config buffer
|
||||||
|
// default: 5000
|
||||||
|
int max_lines;
|
||||||
|
|
||||||
|
// whether to save each line (for debug)
|
||||||
|
bool save_each_line;
|
||||||
|
|
||||||
|
void OpenFile();
|
||||||
|
char GetHEXdigit(unsigned char c);
|
||||||
|
void ToHEX(char * buf, unsigned char c);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class StringType>
|
||||||
|
void Log::LogString(const StringType & value, size_t max_size)
|
||||||
|
{
|
||||||
|
size_t min_size = value.size() < max_size ? value.size() : max_size;
|
||||||
|
|
||||||
|
if( current_level <= log_level )
|
||||||
|
{
|
||||||
|
for(size_t i=0 ; i<min_size ; ++i)
|
||||||
|
{
|
||||||
|
if( value[i] < 32 )
|
||||||
|
buffer << '.';
|
||||||
|
else
|
||||||
|
buffer << value[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename char_type, size_t stack_size, size_t heap_block_size>
|
||||||
|
Log & Log::operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf)
|
||||||
|
{
|
||||||
|
if( current_level <= log_level )
|
||||||
|
buffer << buf;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern Log log;
|
extern Log log;
|
||||||
extern Log nlog;
|
extern Log nlog;
|
||||||
|
|
||||||
|
// for convenience, we have to use only #include "log.h" in the winix
|
||||||
|
#include "slog.h"
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
48
core/logmanipulators.h
Executable file
48
core/logmanipulators.h
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of Winix
|
||||||
|
* and is not publicly distributed
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_winix_core_logmanipulators
|
||||||
|
#define headerfile_winix_core_logmanipulators
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
log1 - the first level
|
||||||
|
log2
|
||||||
|
log3
|
||||||
|
log4 - the last level (debug level)
|
||||||
|
logend - the end of a line
|
||||||
|
logendrequest - end of a current request
|
||||||
|
logsave - current log buffer is saved and cleared
|
||||||
|
|
||||||
|
manipulators used by the session logger (SLog)
|
||||||
|
loginfo - normal info to a user
|
||||||
|
logerror - we are reporting an error
|
||||||
|
logwarning - we are reporting a warning
|
||||||
|
|
||||||
|
make sure that loginfo, logerror and logwarning have values less than 32 (space)
|
||||||
|
their are used as control codes in a string
|
||||||
|
*/
|
||||||
|
enum LogManipulators
|
||||||
|
{
|
||||||
|
log1,
|
||||||
|
log2,
|
||||||
|
log3,
|
||||||
|
log4,
|
||||||
|
logend,
|
||||||
|
logendrequest,
|
||||||
|
logsave,
|
||||||
|
|
||||||
|
loginfo,
|
||||||
|
logerror,
|
||||||
|
logwarning
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
1194
core/misc.cpp
1194
core/misc.cpp
File diff suppressed because it is too large
Load Diff
1023
core/misc.h
1023
core/misc.h
File diff suppressed because it is too large
Load Diff
147
core/mount.cpp
147
core/mount.cpp
@@ -2,117 +2,21 @@
|
|||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009, Tomasz Sowa
|
* Copyright (c) 2009-2010, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mount.h"
|
#include "mount.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Mount::Mount()
|
Mount::Mount()
|
||||||
{
|
{
|
||||||
type = cms;
|
|
||||||
dir_id = -1;
|
dir_id = -1;
|
||||||
fs = simplefs;
|
type = -1;
|
||||||
|
fs = -1;
|
||||||
param.resize(par_none);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char * Mount::TypeToStr()
|
|
||||||
{
|
|
||||||
static char buffer[30];
|
|
||||||
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case cms:
|
|
||||||
sprintf(buffer, "cms");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case thread:
|
|
||||||
sprintf(buffer, "thread");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ticket:
|
|
||||||
sprintf(buffer, "ticket");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sprintf(buffer, "unknown");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const char * Mount::FsToStr()
|
|
||||||
{
|
|
||||||
static char buffer[30];
|
|
||||||
|
|
||||||
switch( fs )
|
|
||||||
{
|
|
||||||
case simplefs:
|
|
||||||
sprintf(buffer, "simplefs");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case hashfs:
|
|
||||||
sprintf(buffer, "hashfs");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sprintf(buffer, "unknown");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Mount::ParamCode Mount::ParseParam(const char * param_name)
|
|
||||||
{
|
|
||||||
struct ParName
|
|
||||||
{
|
|
||||||
ParamCode param_code;
|
|
||||||
const char * name;
|
|
||||||
};
|
|
||||||
|
|
||||||
static ParName par_name_tab[] = {
|
|
||||||
{ par_page, "page" },
|
|
||||||
{ par_thread, "thread" },
|
|
||||||
{ par_ticket, "ticket" },
|
|
||||||
{ par_ticket_type, "ticket_type" },
|
|
||||||
{ par_ticket_type_default, "ticket_type_default" },
|
|
||||||
{ par_ticket_status, "ticket_status" },
|
|
||||||
{ par_ticket_status_default, "ticket_status_default" },
|
|
||||||
{ par_ticket_priority, "ticket_priority" },
|
|
||||||
{ par_ticket_priority_default, "ticket_priority_default" },
|
|
||||||
{ par_ticket_category, "ticket_category" },
|
|
||||||
{ par_ticket_category_default, "ticket_category_default" },
|
|
||||||
{ par_ticket_expected, "ticket_expected" },
|
|
||||||
{ par_ticket_expected_default, "ticket_expected_default" },
|
|
||||||
{ par_createthread_on, "createthread_on" },
|
|
||||||
{ par_createticket_on, "createticket_on" },
|
|
||||||
{ par_only_root_remove, "only_root_remove" },
|
|
||||||
{ par_emacs_on, "emacs_on" },
|
|
||||||
{ par_mkdir_on, "mkdir_on" },
|
|
||||||
{ par_app, "app" }
|
|
||||||
};
|
|
||||||
|
|
||||||
size_t i, len = sizeof(par_name_tab) / sizeof(ParName);
|
|
||||||
|
|
||||||
for(i=0 ; i<len ; ++i)
|
|
||||||
{
|
|
||||||
if( strcmp(par_name_tab[i].name, param_name) == 0 )
|
|
||||||
return par_name_tab[i].param_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
return par_none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -126,8 +30,11 @@ size_t i;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Mount::IsPar(Mount::ParamCode code)
|
bool Mount::IsPar(int code)
|
||||||
{
|
{
|
||||||
|
if( code < 0 || code >= (int)param.size() )
|
||||||
|
return false;
|
||||||
|
|
||||||
if( !param[code].defined )
|
if( !param[code].defined )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -136,9 +43,12 @@ return true;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Mount::IsArg(Mount::ParamCode code, const char * arg)
|
bool Mount::IsArg(int code, const wchar_t * arg)
|
||||||
{
|
{
|
||||||
ParamArg::iterator i;
|
ParamRow::ParamArg::iterator i;
|
||||||
|
|
||||||
|
if( code < 0 || code >= (int)param.size() )
|
||||||
|
return false;
|
||||||
|
|
||||||
if( !param[code].defined )
|
if( !param[code].defined )
|
||||||
return false;
|
return false;
|
||||||
@@ -153,22 +63,25 @@ return false;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Mount::IsArg(Mount::ParamCode code, const std::string & arg)
|
bool Mount::IsArg(int code, const std::wstring & arg)
|
||||||
{
|
{
|
||||||
return IsArg(code, arg.c_str());
|
return IsArg(code, arg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Mount::IsArg(Mount::ParamCode code, int arg)
|
bool Mount::IsArg(int code, int arg)
|
||||||
{
|
{
|
||||||
ParamArg::iterator i;
|
ParamRow::ParamArg::iterator i;
|
||||||
|
|
||||||
|
if( code < 0 || code >= (int)param.size() )
|
||||||
|
return false;
|
||||||
|
|
||||||
if( !param[code].defined )
|
if( !param[code].defined )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for(i=param[code].arg.begin() ; i!=param[code].arg.end() ; ++i)
|
for(i=param[code].arg.begin() ; i!=param[code].arg.end() ; ++i)
|
||||||
{
|
{
|
||||||
if( atoi(i->c_str()) == arg )
|
if( Toi(*i) == arg )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,3 +89,23 @@ return false;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::wstring & Mount::Arg(int code, int arg) const
|
||||||
|
{
|
||||||
|
if( code < 0 || code >= (int)param.size() )
|
||||||
|
return empty_str;
|
||||||
|
|
||||||
|
if( !param[code].defined )
|
||||||
|
return empty_str;
|
||||||
|
|
||||||
|
if( arg >= (int)param[code].arg.size() )
|
||||||
|
return empty_str;
|
||||||
|
|
||||||
|
return param[code].arg[arg];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::wstring & Mount::FirstArg(int code) const
|
||||||
|
{
|
||||||
|
return Arg(code, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user