This commit is contained in:
pvvx 2017-04-23 12:26:57 +03:00
parent fa343db334
commit 2e503268fa
18 changed files with 191 additions and 81 deletions

View file

@ -32,7 +32,7 @@
</table>
<p class="center">
<input type='submit' value='Set Config' class="button">
<input type='hidden' name='wifi_newcfg' value='0x21C00'>
<input type='hidden' name='wifi_newcfg' value='0xfff'>
</p>
</form>
<div id="connection"></div>

View file

@ -57,16 +57,14 @@
<td><select name='wifi_st_auth'>
<option value='0'>OPEN</option>
<option value='1'>WEP_PSK</option>
<option value='32769'>WEP_SHAREDK</option>
<option value='2097154'>WPA_TKIP_PSK</option>
<option value='2097156'>WPA_AES_PSK</option>
<option value='4194306'>WPA2_TKIP_PSK</option>
<option value='4194308'>WPA2_AES_PSK</option>
<option value='4194310'>WPA2_MIXED_PSK</option>
<option value='6291456'>WPA_WPA2_MIXED</option>
<option value='268435456'>WPS_OPEN</option>
<option value='268435460'>WPS_SECURE</option>
<option value='2147483647'>UNKNOWN</option>
<option value='2'>WEP_SHAREDK</option>
<option value='3'>WPA_TKIP_PSK</option>
<option value='4'>WPA_AES_PSK</option>
<option value='5'>WPA2_TKIP_PSK</option>
<option value='6'>WPA2_AES_PSK</option>
<option value='7'>WPA2_MIXED_PSK</option>
<option value='8'>WPA_WPA2_MIXED</option>
<option value='9'>UNKNOWN</option>
</select></td>
</tr>
<tr>
@ -179,7 +177,7 @@ var cfg = {
wifi_phy:"~wifi_bgn~",
wifi_mode:"~wifi_mode~",
wifi_sleep:"~wifi_sleep~",
wifi_st_autn:"~wifi_st_auth~",
wifi_st_auth:"~wifi_st_auth~",
wifi_st_sbss:"~wifi_st_sbss~",
wifi_ap_hssid:"~wifi_ap_hssid~",
wifi_ap_dhcp:"~wifi_ap_dhcp~",

View file

@ -4,6 +4,6 @@ if(x){
var d = new Date(x);
document.getElementById('sntptime').innerHTML= d.toLocaleDateString()+" "+d.toLocaleTimeString();
}
var d = new Date(new Date()-(~sys_mactime~/1000));
var d = new Date(new Date()-(~sys_time~));
document.getElementById('starttime').innerHTML= d.toLocaleDateString()+" "+d.toLocaleTimeString();
</script>

View file

@ -1 +1 @@
<response><name>Test</name><value>~wifi_st_rssi~</value><measure>?</measure></response>
<response><name>Test</name><value>-1*~wifi_st_rssi~</value><measure>?</measure></response>

View file

@ -1,5 +1,5 @@
define call1
set $ImageSize = 0xF1E0
set $ImageSize = 0xF140
set $ImageAddr = 0x0D0000
end
define call2

View file

@ -25,7 +25,7 @@ enum srvconn_state {
// приоритет pcb 1..127 1 - min, 127 - max
#ifndef TCP_SRV_PRIO
#define TCP_SRV_PRIO 99 //TCP_PRIO_MIN
#define TCP_SRV_PRIO 99 // TCP_PRIO_MIN
#endif
// максимальное кол-во TCP c TIME_WAIT
@ -145,11 +145,11 @@ typedef err_t (*func_sent_callback)(TCP_SERV_CONN *ts_conn); // блок дан
typedef struct t_TCP_SERV_CFG {
struct t_tcpsrv_conn_flags flag; // начальные флаги для соединения
uint16 port; // номер порта (=1 - client)
uint16 max_conn; // максимальное кол-во одновременных соединений, если client = кол-во повторов соединения
uint16 conn_count; // кол-во текущих соединений, при инициализации прописывает 0, если client = счетчик повторов соединения
uint16 min_heap; // минимальный размер heap при открытии нового соединения, при = 0 заменяется на 8192.
uint16 time_wait_rec; // время (сек) ожидания запроса (передачи пакета) от клиента, до авто-закрытия соединения, по умолчанию TCP_SRV_RECV_WAIT сек.
uint16 time_wait_cls; // время (сек) до авто-закрытия соединения после приема или передачи, по умолчанию TCP_SRV_END_WAIT сек.
uint8 max_conn; // максимальное кол-во одновременных соединений, если client = кол-во повторов соединения
uint8 conn_count; // кол-во текущих соединений, при инициализации прописывает 0, если client = счетчик повторов соединения
uint8 time_wait_rec; // время (сек) ожидания запроса (передачи пакета) от клиента, до авто-закрытия соединения, по умолчанию TCP_SRV_RECV_WAIT сек.
uint8 time_wait_cls; // время (сек) до авто-закрытия соединения после приема или передачи, по умолчанию TCP_SRV_END_WAIT сек.
TCP_SERV_CONN * conn_links; // указатель на цепочку активных соединений, при инициализации или отсуствии активных соединений = NULL
struct tcp_pcb *pcb; // начальный pcb [LISTEN] если сервер, иначе NULL
func_disconect_calback func_discon_cb; // функция вызываемая после закрытия соединения, если = NULL - не вызывается

View file

@ -11,13 +11,13 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define USE_WEB 80 // включить в трансялцию порт Web, если =0 - по умолчанию выключен
#define WEBSOCKET_ENA 1 // включить WEBSOCKET
#define WEBSOCKET_ENA 1 // включить WEBSOCKET
#define USE_SNTP 1 // включить в трансялцию драйвер SNTP, если =0 - по умолчанию выключен, = 1 - по умолчанию включен.
#define USE_NETBIOS 1 // включить в трансялцию драйвер NETBIOS, если =0 - по умолчанию выключен.
//#define USE_CPU_SPEED 166 // установить частоту CPU (по умолчанию 83)
/*
#define USE_NETBIOS 1 // включить в трансялцию драйвер NETBIOS, если =0 - по умолчанию выключен.
#define USE_SNTP 1 // включить в трансялцию драйвер SNTP, если =0 - по умолчанию выключен, = 1 - по умолчанию включен.
#define USE_RS485DRV // использовать RS-485 драйвер
#define MDB_RS485_MASTER // Modbus RTU RS-485 master & slave

View file

@ -15,12 +15,21 @@
#define WEB_SVERSION "0.2.0"
#define DEFAULT_WEB_PORT USE_WEB // 80
#define USE_WEB_AUTH_LEVEL 1
/****************************************************************************
Section:
Commands and Server Responses
***************************************************************************/
typedef enum
{
WEB_AUTH_NONE = 0,
WEB_AUTH_LEVEL_USER,
WEB_AUTH_LEVEL_USER1,
WEB_AUTH_LEVEL_WEBFS,
WEB_AUTH_LEVEL_OTA,
WEB_AUTH_LEVEL_SUPERVISOR
} WEB_AUTH_LEVEL_TYPE;
// File type definitions
typedef enum
{
@ -90,6 +99,10 @@ typedef struct
uint32 web_disc_par; // параметры функции вызываемой по закрытию соединения
#ifdef WEBSOCKET_ENA
WS_FRSTAT ws; // параметры websoc
#endif
#if USE_WEB_AUTH_LEVEL
uint8 auth_level; // Уровень авторизации по паролю
uint8 auth_realm; // Требуемый уровень авторизации (минимальный уровень)
#endif
uint8 fileType; // File type to return with Content-Type (if SCB_FCALBACK)
} WEB_SRV_CONN;

View file

@ -13,12 +13,10 @@
#define WEB_NAME_VERSION "PVs/0.2"
// #define WEBSOCKET_ENA 1
// lifetime (sec) of static responses as string 60*60*24*14=1209600"
#define FILE_CACHE_MAX_AGE_SEC 3600 // время для кеша файлов, ставить 0 пока тест!
#define MAX_HTTP_HEAD_BUF 3070 // максимальный размер HTTP запроса (GET)
#define MAX_HTTP_HEAD_BUF TCP_SRV_SERVER_MAX_RXBUF // максимальный размер HTTP запроса (GET)
#define RESCHKS_SEND_SIZE 16
#define RESCHKE_SEND_SIZE 8
@ -45,5 +43,6 @@ bool web_inc_fclose(WEB_SRV_CONN *web_conn);
bool web_trim_bufi(TCP_SERV_CONN *ts_conn, uint8 *pdata, uint32 data_len);
bool web_feee_bufi(TCP_SERV_CONN *ts_conn);
//uint8 * head_find_ctr(HTTP_CONN *CurHTTP, const uint8 * c, int clen, int dlen);
uint8 UserAuthorization(uint8 *pbuf, size_t declen);
#endif /* _INCLUDE_WEB_SRV_INT_H_ */

View file

@ -34,7 +34,7 @@
//==== Interface 0 - wlan0 = AP ===========
#define DEF_AP_SSID "RTL871X"
#define DEF_AP_PASSWORD "0123456789"
#define DEF_AP_SECURITY RTW_SECURITY_WPA2_AES_PSK // RTW_SECURITY_OPEN, RTW_SECURITY_WEP_PSK
#define DEF_AP_SECURITY RTW_SECURITY_WPA2_AES_PSK // or RTW_SECURITY_OPEN
#define DEF_AP_BEACON 100 // 100...6000 ms
#define DEF_AP_CHANNEL 1 // 1..14
#define DEF_AP_CHANNEL 1 // 1..14

View file

@ -31,13 +31,14 @@ LOCAL void fATPN(int argc, char *argv[]){
}
else {
strncpy(wifi_st_cfg.ssid, argv[1], NDIS_802_11_LENGTH_SSID);
int pswlen;
if(argc > 2) {
pswlen = strlen(wifi_st_cfg.password);
strncpy(wifi_st_cfg.password, argv[2], NDIS_802_11_LENGTH_SSID);
int i = strlen(wifi_st_cfg.password);
if(i > 7) {
if(pswlen > 7) {
wifi_st_cfg.security_type = RTW_SECURITY_WPA2_AES_PSK;
}
else if(!i) {
else if(!pswlen) {
wifi_st_cfg.security_type = RTW_SECURITY_OPEN;
}
else {
@ -46,18 +47,25 @@ LOCAL void fATPN(int argc, char *argv[]){
}
}
else {
// default
wifi_st_cfg.password[0] = 0;
wifi_st_cfg.security_type = RTW_SECURITY_OPEN;
}
if(argc > 3) {
wifi_ap_cfg.security_type = translate_rtw_security(atoi(argv[3]));
if(pswlen > 7) {
wifi_st_cfg.security_type = translate_val_to_rtw_security(atoi(argv[3]));
}
else {
printf("password len < 8!\n");
wifi_st_cfg.security_type = RTW_SECURITY_OPEN;
}
}
if(argc > 4) {
wifi_st_cfg.autoreconnect = atoi(argv[3]);
wifi_st_cfg.autoreconnect = atoi(argv[4]);
}
else wifi_st_cfg.autoreconnect = 0;
if(argc > 5) {
wifi_st_cfg.reconnect_pause = atoi(argv[3]);
wifi_st_cfg.reconnect_pause = atoi(argv[5]);
}
else wifi_st_cfg.reconnect_pause = 5;
show_wifi_st_cfg();
@ -93,8 +101,7 @@ LOCAL void fATPA(int argc, char *argv[]){
wifi_ap_cfg.security_type = RTW_SECURITY_OPEN;
}
if(argc > 3) {
if(argv[3][0]=='0') wifi_st_cfg.security_type = RTW_SECURITY_OPEN;
else wifi_st_cfg.security_type = RTW_SECURITY_WEP_PSK;
wifi_ap_cfg.security_type = (argv[3][0] == '0')? RTW_SECURITY_OPEN : RTW_SECURITY_WPA2_AES_PSK;
}
if(argc > 4) {
wifi_ap_cfg.channel = atoi(argv[4]);

View file

@ -11,12 +11,20 @@
#include "task.h"
#include "diag.h"
#include "netbios/netbios.h"
#include "sntp/sntp.h"
#include "user/sys_cfg.h"
#include "web/web_srv.h"
#include "webfs/webfs.h"
struct SystemCfg syscfg = {
.cfg.w = SYS_CFG_DEBUG_ENA | SYS_CFG_NETBIOS_ENA,
.cfg.w = SYS_CFG_DEBUG_ENA
#if defined(USE_NETBIOS) && USE_NETBIOS
| SYS_CFG_NETBIOS_ENA
#endif
#if defined(USE_SNTP) && USE_SNTP
| SYS_CFG_SNTP_ENA
#endif
,
#if defined(USE_WEB)
.web_port = USE_WEB,
#else
@ -63,9 +71,12 @@ void user_init_thrd(void) {
/* Load cfg, init WiFi + LwIP init, WiFi start if wifi_cfg.mode != RTW_MODE_NONE */
wifi_init();
#if defined(USE_NETBIOS)
if(syscfg.cfg.b.netbios_ena) netbios_init();
#endif
#if defined(USE_SNTP)
if(syscfg.cfg.b.sntp_ena) sntp_init();
#endif
// webstuff_init(); // httpd_init();
webserver_init(syscfg.web_port);

View file

@ -0,0 +1,48 @@
/*
* web_auth.c
*
* Created on: 23/04/2017.
* Author: pvvx
*/
#include "autoconf.h"
#include "FreeRTOS.h"
#include "diag.h"
#include "web_utils.h"
#include "wifi_api.h"
#include "web_srv.h"
#include "rtl8195a/rtl_libc.h"
#include "esp_comp.h"
/* ----------------------------------------------------------------------------------
* pbuf[77] = Username and password are combined into a string "username:password"
* Return: Authorization Level
* 0 - Not Authorized */
uint8 UserAuthorization(uint8 *pbuf, size_t declen)
{
uint8 * psw = rtl_strchr(pbuf, ':');
if(psw != NULL) {
#if USE_WEB_AUTH_LEVEL
if(rtl_strcmp(pbuf, "rtl871x:webfs_write") == 0) {
return WEB_AUTH_LEVEL_WEBFS;
}
if(rtl_strcmp(pbuf, "rtl871x:ota_write") == 0) {
return WEB_AUTH_LEVEL_OTA;
}
if(rtl_strcmp(pbuf, "rtl871x:supervisor") == 0) {
return WEB_AUTH_LEVEL_SUPERVISOR;
}
#endif
*psw++ = 0;
if(rom_xstrcmp(wifi_ap_cfg.ssid, pbuf)
&& rom_xstrcmp( wifi_ap_cfg.password, psw)) {
return WEB_AUTH_LEVEL_USER;
}
if(rom_xstrcmp(wifi_st_cfg.ssid, pbuf)
&& rom_xstrcmp( wifi_st_cfg.password, psw)) {
return WEB_AUTH_LEVEL_USER1;
}
}
return 0;
}

View file

@ -24,11 +24,11 @@
#include "esp_comp.h"
#ifdef USE_NETBIOS
#include "netbios.h"
#include "netbios/netbios.h"
#endif
#ifdef USE_SNTP
#include "sntp.h"
#include "sntp/sntp.h"
#endif
#ifdef USE_CAPTDNS
@ -534,13 +534,13 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr)
else ifcmp("auth") tcp_put((wifi_ap_cfg.security_type == RTW_SECURITY_OPEN) ? '0' : '1');
else ifcmp("hssid") tcp_put((wifi_ap_cfg.ssid_hidden & 1) + '0');
else ifcmp("bint") tcp_puts("%u", wifi_ap_cfg.beacon_interval);
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[wlan_ap_netifn].hwaddr));
else ifcmp("hostname") tcp_strcpy(lwip_host_name[wlan_ap_netifn]);
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[WLAN_AP_NETIF_NUM].hwaddr));
else ifcmp("hostname") tcp_strcpy(lwip_host_name[WLAN_AP_NETIF_NUM]);
else ifcmp("dhcp") tcp_puts("%u", wifi_ap_dhcp.mode);
else ifcmp("ip") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.ip));
else ifcmp("gw") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.gw));
else ifcmp("msk") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.mask));
else ifcmp("cip") tcp_puts(IPSTR, IP2STR(&xnetif[wlan_st_netifn].ip_addr.addr));
else ifcmp("cip") tcp_puts(IPSTR, IP2STR(&xnetif[WLAN_ST_NETIF_NUM].ip_addr.addr));
// else ifcmp("mac") strtomac(pvar, wifi_ap_cfg.macaddr);
// else ifcmp("sip") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.start_ip));
@ -574,13 +574,13 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr)
os_memcpy((char *)&web_conn->msgbuf[web_conn->msgbuflen], wifi_st_cfg.password, len);
web_conn->msgbuflen += len;
}
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[wlan_st_netifn].hwaddr));
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[WLAN_ST_NETIF_NUM].hwaddr));
else ifcmp("bssid") tcp_puts(MACSTR, MAC2STR(wifi_st_cfg.bssid));
else ifcmp("sbss") tcp_puts("%u", wifi_st_cfg.flg);
#if LWIP_NETIF_HOSTNAME
else ifcmp("hostname") tcp_strcpy(lwip_host_name[wlan_st_netifn]);
else ifcmp("hostname") tcp_strcpy(lwip_host_name[WLAN_ST_NETIF_NUM]);
#endif
else ifcmp("auth") tcp_puts("%u", wifi_st_cfg.security_type);
else ifcmp("auth") tcp_puts("%u", translate_rtw_security_to_val(wifi_st_cfg.security_type));
else ifcmp("dhcp") tcp_puts("%u", wifi_st_dhcp.mode);
else ifcmp("ip") tcp_puts(IPSTR, IP2STR(&wifi_st_dhcp.ip));
else ifcmp("gw") tcp_puts(IPSTR, IP2STR(&wifi_st_dhcp.gw));
@ -673,7 +673,7 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr)
#ifdef USE_SNTP
else ifcmp("sntp_") {
cstr += 5;
ifcmp("time") tcp_puts("%u", get_sntp_time());
ifcmp("time") tcp_puts("%u", sntp_gen_system_time(0)); // get_sntp_time
else tcp_put('?');
}
#endif

View file

@ -25,11 +25,11 @@
#include "esp_comp.h"
#ifdef USE_NETBIOS
#include "netbios.h"
#include "netbios/netbios.h"
#endif
#ifdef USE_SNTP
#include "sntp.h"
#include "sntp/sntp.h"
#endif
#ifdef USE_LWIP_PING
@ -133,7 +133,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *
else os_printf(" - none!\n");
#endif
}
else ifcmp("pinclr") syscfg.cfg.b.pin_clear_cfg_enable = (val)? 1 : 0;
else ifcmp("pinclr") syscfg.cfg.b.pin_clear_cfg_enable = (val)? 1 : 0;
else ifcmp("debug") {
syscfg.cfg.b.debug_print_enable = val;
print_off = (!val) & 1; // rtl_print on/off
@ -152,8 +152,8 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *
#ifdef USE_SNTP
else ifcmp("sntp") {
syscfg.cfg.b.sntp_ena = (val)? 1 : 0;
if(syscfg.cfg.b.sntp_ena) sntp_inits();
else sntp_close();
if(syscfg.cfg.b.sntp_ena) sntp_init();
else sntp_stop();
}
#endif
#ifdef USE_CAPTDNS
@ -198,7 +198,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *
else os_memset(wifi_ap_cfg.ssid, 0, sizeof(wifi_ap_cfg.ssid));
os_memcpy(wifi_ap_cfg.ssid, pvar, len);
#ifdef USE_NETBIOS
netbios_set_name(wifi_ap_cfg.ssid);
// netbios_set_name(wlan_ap_netifn, wifi_ap_cfg.ssid);
#endif
}
}
@ -212,7 +212,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *
}
else ifcmp("chl") wifi_ap_cfg.channel = val;
else ifcmp("mcns") wifi_ap_cfg.max_sta = val;
else ifcmp("auth") wifi_ap_cfg.security_type = (val)? RTW_SECURITY_WEP_PSK : RTW_SECURITY_OPEN;
else ifcmp("auth") wifi_ap_cfg.security_type = (val != 0);
else ifcmp("hssid") wifi_ap_cfg.ssid_hidden = val;
else ifcmp("bint") wifi_ap_cfg.beacon_interval = val;
#if LWIP_NETIF_HOSTNAME
@ -259,7 +259,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *
else os_memset(wifi_st_cfg.password, 0, sizeof(wifi_st_cfg.password));
os_memcpy(wifi_st_cfg.password, pvar, len);
}
else ifcmp("auth") wifi_st_cfg.security_type = val;
else ifcmp("auth") wifi_st_cfg.security_type = translate_val_to_rtw_security(val);
else ifcmp("bssid") strtomac(pvar, wifi_st_cfg.bssid);
else ifcmp("sbss") wifi_st_cfg.flg = val;
#if LWIP_NETIF_HOSTNAME

View file

@ -124,7 +124,7 @@ const char HTTPresponse_200_head[] ICACHE_RODATA_ATTR = "OK";
const char HTTPresponse_302_head[] ICACHE_RODATA_ATTR = "Found";
const char HTTPresponse_304_head[] ICACHE_RODATA_ATTR = "Not Modified";
const char HTTPresponse_400_head[] ICACHE_RODATA_ATTR = "Bad Request";
const char HTTPresponse_401_head[] ICACHE_RODATA_ATTR = "Unauthorized\r\nWWW-Authenticate: Basic realm=\"Protected\"";
const char HTTPresponse_401_head[] ICACHE_RODATA_ATTR = "Unauthorized\r\nWWW-Authenticate: Basic realm=\"Protected%u\"";
const char HTTPresponse_404_head[] ICACHE_RODATA_ATTR = "Not found";
const char HTTPresponse_411_head[] ICACHE_RODATA_ATTR = "Length Required";
const char HTTPresponse_413_head[] ICACHE_RODATA_ATTR = "Request Entity Too Large";
@ -304,7 +304,7 @@ LOCAL WEB_SRV_CONN * ICACHE_FLASH_ATTR ReNew_web_conn(TCP_SERV_CONN *ts_conn)
// /ssl/crypto/ssl_crypto_misc.c:
// EXP_FUNC int STDCALL base64_decode(const uint8 *in, int len, uint8_t *out, int *outlen);
// Username and password are combined into a string "username:password"
LOCAL bool ICACHE_FLASH_ATTR CheckAuthorization(uint8* base64str)
LOCAL uint8 ICACHE_FLASH_ATTR CheckAuthorization(uint8* base64str)
{
uint8 *pcmp = base64str;
int len = 0;
@ -315,23 +315,41 @@ LOCAL bool ICACHE_FLASH_ATTR CheckAuthorization(uint8* base64str)
if((len >= 4)&&(len <= 128)
&&(base64decode(base64str, len, pbuf, &declen))) {
pbuf[declen]='\0';
uint8 ppsw[32+64+1];
cmpcpystr(ppsw, wifi_ap_cfg.ssid, '\0','\0', 32);
len = rtl_strlen((char*)ppsw);
ppsw[len++] = ':';
cmpcpystr(&ppsw[len], wifi_ap_cfg.password, '\0','\0', 64);
#if DEBUGSOO > 1
os_printf("'%s' ", pbuf);
#endif
#if DEBUGSOO > 2
os_printf("<%s>[%u] ", ppsw, declen);
#endif
if(os_strncmp(pbuf, (char *)ppsw , declen) == 0) return true;
return UserAuthorization(pbuf, declen);
};
return false;
return 0;
}
//=============================================================================
#define web_parse_cookie(CurHTTP, ts_conn) web_parse_vars(ts_conn, (CurHTTP)->pcookie, (CurHTTP)->cookie_len, '\0', ';')
#define web_parse_uri_vars(CurHTTP, ts_conn) web_parse_vars(ts_conn, (CurHTTP)->puri, (CurHTTP)->uri_len, '?', '&')
#define web_parse_content(CurHTTP, ts_conn) web_parse_vars(ts_conn, (CurHTTP)->pcontent, (CurHTTP)->content_len, '\0', '&')
LOCAL void ICACHE_FLASH_ATTR web_parse_vars(TCP_SERV_CONN *ts_conn, uint8 *vars, uint32 vars_len, uint8 start_char, uint8 end_char)
{
if(vars == NULL || vars_len == 0) return;
uint8 *pcmp;
if(start_char) {
pcmp = cmpcpystr(NULL, vars, '\0', start_char, vars_len); // find start_char if available
start_char = '\0';
} else pcmp = vars - 1;
while(pcmp != NULL) {
uint16 len = vars_len - (pcmp - vars);
uint8 *pcmd = pcmp;
pcmp = cmpcpystr(pcmp, pcmp + 1, start_char, '=', len); // skip spaces before variable name
if(pcmp == NULL) break;
urldecode(pcmd, pcmd, len, len);
len = vars_len - (pcmp - vars);
uint8 *pvar = pcmp;
pcmp = cmpcpystr(pcmp, pcmp + 1, '\0', end_char, len);
if(pcmd[0] != '\0') {
urldecode(pvar, pvar, len, len);
web_int_vars(ts_conn, pcmd, pvar);
}
}
}
/*
//=============================================================================
LOCAL void ICACHE_FLASH_ATTR
web_parse_cookie(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
@ -394,6 +412,7 @@ web_parse_content(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
}
} while(pcmp != NULL);
}
*/
//=============================================================================
// Разбор имени файла и перевод в вид относительного URI.
// (выкидывание HTTP://Host)
@ -411,7 +430,7 @@ web_parse_fname(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
uint8 cbuf[FileNameSize+16];
uint8 *pcbuf = cbuf;
urldecode(pcbuf, CurHTTP->puri, sizeof(cbuf) - 1, CurHTTP->uri_len);
if((os_strncmp((char *)pcbuf, "HTTP://", 7) == 0)||(os_strncmp((char *)pcbuf, "http://", 7) == 0)) {
if(rom_xstrcmp((char *)pcbuf, "HTTP://")||(rom_xstrcmp((char *)pcbuf, "http://"))) {
pcbuf += 7;
uint8 *pcmp = os_strchr((char *)pcbuf, '/');
if(pcmp != NULL) pcbuf = pcmp;
@ -422,6 +441,9 @@ web_parse_fname(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
uint8 *pcmp = web_strnstr(CurHTTP->pFilename, ProtectedFilesName, os_strlen(CurHTTP->pFilename));
if(pcmp != NULL) {
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
#if USE_WEB_AUTH_LEVEL
web_conn->auth_realm = WEB_AUTH_LEVEL_USER;
#endif
SetSCB(SCB_AUTH);
}
};
@ -598,7 +620,17 @@ parse_header(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
if(os_strncmp(pstr, "Basic", 5) == 0) { // The authorization method and a space i.e. "Basic" is then put before the encoded string.
pstr += 5;
while(*pstr == ' ') pstr++;
if(CheckAuthorization(pstr)) ClrSCB(SCB_AUTH);
#if USE_WEB_AUTH_LEVEL
web_conn->auth_level = CheckAuthorization(pstr);
#if DEBUGSOO > 1
os_printf("%u?%u ", web_conn->auth_level, web_conn->auth_realm);
#endif
if(web_conn->auth_level >= web_conn->auth_realm)
ClrSCB(SCB_AUTH);
#else
if(CheckAuthorization(pstr))
ClrSCB(SCB_AUTH);
#endif
else {
CurHTTP->httpStatus = 401; // 401 Unauthorized
return false;
@ -821,6 +853,9 @@ LOCAL bool ICACHE_FLASH_ATTR webserver_open_file(HTTP_CONN *CurHTTP, TCP_SERV_CO
return true;
}
else if(rom_xstrcmp(pstr, fsupload_fname)) {
#if USE_WEB_AUTH_LEVEL
web_conn->auth_realm = WEB_AUTH_LEVEL_WEBFS;
#endif
SetSCB(SCB_AUTH);
web_inc_fp(web_conn, WEBFS_UPLOAD_HANDLE);
web_conn->content_len = sizeHTTPfsupload;
@ -1075,7 +1110,8 @@ web_print_headers(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn)
CurResp++;
};
tcp_puts_fd("HTTP/1.1 %u ", CurResp->status);
tcp_strcpy(CurResp->headers);
if(CurResp->status == 401) tcp_puts_fd(CurResp->headers, web_conn->auth_realm);
else tcp_strcpy(CurResp->headers);
tcp_strcpy_fd("\r\nServer: " WEB_NAME_VERSION "\r\nConnection: close\r\n");
if(CheckSCB(SCB_REDIR)) {
tcp_puts_fd("Location: %s\r\n\r\n", CurHTTP->pFilename);
@ -1990,7 +2026,7 @@ err_t ICACHE_FLASH_ATTR webserver_init(uint16 portn)
if (p != NULL) {
// изменим конфиг на наше усмотрение:
if(syscfg.cfg.b.web_time_wait_delete) p->flag.pcb_time_wait_free = 1; // пусть убивает, для теста и проксей
p->max_conn = 256; // сработает по heap_size
p->max_conn = 99; // сработает по heap_size
#if DEBUGSOO > 3
os_printf("Max connection %d, time waits %d & %d, min heap size %d\n",
p->max_conn, p->time_wait_rec, p->time_wait_cls, p->min_heap);

View file

@ -46,10 +46,7 @@ int ICACHE_RAM_ATTR rom_xstrcpy(char * pd, const char * ps)
}
#else
int len = 0;
while(*ps) {
*pd++ = *ps++;
len++;
}
while((*pd++ = *ps++) != 0) len++;
return len;
#endif
}

View file

@ -113,6 +113,7 @@ SRC_C += sdk/component/common/api/wifi/wifi_promisc.c
SRC_C += sdk/component/common/api/wifi/wifi_simple_config.c
SRC_C += sdk/component/common/api/wifi/wifi_util.c
SRC_C += sdk/component/common/api/lwip_netconf.c
SRC_C += sdk/component/common/api/wifi_api.c
#network - app
#SRC_C += sdk/component/common/utilities/ssl_client.c
@ -121,8 +122,8 @@ SRC_C += sdk/component/common/api/lwip_netconf.c
#SRC_C += sdk/component/common/utilities/uart_ymodem.c
#SRC_C += sdk/component/common/utilities/update.c
#SRC_C += sdk/component/common/application/uart_adapter/uart_adapter.c
SRC_C += sdk/component/common/api/network/src/wlan_network.c
SRC_C += sdk/component/common/api/wifi_interactive_mode.c
#SRC_C += sdk/component/common/api/network/src/wlan_network.c
#SRC_C += sdk/component/common/api/wifi_interactive_mode.c
#SRC_C += sdk/component/common/api/network/src/ping_test.c
#network - lwip
@ -397,7 +398,6 @@ ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio
#ADD_SRC_C += sdk/component/common/drivers/sdio/realtek/sdio_host/src/sdio_host.c
#ADD_SRC_C += sdk/component/soc/realtek/8195a/fwlib/src/hal_sdio_host.c
#ADD_SRC_C += sdk/component/common/file_system/fatfs/disk_if/src/sdcard.c
ADD_SRC_C += sdk/component/common/api/wifi_api.c
#=============================================
# PROGECT
#=============================================
@ -419,6 +419,7 @@ ADD_SRC_C += project/src/web/web_websocket.c
ADD_SRC_C += project/src/web/websock.c
ADD_SRC_C += project/src/web/web_int_callbacks.c
ADD_SRC_C += project/src/web/web_int_vars.c
ADD_SRC_C += project/src/web/web_auth.c
#CFLAGS += -DDEFAULT_BAUDRATE=1562500
#if CONFIG_ENABLE_P2P and ...: