1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
This commit is contained in:
stefanocasazza 2018-07-17 14:12:26 +02:00
parent 02c37ff0c8
commit 8d5dfd4b06
7 changed files with 169 additions and 31 deletions

View File

@ -627,23 +627,6 @@ public:
U_RETURN(st_dev != parent_id);
}
// MODIFIER
bool modified()
{
U_TRACE_NO_PARAM(0, "UFile::modified()")
time_t mtime = st_mtime;
fstat();
U_INTERNAL_DUMP("mtime = %ld, st_mtime = %ld", (long)mtime, (long)st_mtime)
if (mtime != st_mtime) U_RETURN(true);
U_RETURN(false);
}
static bool isBlocking(int _fd, int& flags) // actual state is blocking...?
{
U_TRACE(1, "UFile::isBlocking(%d,%d)", _fd, flags)
@ -754,6 +737,42 @@ public:
U_RETURN(false);
}
bool isModified()
{
U_TRACE_NO_PARAM(0, "UFile::isModified()")
time_t old = st_mtime;
fstat();
U_INTERNAL_DUMP("old = %#3D, st_mtime = %#3D", old, st_mtime)
if (st_mtime > old) U_RETURN(true);
U_RETURN(false);
}
static bool isModified(const char* _pathname, time_t& old)
{
U_TRACE(0, "UFile::isModified(%S,%ld)", _pathname, old)
struct stat st;
if (U_SYSCALL(stat, "%S,%p", U_PATH_CONV(_pathname), &st) == 0)
{
U_INTERNAL_DUMP("old = %#3D, st.st_mtime = %#3D", old, st.st_mtime)
if (st.st_mtime > old)
{
old = st.st_mtime;
U_RETURN(true);
}
}
U_RETURN(false);
}
static bool isRunningInChroot();
static bool fallocate(int fd, uint32_t n);
static bool chdir(const char* path, bool flag_save = false);

View File

@ -36,7 +36,7 @@ enum StringAllocationIndex {
STR_ALLOCATE_INDEX_SSI = STR_ALLOCATE_INDEX_IMAP+4,
STR_ALLOCATE_INDEX_NOCAT = STR_ALLOCATE_INDEX_SSI+2,
STR_ALLOCATE_INDEX_HTTP = STR_ALLOCATE_INDEX_NOCAT+2,
STR_ALLOCATE_INDEX_QUERY_PARSER = STR_ALLOCATE_INDEX_HTTP+9,
STR_ALLOCATE_INDEX_QUERY_PARSER = STR_ALLOCATE_INDEX_HTTP+11,
STR_ALLOCATE_INDEX_ORM = STR_ALLOCATE_INDEX_QUERY_PARSER+5,
STR_ALLOCATE_INDEX_HTTP2 = STR_ALLOCATE_INDEX_ORM+15
};
@ -416,6 +416,7 @@ public:
U_RETURN(false);
}
bool equal(const char* s) const { return equal(s, u__strlen(s, __PRETTY_FUNCTION__)); }
bool equal(const UStringRep* rep) const { return equal(rep->str, rep->_length); }
// Equal with ignore case
@ -1155,6 +1156,8 @@ public:
static const UString* str_storage_keyid;
static const UString* str_websocket_key;
static const UString* str_websocket_prot;
static const UString* str_htdigest;
static const UString* str_htpasswd;
// QUERY PARSER
static const UString* str_p1;
static const UString* str_p2;

View File

@ -574,6 +574,7 @@ public:
static UString* htdigest;
static bool digest_authentication; // authentication method (digest|basic)
static UString* user_authentication;
static time_t htdigest_mtime, htpasswd_mtime;
static UString getUserAuthentication() { return *user_authentication; }
@ -1511,6 +1512,7 @@ private:
static void manageDataForCache(const UString& basename, const UString& suffix) U_NO_EXPORT;
static bool checkDataSession(const UString& token, time_t expire, UString* data) U_NO_EXPORT;
static void putDataInCache(const UString& path, const UString& fmt, UString& content) U_NO_EXPORT;
static uint32_t checkPasswd(UFileCacheData* ptr_file_data, UString& fpasswd, const UString& line) U_NO_EXPORT;
static void addContentLengthToHeader(UString& header, char* ptr, uint32_t size, const char* pEndHeader = U_NULLPTR) U_NO_EXPORT;
static void setDataInCache(const UString& fmt, const UString& content, const char* encoding, uint32_t encoding_len) U_NO_EXPORT;
static bool processAuthorization(const char* ptr = U_NULLPTR, uint32_t sz = 0, const char* pattern = U_NULLPTR, uint32_t len = 0) U_NO_EXPORT;

View File

@ -86,6 +86,8 @@ const UString* UString::str_ulib_header;
const UString* UString::str_storage_keyid;
const UString* UString::str_websocket_key;
const UString* UString::str_websocket_prot;
const UString* UString::str_htpasswd;
const UString* UString::str_htdigest;
// QUERY PARSER
const UString* UString::str_p1;
const UString* UString::str_p2;
@ -179,9 +181,9 @@ const UString* UString::str_ULib;
#endif
#ifdef U_HTTP2_DISABLE
static ustringrep stringrep_storage[72] = {
static ustringrep stringrep_storage[74] = {
#else
static ustringrep stringrep_storage[136] = {
static ustringrep stringrep_storage[138] = {
#endif
{ U_STRINGREP_FROM_CONSTANT("host") },
{ U_STRINGREP_FROM_CONSTANT("chunked") },
@ -239,6 +241,8 @@ static ustringrep stringrep_storage[136] = {
{ U_STRINGREP_FROM_CONSTANT("StiD") },
{ U_STRINGREP_FROM_CONSTANT("Sec-WebSocket-Key") },
{ U_STRINGREP_FROM_CONSTANT("Sec-WebSocket-Protocol") },
{ U_STRINGREP_FROM_CONSTANT("../.htpasswd") },
{ U_STRINGREP_FROM_CONSTANT("../.htdigest") },
// QUERY PARSER
{ U_STRINGREP_FROM_CONSTANT("(") },
{ U_STRINGREP_FROM_CONSTANT(")") },
@ -458,7 +462,9 @@ void UString::str_allocate(int which)
U_INTERNAL_ASSERT_EQUALS(str_ulib_header, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_storage_keyid, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_websocket_key, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_websocket_prot, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_websocket_key, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_htpasswd, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(str_htdigest, U_NULLPTR)
U_NEW_ULIB_STRING(str_ctype_tsa, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+0));
U_NEW_ULIB_STRING(str_ctype_txt, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+1));
@ -469,6 +475,8 @@ void UString::str_allocate(int which)
U_NEW_ULIB_STRING(str_storage_keyid, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+6));
U_NEW_ULIB_STRING(str_websocket_key, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+7));
U_NEW_ULIB_STRING(str_websocket_prot, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+8));
U_NEW_ULIB_STRING(str_htpasswd, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+9));
U_NEW_ULIB_STRING(str_htdigest, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP+10));
}
else if ((which & STR_ALLOCATE_QUERY_PARSER) != 0)
{
@ -522,7 +530,7 @@ void UString::str_allocate(int which)
else if ((which & STR_ALLOCATE_HTTP2) != 0)
{
U_INTERNAL_ASSERT_EQUALS(str_authority, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(U_NUM_ELEMENTS(stringrep_storage), 136)
U_INTERNAL_ASSERT_EQUALS(U_NUM_ELEMENTS(stringrep_storage), 138)
U_NEW_ULIB_STRING(str_authority, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP2+0));
U_NEW_ULIB_STRING(str_method, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP2+1));
@ -590,7 +598,7 @@ void UString::str_allocate(int which)
U_NEW_ULIB_STRING(str_ULib, UString(stringrep_storage+STR_ALLOCATE_INDEX_HTTP2+63));
}
#else
U_INTERNAL_ASSERT_EQUALS(U_NUM_ELEMENTS(stringrep_storage), 72)
U_INTERNAL_ASSERT_EQUALS(U_NUM_ELEMENTS(stringrep_storage), 74)
#endif
}

View File

@ -81,6 +81,8 @@ URDB* UHTTP::db_not_found;
off_t UHTTP::range_size;
off_t UHTTP::range_start;
UFile* UHTTP::file;
time_t UHTTP::htdigest_mtime;
time_t UHTTP::htpasswd_mtime;
UString* UHTTP::ext;
UString* UHTTP::etag;
UString* UHTTP::geoip;
@ -7472,6 +7474,98 @@ next:
handlerResponse();
}
U_NO_EXPORT uint32_t UHTTP::checkPasswd(UHTTP::UFileCacheData* ptr_file_data, UString& fpasswd, const UString& line)
{
U_TRACE(0, "UHTTP::checkPasswd(%p,%V,%V)", ptr_file_data, fpasswd.rep, line.rep)
// s.casazza:{SHA}Lkii1ZE7k.....\n
// s.casazza:Protected Area:b9ee2af50be37...........\n
uint32_t pos = fpasswd.find(line);
if (pos == U_NOT_FOUND ||
(pos > 0 && line[pos-1] != '\n'))
{
U_INTERNAL_DUMP("digest_authentication = %b htpasswd = %p", digest_authentication, htpasswd)
if (ptr_file_data)
{
U_ASSERT(cache_file->key()->equal(u_buffer))
UString lpathname = cache_file->getKey();
UFile tmp(lpathname);
if (tmp.open() &&
(tmp.st_mtime = ptr_file_data->mtime, tmp.isModified()))
{
ptr_file_data->array->erase(0);
fpasswd = tmp.getContent(true, false, true);
ptr_file_data->array->push_back(fpasswd);
U_SRV_LOG("File data users permission: %V reloaded - %u bytes", lpathname.rep, fpasswd.size());
goto next;
}
tmp.close();
}
else
{
if (digest_authentication)
{
U_INTERNAL_ASSERT(htdigest)
UFile tmp(*UString::str_htdigest);
if (tmp.open() &&
(tmp.st_mtime = htdigest_mtime, tmp.isModified()))
{
fpasswd = *htdigest = tmp.getContent(true, false, true);
U_SRV_LOG("File data users permission: ../.htdigest reloaded - %u bytes", fpasswd.size());
goto next;
}
tmp.close();
}
else
{
U_INTERNAL_ASSERT(htpasswd)
UFile tmp(*UString::str_htpasswd);
if (tmp.open() &&
(tmp.st_mtime = htpasswd_mtime, tmp.isModified()))
{
fpasswd = *htpasswd = tmp.getContent(true, false, true);
U_SRV_LOG("File data users permission: ../.htpasswd reloaded - %u bytes", fpasswd.size());
goto next;
}
tmp.close();
}
}
U_RETURN(U_NOT_FOUND);
next: pos = fpasswd.find(line);
if (pos == U_NOT_FOUND ||
(pos > 0 && line[pos-1] != '\n'))
{
U_RETURN(U_NOT_FOUND);
}
}
U_RETURN(pos);
}
U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, const char* pattern, uint32_t len)
{
U_TRACE(0, "UHTTP::processAuthorization(%.*S,%u,%.*S,%u)", sz, request, sz, len, pattern, len)
@ -7712,7 +7806,7 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
// s.casazza:Protected Area:b9ee2af50be37...........\n
pos = fpasswd.find(buffer);
pos = checkPasswd(ptr_file_data, fpasswd, buffer);
if (pos == U_NOT_FOUND) goto end;
@ -7771,7 +7865,7 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
// s.casazza:{SHA}Lkii1ZE7k.....\n
if (fpasswd.find(line) != U_NOT_FOUND) result = true;
if (checkPasswd(ptr_file_data, fpasswd, line) != U_NOT_FOUND) result = true;
}
}
}
@ -8773,6 +8867,9 @@ U_NO_EXPORT void UHTTP::manageDataForCache(const UString& basename, const UStrin
if (bpasswd)
{
U_INTERNAL_ASSERT_EQUALS(htpasswd, U_NULLPTR)
U_ASSERT_EQUALS(lpathname, *UString::str_htpasswd)
htpasswd_mtime = file->st_mtime;
U_NEW_STRING(htpasswd, UString(content));
@ -8782,6 +8879,9 @@ U_NO_EXPORT void UHTTP::manageDataForCache(const UString& basename, const UStrin
{
U_INTERNAL_ASSERT(bdigest)
U_INTERNAL_ASSERT_EQUALS(htdigest, U_NULLPTR)
U_ASSERT_EQUALS(lpathname, *UString::str_htdigest)
htdigest_mtime = file->st_mtime;
U_NEW_STRING(htdigest, UString(content));
@ -11566,17 +11666,13 @@ bool UHTTP::checkIfSourceHasChangedAndCompileUSP()
if (suffix.empty())
{
struct stat st;
char buffer[U_PATH_MAX+1];
if (getFileCachePointer(buffer, u__snprintf(buffer, U_PATH_MAX, U_CONSTANT_TO_PARAM("%.*s.usp"), U_FILE_TO_TRACE(*file))) &&
U_SYSCALL(stat, "%S,%p", buffer, &st) == 0 &&
st.st_mtime > file_data->mtime)
UFile::isModified(buffer, file_data->mtime))
{
U_INTERNAL_ASSERT_POINTER(usp)
U_INTERNAL_DUMP("st.st_mtime = %#3D file_data->mtime = %#3D", st.st_mtime, file_data->mtime)
compile: if (compileUSP(ptr, len) == false)
{
err: setInternalError();

View File

@ -1 +1 @@
01D3
01E1

View File

@ -143,6 +143,16 @@ U_EXPORT main (int argc, char* argv[], char* env[])
char buffer[4096];
uint32_t i, n, params[2] = { 2, 1 };
UString result(U_CAPACITY), result1, filename, content, array;
/*
double lat, lon;
content = U_STRING_FROM_CONSTANT("{ \"joinedAtLon\" : \"-73.968285\", \"token\" : \"A8Ngwl5\", \"joinedAtLat\" : \"40.785091\", \"number\" : \"+12016752089\" }");
(void) U_JFIND(content, "joinedAtLat", lat);
(void) U_JFIND(content, "joinedAtLon", lon);
U_INTERNAL_DUMP("lat = %f lon = %f", lat, lon)
*/
UValue::jsonParseFlags = 2;