author | Michael Krelin <hacker@klever.net> | 2020-10-07 22:52:19 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2020-10-07 22:52:19 (UTC) |
commit | c561689bf162fb22997bd88f4392f222f151c950 (patch) (unidiff) | |
tree | ce4656e92c379f7089f4bb72a4b10d781b61211e | |
parent | 3a4530372bc95d728dbddbac788f2c1f2d03a030 (diff) | |
download | kingate-c561689bf162fb22997bd88f4392f222f151c950.zip kingate-c561689bf162fb22997bd88f4392f222f151c950.tar.gz kingate-c561689bf162fb22997bd88f4392f222f151c950.tar.bz2 |
-rw-r--r-- | src/cgi_gateway.cc | 1 | ||||
-rw-r--r-- | src/fastcgi.cc | 1 | ||||
-rw-r--r-- | src/plaincgi.cc | 1 | ||||
-rw-r--r-- | src/util.cc | 1 |
4 files changed, 4 insertions, 0 deletions
diff --git a/src/cgi_gateway.cc b/src/cgi_gateway.cc index a2681aa..3763654 100644 --- a/src/cgi_gateway.cc +++ b/src/cgi_gateway.cc | |||
@@ -1,51 +1,52 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <ctype.h> | 2 | #include <ctype.h> |
3 | #include <sstream> | 3 | #include <sstream> |
4 | #include <cstring> | ||
4 | #include "kingate/cgi_gateway.h" | 5 | #include "kingate/cgi_gateway.h" |
5 | #include "kingate/util.h" | 6 | #include "kingate/util.h" |
6 | #include "kingate/exception.h" | 7 | #include "kingate/exception.h" |
7 | #include "config.h" | 8 | #include "config.h" |
8 | #ifdef HAVE_MIMETIC | 9 | #ifdef HAVE_MIMETIC |
9 | # include <mimetic/mimeentity.h> | 10 | # include <mimetic/mimeentity.h> |
10 | # include <mimetic/parser/itparser.h> | 11 | # include <mimetic/parser/itparser.h> |
11 | #endif /* HAVE_MIMETIC */ | 12 | #endif /* HAVE_MIMETIC */ |
12 | 13 | ||
13 | namespace kingate { | 14 | namespace kingate { |
14 | 15 | ||
15 | #ifdef HAVE_MIMETIC | 16 | #ifdef HAVE_MIMETIC |
16 | using mimetic::MimeEntity; | 17 | using mimetic::MimeEntity; |
17 | 18 | ||
18 | struct TornMimeEntity : public MimeEntity { | 19 | struct TornMimeEntity : public MimeEntity { |
19 | typedef istreambuf_iterator<char> it_type; | 20 | typedef istreambuf_iterator<char> it_type; |
20 | typedef it_type::iterator_category it_cat; | 21 | typedef it_type::iterator_category it_cat; |
21 | struct IParser : public mimetic::IteratorParser<it_type,it_cat> { | 22 | struct IParser : public mimetic::IteratorParser<it_type,it_cat> { |
22 | typedef mimetic::IteratorParser<it_type,it_cat> BT; | 23 | typedef mimetic::IteratorParser<it_type,it_cat> BT; |
23 | IParser(MimeEntity& me) | 24 | IParser(MimeEntity& me) |
24 | : BT::IteratorParser<it_type,it_cat>(me) { } | 25 | : BT::IteratorParser<it_type,it_cat>(me) { } |
25 | void loadHeader(it_type bit,it_type eit) { | 26 | void loadHeader(it_type bit,it_type eit) { |
26 | m_bit = bit; m_eit = eit; | 27 | m_bit = bit; m_eit = eit; |
27 | BT::loadHeader(); | 28 | BT::loadHeader(); |
28 | } | 29 | } |
29 | void loadBody(it_type bit,it_type eit) { | 30 | void loadBody(it_type bit,it_type eit) { |
30 | m_bit = bit; m_eit = eit; | 31 | m_bit = bit; m_eit = eit; |
31 | BT::loadBody(); | 32 | BT::loadBody(); |
32 | } | 33 | } |
33 | }; | 34 | }; |
34 | void load(istream& hs,istream& bs,int mask=0) { | 35 | void load(istream& hs,istream& bs,int mask=0) { |
35 | IParser prs(*this); | 36 | IParser prs(*this); |
36 | prs.iMask(mask); | 37 | prs.iMask(mask); |
37 | prs.loadHeader(it_type(hs),it_type()); | 38 | prs.loadHeader(it_type(hs),it_type()); |
38 | prs.loadBody(it_type(bs),it_type()); | 39 | prs.loadBody(it_type(bs),it_type()); |
39 | } | 40 | } |
40 | }; | 41 | }; |
41 | #endif /* HAVE_MIMETIC */ | 42 | #endif /* HAVE_MIMETIC */ |
42 | 43 | ||
43 | static string empty_string; | 44 | static string empty_string; |
44 | 45 | ||
45 | cgi_gateway::basic_file_t::~basic_file_t() { } | 46 | cgi_gateway::basic_file_t::~basic_file_t() { } |
46 | 47 | ||
47 | class string_file_t : public cgi_gateway::basic_file_t { | 48 | class string_file_t : public cgi_gateway::basic_file_t { |
48 | public: | 49 | public: |
49 | string _file_name; | 50 | string _file_name; |
50 | string _content_type; | 51 | string _content_type; |
51 | stringstream _content; | 52 | stringstream _content; |
diff --git a/src/fastcgi.cc b/src/fastcgi.cc index 8b7668c..5a6c081 100644 --- a/src/fastcgi.cc +++ b/src/fastcgi.cc | |||
@@ -1,51 +1,52 @@ | |||
1 | #include <unistd.h> | 1 | #include <unistd.h> |
2 | #include <sys/types.h> | 2 | #include <sys/types.h> |
3 | #include <sys/stat.h> | 3 | #include <sys/stat.h> |
4 | #include <cstring> | ||
4 | #include "kingate/fastcgi.h" | 5 | #include "kingate/fastcgi.h" |
5 | #include "kingate/exception.h" | 6 | #include "kingate/exception.h" |
6 | 7 | ||
7 | namespace kingate { | 8 | namespace kingate { |
8 | 9 | ||
9 | bool fcgi_socket::_initialized = false; | 10 | bool fcgi_socket::_initialized = false; |
10 | 11 | ||
11 | fcgi_socket::fcgi_socket(const char *s,int bl) | 12 | fcgi_socket::fcgi_socket(const char *s,int bl) |
12 | : sock(-1) { | 13 | : sock(-1) { |
13 | if(!_initialized) { | 14 | if(!_initialized) { |
14 | if( FCGX_Init() ) | 15 | if( FCGX_Init() ) |
15 | throw exception(CODEPOINT,"failed to FCGX_Init()"); | 16 | throw exception(CODEPOINT,"failed to FCGX_Init()"); |
16 | _initialized = true; | 17 | _initialized = true; |
17 | } | 18 | } |
18 | sock = FCGX_OpenSocket(s,bl); | 19 | sock = FCGX_OpenSocket(s,bl); |
19 | if(sock<0) | 20 | if(sock<0) |
20 | throw exception(CODEPOINT,"failed to FCGX_OpenSocket("); | 21 | throw exception(CODEPOINT,"failed to FCGX_OpenSocket("); |
21 | // TODO: check if there is a ':', not if it starts with ':' | 22 | // TODO: check if there is a ':', not if it starts with ':' |
22 | if(*s != ':') | 23 | if(*s != ':') |
23 | if(chmod(s,0777)) // XXX: configurable. | 24 | if(chmod(s,0777)) // XXX: configurable. |
24 | throw exception(CODEPOINT,"failed to chmod()"); | 25 | throw exception(CODEPOINT,"failed to chmod()"); |
25 | } | 26 | } |
26 | fcgi_socket::fcgi_socket(int s) | 27 | fcgi_socket::fcgi_socket(int s) |
27 | : sock(0) { | 28 | : sock(0) { |
28 | if(!_initialized) { | 29 | if(!_initialized) { |
29 | if( FCGX_Init() ) | 30 | if( FCGX_Init() ) |
30 | throw exception(CODEPOINT,"failed to FCGX_Init()"); | 31 | throw exception(CODEPOINT,"failed to FCGX_Init()"); |
31 | _initialized = true; | 32 | _initialized = true; |
32 | } | 33 | } |
33 | } | 34 | } |
34 | fcgi_socket::~fcgi_socket() { | 35 | fcgi_socket::~fcgi_socket() { |
35 | if(sock>=0) | 36 | if(sock>=0) |
36 | close(sock); | 37 | close(sock); |
37 | } | 38 | } |
38 | 39 | ||
39 | fcgi_interface::fcgi_interface(fcgi_socket& s,int f) | 40 | fcgi_interface::fcgi_interface(fcgi_socket& s,int f) |
40 | : sbin(buf_sbin,sizeof(buf_sbin)), | 41 | : sbin(buf_sbin,sizeof(buf_sbin)), |
41 | sbout(buf_sbout,sizeof(buf_sbout)), | 42 | sbout(buf_sbout,sizeof(buf_sbout)), |
42 | sberr(buf_sberr,sizeof(buf_sberr)), | 43 | sberr(buf_sberr,sizeof(buf_sberr)), |
43 | sin(&sbin), sout(&sbout), serr(&sberr) { | 44 | sin(&sbin), sout(&sbout), serr(&sberr) { |
44 | if( FCGX_InitRequest(&request,s.sock,f) ) | 45 | if( FCGX_InitRequest(&request,s.sock,f) ) |
45 | throw exception(CODEPOINT,"failed to FCGX_InitRequest()"); | 46 | throw exception(CODEPOINT,"failed to FCGX_InitRequest()"); |
46 | if( FCGX_Accept_r(&request) ) | 47 | if( FCGX_Accept_r(&request) ) |
47 | throw exception(CODEPOINT,"failed to FCGX_Accept_r()"); | 48 | throw exception(CODEPOINT,"failed to FCGX_Accept_r()"); |
48 | sbin.attach(request.in); | 49 | sbin.attach(request.in); |
49 | sbout.attach(request.out); | 50 | sbout.attach(request.out); |
50 | sberr.attach(request.err); | 51 | sberr.attach(request.err); |
51 | for(char **p = request.envp; *p; p++) { | 52 | for(char **p = request.envp; *p; p++) { |
diff --git a/src/plaincgi.cc b/src/plaincgi.cc index 1cb7dc6..3a82d33 100644 --- a/src/plaincgi.cc +++ b/src/plaincgi.cc | |||
@@ -1,32 +1,33 @@ | |||
1 | #include <unistd.h> | 1 | #include <unistd.h> |
2 | #include <sys/types.h> | 2 | #include <sys/types.h> |
3 | #include <sys/stat.h> | 3 | #include <sys/stat.h> |
4 | #include <cstring> | ||
4 | #include "kingate/plaincgi.h" | 5 | #include "kingate/plaincgi.h" |
5 | #include "kingate/exception.h" | 6 | #include "kingate/exception.h" |
6 | #include "config.h" | 7 | #include "config.h" |
7 | 8 | ||
8 | #if !HAVE_DECL_ENVIRON | 9 | #if !HAVE_DECL_ENVIRON |
9 | extern char **environ; | 10 | extern char **environ; |
10 | #endif /* HAVE_DECL_ENVIRON */ | 11 | #endif /* HAVE_DECL_ENVIRON */ |
11 | 12 | ||
12 | namespace kingate { | 13 | namespace kingate { |
13 | 14 | ||
14 | plaincgi_interface::plaincgi_interface() { | 15 | plaincgi_interface::plaincgi_interface() { |
15 | for(char **p = environ; *p; p++) { | 16 | for(char **p = environ; *p; p++) { |
16 | const char *e = strchr(*p,'='); | 17 | const char *e = strchr(*p,'='); |
17 | if(!e){ | 18 | if(!e){ |
18 | // XXX: check if we have it already? | 19 | // XXX: check if we have it already? |
19 | metavars[*p] = string(0); | 20 | metavars[*p] = string(0); |
20 | }else{ | 21 | }else{ |
21 | int l = e-*p; e++; | 22 | int l = e-*p; e++; |
22 | // XXX: check if we have it already? | 23 | // XXX: check if we have it already? |
23 | metavars[string(*p,l)]=e; | 24 | metavars[string(*p,l)]=e; |
24 | } | 25 | } |
25 | } | 26 | } |
26 | } | 27 | } |
27 | plaincgi_interface::~plaincgi_interface() { | 28 | plaincgi_interface::~plaincgi_interface() { |
28 | cout.flush(); | 29 | cout.flush(); |
29 | cerr.flush(); | 30 | cerr.flush(); |
30 | } | 31 | } |
31 | 32 | ||
32 | } | 33 | } |
diff --git a/src/util.cc b/src/util.cc index 48e486a..76e684f 100644 --- a/src/util.cc +++ b/src/util.cc | |||
@@ -1,48 +1,49 @@ | |||
1 | #include <cstring> | ||
1 | #include "kingate/util.h" | 2 | #include "kingate/util.h" |
2 | #include "kingate/exception.h" | 3 | #include "kingate/exception.h" |
3 | 4 | ||
4 | namespace kingate { | 5 | namespace kingate { |
5 | 6 | ||
6 | static const char *safeChars = | 7 | static const char *safeChars = |
7 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | 8 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
8 | "abcdefghijklmnopqrstuvwxyz" | 9 | "abcdefghijklmnopqrstuvwxyz" |
9 | "0123456789" | 10 | "0123456789" |
10 | "_-" ; | 11 | "_-" ; |
11 | 12 | ||
12 | string url_encode(const string& str) { | 13 | string url_encode(const string& str) { |
13 | string rv = str; | 14 | string rv = str; |
14 | string::size_type screwed = 0; | 15 | string::size_type screwed = 0; |
15 | for(;;) { | 16 | for(;;) { |
16 | screwed = rv.find_first_not_of(safeChars,screwed); | 17 | screwed = rv.find_first_not_of(safeChars,screwed); |
17 | if(screwed == string::npos) | 18 | if(screwed == string::npos) |
18 | break; | 19 | break; |
19 | while(screwed<rv.length() && !strchr(safeChars,rv.at(screwed))) { | 20 | while(screwed<rv.length() && !strchr(safeChars,rv.at(screwed))) { |
20 | char danger = rv.at(screwed); | 21 | char danger = rv.at(screwed); |
21 | if(danger==' ') { | 22 | if(danger==' ') { |
22 | rv.replace(screwed++,1,1,'+'); | 23 | rv.replace(screwed++,1,1,'+'); |
23 | }else{ | 24 | }else{ |
24 | static char tmp[4] = {'%',0,0,0}; | 25 | static char tmp[4] = {'%',0,0,0}; |
25 | snprintf(&tmp[1],3,"%02X",0xFF&(int)danger); | 26 | snprintf(&tmp[1],3,"%02X",0xFF&(int)danger); |
26 | rv.replace(screwed,1,tmp,3); | 27 | rv.replace(screwed,1,tmp,3); |
27 | screwed+=3; | 28 | screwed+=3; |
28 | } | 29 | } |
29 | } | 30 | } |
30 | } | 31 | } |
31 | return rv; | 32 | return rv; |
32 | } | 33 | } |
33 | string url_decode(const string& str) { | 34 | string url_decode(const string& str) { |
34 | string rv = str; | 35 | string rv = str; |
35 | string::size_type unscrewed = 0; | 36 | string::size_type unscrewed = 0; |
36 | for(;;) { | 37 | for(;;) { |
37 | unscrewed = rv.find_first_of("%+",unscrewed); | 38 | unscrewed = rv.find_first_of("%+",unscrewed); |
38 | if(unscrewed == string::npos) | 39 | if(unscrewed == string::npos) |
39 | break; | 40 | break; |
40 | if(rv.at(unscrewed)=='+') { | 41 | if(rv.at(unscrewed)=='+') { |
41 | rv.replace(unscrewed++,1,1,' '); | 42 | rv.replace(unscrewed++,1,1,' '); |
42 | }else{ | 43 | }else{ |
43 | if((rv.length()-unscrewed)<3) | 44 | if((rv.length()-unscrewed)<3) |
44 | throw exception(CODEPOINT,"incorrectly escaped string"); | 45 | throw exception(CODEPOINT,"incorrectly escaped string"); |
45 | // XXX: ensure it's hex? | 46 | // XXX: ensure it's hex? |
46 | int danger = strtol(rv.substr(unscrewed+1,2).c_str(),NULL,16); | 47 | int danger = strtol(rv.substr(unscrewed+1,2).c_str(),NULL,16); |
47 | rv.replace(unscrewed,3,1,danger); | 48 | rv.replace(unscrewed,3,1,danger); |
48 | unscrewed++; | 49 | unscrewed++; |