|
|
@@ -433,7 +433,14 @@ void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const m
|
|
|
memcpy(×tamp, data, 4);
|
|
|
|
|
|
data[len] = 0; // ensure null terminator
|
|
|
- uint8_t reply_len = handleLoginReq(sender, secret, timestamp, &data[4]);
|
|
|
+ uint8_t reply_len;
|
|
|
+ if (data[0] == 0 || data[0] >= ' ') { // is password, ie. a login request
|
|
|
+ reply_len = handleLoginReq(sender, secret, timestamp, &data[4]);
|
|
|
+ //} else if (data[0] == ANON_REQ_TYPE_*) { // future type codes
|
|
|
+ // TODO
|
|
|
+ } else {
|
|
|
+ reply_len = 0; // unknown request type
|
|
|
+ }
|
|
|
|
|
|
if (reply_len == 0) return; // invalid request
|
|
|
|
|
|
@@ -616,8 +623,7 @@ bool MyMesh::onPeerPathRecv(mesh::Packet *packet, int sender_idx, const uint8_t
|
|
|
|
|
|
void MyMesh::onControlDataRecv(mesh::Packet* packet) {
|
|
|
uint8_t type = packet->payload[0] & 0xF0; // just test upper 4 bits
|
|
|
- if (type == CTL_TYPE_NODE_DISCOVER_REQ && packet->payload_len >= 6) {
|
|
|
- // TODO: apply rate limiting to these!
|
|
|
+ if (type == CTL_TYPE_NODE_DISCOVER_REQ && packet->payload_len >= 6 && discover_limiter.allow(rtc_clock.getCurrentTime())) {
|
|
|
int i = 1;
|
|
|
uint8_t filter = packet->payload[i++];
|
|
|
uint32_t tag;
|
|
|
@@ -646,7 +652,8 @@ void MyMesh::onControlDataRecv(mesh::Packet* packet) {
|
|
|
MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondClock &ms, mesh::RNG &rng,
|
|
|
mesh::RTCClock &rtc, mesh::MeshTables &tables)
|
|
|
: mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables),
|
|
|
- _cli(board, rtc, sensors, &_prefs, this), telemetry(MAX_PACKET_PAYLOAD - 4), region_map(key_store), temp_map(key_store)
|
|
|
+ _cli(board, rtc, sensors, &_prefs, this), telemetry(MAX_PACKET_PAYLOAD - 4), region_map(key_store), temp_map(key_store),
|
|
|
+ discover_limiter(4, 120) // max 4 every 2 minutes
|
|
|
#if defined(WITH_RS232_BRIDGE)
|
|
|
, bridge(&_prefs, WITH_RS232_BRIDGE, _mgr, &rtc)
|
|
|
#endif
|