mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
Merge branch 'ripplebiz:main' into t1000e_ui
This commit is contained in:
commit
c62f09d92e
9 changed files with 264 additions and 111 deletions
|
|
@ -203,9 +203,9 @@ void BaseChatMesh::onAckRecv(mesh::Packet* packet, uint32_t ack_crc) {
|
|||
#ifdef MAX_GROUP_CHANNELS
|
||||
int BaseChatMesh::searchChannelsByHash(const uint8_t* hash, mesh::GroupChannel dest[], int max_matches) {
|
||||
int n = 0;
|
||||
for (int i = 0; i < num_channels && n < max_matches; i++) {
|
||||
if (channels[i].hash[0] == hash[0]) {
|
||||
dest[n++] = channels[i];
|
||||
for (int i = 0; i < MAX_GROUP_CHANNELS && n < max_matches; i++) {
|
||||
if (channels[i].channel.hash[0] == hash[0]) {
|
||||
dest[n++] = channels[i].channel;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
|
|
@ -588,24 +588,61 @@ bool BaseChatMesh::removeContact(ContactInfo& contact) {
|
|||
#ifdef MAX_GROUP_CHANNELS
|
||||
#include <base64.hpp>
|
||||
|
||||
mesh::GroupChannel* BaseChatMesh::addChannel(const char* psk_base64) {
|
||||
ChannelDetails* BaseChatMesh::addChannel(const char* name, const char* psk_base64) {
|
||||
if (num_channels < MAX_GROUP_CHANNELS) {
|
||||
auto dest = &channels[num_channels];
|
||||
|
||||
memset(dest->secret, 0, sizeof(dest->secret));
|
||||
int len = decode_base64((unsigned char *) psk_base64, strlen(psk_base64), dest->secret);
|
||||
memset(dest->channel.secret, 0, sizeof(dest->channel.secret));
|
||||
int len = decode_base64((unsigned char *) psk_base64, strlen(psk_base64), dest->channel.secret);
|
||||
if (len == 32 || len == 16) {
|
||||
mesh::Utils::sha256(dest->hash, sizeof(dest->hash), dest->secret, len);
|
||||
mesh::Utils::sha256(dest->channel.hash, sizeof(dest->channel.hash), dest->channel.secret, len);
|
||||
StrHelper::strncpy(dest->name, name, sizeof(dest->name));
|
||||
num_channels++;
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
bool BaseChatMesh::getChannel(int idx, ChannelDetails& dest) {
|
||||
if (idx >= 0 && idx < MAX_GROUP_CHANNELS) {
|
||||
dest = channels[idx];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool BaseChatMesh::setChannel(int idx, const ChannelDetails& src) {
|
||||
static uint8_t zeroes[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
|
||||
|
||||
if (idx >= 0 && idx < MAX_GROUP_CHANNELS) {
|
||||
channels[idx] = src;
|
||||
if (memcmp(&src.channel.secret[16], zeroes, 16) == 0) {
|
||||
mesh::Utils::sha256(channels[idx].channel.hash, sizeof(channels[idx].channel.hash), src.channel.secret, 16); // 128-bit key
|
||||
} else {
|
||||
mesh::Utils::sha256(channels[idx].channel.hash, sizeof(channels[idx].channel.hash), src.channel.secret, 32); // 256-bit key
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int BaseChatMesh::findChannelIdx(const mesh::GroupChannel& ch) {
|
||||
for (int i = 0; i < MAX_GROUP_CHANNELS; i++) {
|
||||
if (memcmp(ch.secret, channels[i].channel.secret, sizeof(ch.secret)) == 0) return i;
|
||||
}
|
||||
return -1; // not found
|
||||
}
|
||||
#else
|
||||
mesh::GroupChannel* BaseChatMesh::addChannel(const char* psk_base64) {
|
||||
ChannelDetails* BaseChatMesh::addChannel(const char* name, const char* psk_base64) {
|
||||
return NULL; // not supported
|
||||
}
|
||||
bool BaseChatMesh::getChannel(int idx, ChannelDetails& dest) {
|
||||
return false;
|
||||
}
|
||||
bool BaseChatMesh::setChannel(int idx, const ChannelDetails& src) {
|
||||
return false;
|
||||
}
|
||||
int BaseChatMesh::findChannelIdx(const mesh::GroupChannel& ch) {
|
||||
return -1; // not found
|
||||
}
|
||||
#endif
|
||||
|
||||
ContactsIterator BaseChatMesh::startContactsIterator() {
|
||||
|
|
|
|||
|
|
@ -61,6 +61,11 @@ struct ConnectionInfo {
|
|||
uint32_t expected_ack;
|
||||
};
|
||||
|
||||
struct ChannelDetails {
|
||||
mesh::GroupChannel channel;
|
||||
char name[32];
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief abstract Mesh class for common 'chat' client
|
||||
*/
|
||||
|
|
@ -74,8 +79,8 @@ class BaseChatMesh : public mesh::Mesh {
|
|||
int matching_peer_indexes[MAX_SEARCH_RESULTS];
|
||||
unsigned long txt_send_timeout;
|
||||
#ifdef MAX_GROUP_CHANNELS
|
||||
mesh::GroupChannel channels[MAX_GROUP_CHANNELS];
|
||||
int num_channels;
|
||||
ChannelDetails channels[MAX_GROUP_CHANNELS];
|
||||
int num_channels; // only for addChannel()
|
||||
#endif
|
||||
mesh::Packet* _pendingLoopback;
|
||||
uint8_t temp_buf[MAX_TRANS_UNIT];
|
||||
|
|
@ -89,6 +94,7 @@ protected:
|
|||
{
|
||||
num_contacts = 0;
|
||||
#ifdef MAX_GROUP_CHANNELS
|
||||
memset(channels, 0, sizeof(channels));
|
||||
num_channels = 0;
|
||||
#endif
|
||||
txt_send_timeout = 0;
|
||||
|
|
@ -151,7 +157,10 @@ public:
|
|||
bool addContact(const ContactInfo& contact);
|
||||
int getNumContacts() const { return num_contacts; }
|
||||
ContactsIterator startContactsIterator();
|
||||
mesh::GroupChannel* addChannel(const char* psk_base64);
|
||||
ChannelDetails* addChannel(const char* name, const char* psk_base64);
|
||||
bool getChannel(int idx, ChannelDetails& dest);
|
||||
bool setChannel(int idx, const ChannelDetails& src);
|
||||
int findChannelIdx(const mesh::GroupChannel& ch);
|
||||
|
||||
void loop();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ void CommonCLI::loadPrefs(FILESYSTEM* fs) {
|
|||
file.read((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
|
||||
file.read((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
|
||||
file.read(pad, 4); // 120
|
||||
file.read((uint8_t *) &_prefs->flood_max, sizeof(_prefs->flood_max)); // 124
|
||||
|
||||
// sanitise bad pref values
|
||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||
|
|
@ -91,6 +92,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
|||
file.write((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
|
||||
file.write((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
|
||||
file.write(pad, 4); // 120
|
||||
file.write((uint8_t *) &_prefs->flood_max, sizeof(_prefs->flood_max)); // 124
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
|
@ -176,6 +178,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->rx_delay_base));
|
||||
} else if (memcmp(config, "txdelay", 7) == 0) {
|
||||
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->tx_delay_factor));
|
||||
} else if (memcmp(config, "flood.max", 9) == 0) {
|
||||
sprintf(reply, "> %d", (uint32_t)_prefs->flood_max);
|
||||
} else if (memcmp(config, "direct.txdelay", 14) == 0) {
|
||||
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->direct_tx_delay_factor));
|
||||
} else if (memcmp(config, "tx", 2) == 0 && (config[2] == 0 || config[2] == ' ')) {
|
||||
|
|
@ -262,6 +266,15 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||
} else {
|
||||
strcpy(reply, "Error, cannot be negative");
|
||||
}
|
||||
} else if (memcmp(config, "flood.max ", 10) == 0) {
|
||||
uint8_t m = atoi(&config[10]);
|
||||
if (m <= 64) {
|
||||
_prefs->flood_max = m;
|
||||
savePrefs();
|
||||
strcpy(reply, "OK");
|
||||
} else {
|
||||
strcpy(reply, "Error, max 64");
|
||||
}
|
||||
} else if (memcmp(config, "direct.txdelay ", 15) == 0) {
|
||||
float f = atof(&config[15]);
|
||||
if (f >= 0) {
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ struct NodePrefs { // persisted to file
|
|||
uint8_t reserved1;
|
||||
uint8_t reserved2;
|
||||
float bw;
|
||||
uint8_t flood_max;
|
||||
};
|
||||
|
||||
class CommonCLICallbacks {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue