mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Merge pull request #229 from vDorst/fix_login
Fix and refactor is_url_word_x()
This commit is contained in:
+45
-19
@@ -131,28 +131,46 @@ char is_word(__xdata uint8_t *c, __code uint8_t * __xdata d)
|
||||
}
|
||||
|
||||
|
||||
char is_url_word_x(__xdata uint8_t *c, __xdata uint8_t *d)
|
||||
bool is_url_word_x(__xdata uint8_t *uri_str_p, __xdata uint8_t *src_str_p)
|
||||
{
|
||||
uint8_t i = 0, j = 0;
|
||||
uint8_t u, s;
|
||||
|
||||
while (d[i]) {
|
||||
if (c[j] == '%') {
|
||||
uint8_t v;
|
||||
j++;
|
||||
v = c[j] - '0' < 10 ? (c[j] - '0') << 4 : (c[j] - 'A' + 10) << 4;
|
||||
j++;
|
||||
v += c[j] - '0' < 10 ? c[j] - '0' : c[j] - 'A' + 10;
|
||||
if (d[i] != v)
|
||||
return 0;
|
||||
} else if (d[i] != c[j])
|
||||
return 0;
|
||||
i++;
|
||||
j++;
|
||||
while(1) {
|
||||
u = *uri_str_p++;
|
||||
s = *src_str_p++;
|
||||
|
||||
if (s == '\0') {
|
||||
if (u != '\0' && u != ' ' && u != '\t' && u != ':' && u != '?' && u != '=' && u != '\n' && u != '\r')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (u == '%') {
|
||||
bool again = true;
|
||||
u = 0;
|
||||
|
||||
while(1) {
|
||||
// Swap instruction is fine for rotation
|
||||
u = (u << 4) | (u >> 4);
|
||||
|
||||
uint8_t p = *uri_str_p++;
|
||||
u |= p - '0' < 10 ? (p - '0') : (p - 'A' + 10);
|
||||
|
||||
// force `jbc`-instruction.
|
||||
if (again) {
|
||||
again = false;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (u == '+') {
|
||||
u = ' ';
|
||||
}
|
||||
|
||||
if (s != u) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (c[j] != ' ' && c[j] != '\t' && c[j] != ':' && c[j] != '?' && c[j] != '=' && c[j] != '\n' && c[j] != '\r' && c[j])
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -441,6 +459,13 @@ void handle_post(void)
|
||||
}
|
||||
} else if (is_word(request_path, "login")) {
|
||||
dbg_string("POST login\n");
|
||||
|
||||
if (!content_type || !is_word(content_type, "application/x-www-form-urlencoded")) {
|
||||
dbg_string("Bad request!\n");
|
||||
send_bad_request();
|
||||
return;
|
||||
}
|
||||
|
||||
p += 8; // Read also over "pwd="
|
||||
if (is_url_word_x(p, passwd)) {
|
||||
dbg_string("Password accepted!\n");
|
||||
@@ -453,6 +478,7 @@ void handle_post(void)
|
||||
outbuf[slen++] = session_id[i];
|
||||
slen += strtox(outbuf + slen, "; SameSite=Strict\r\n\r\n");
|
||||
} else {
|
||||
dbg_string("Password invalid!\n");
|
||||
slen = strtox(outbuf, "HTTP/1.1 302 Found\r\nLocation: login.html\r\n\r\n");
|
||||
}
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user