forked from iarv/lobbs
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
907f22b22c | ||
|
|
219dc25925 | ||
|
|
6e99739bef | ||
|
|
8e288d9b0d | ||
|
|
f30f83e607 | ||
|
|
a8a5727bd1 | ||
|
|
763d976fd0 | ||
|
|
64f2913c16 | ||
|
|
ad85958853 | ||
|
|
3963e53dfe | ||
|
|
6c6d653c04 | ||
|
|
dcbf96bcc7 | ||
|
|
4645c80cec | ||
|
|
5f27602379 | ||
|
|
416ce3ce71 | ||
|
|
189aeba41c | ||
|
|
a6ba122df2 | ||
|
|
ab0ef08768 | ||
|
|
2edab47a31 | ||
|
|
63617076d3 |
63
CHANGELOG.md
Normal file
63
CHANGELOG.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to LoBBS will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [1.2.1] - 2025-12-09
|
||||
|
||||
### Patch
|
||||
- Updated module registration from `#pragma MPM_MODULE` to `MPM_REGISTER_MESHTASTIC_MODULE` comment directive
|
||||
- Renamed module variable from `lobbsPlugin` to `lobbsModule` for consistency
|
||||
|
||||
## [1.2.0] - 2025-12-09
|
||||
|
||||
### Minor
|
||||
- Logo assets with logo.pxd and logo.webp files
|
||||
- Admin user functionality - first registered user automatically becomes administrator
|
||||
|
||||
### Patch
|
||||
- Walkthrough video link in README
|
||||
- Updated README with improved documentation, license information, and links
|
||||
- Replaced manual memory management with LoDb::freeRecords() in LoBBSModule
|
||||
- Added extern declaration for lobbsPlugin and updated MPM module pragma
|
||||
|
||||
## [1.1.1] - 2025-12-05
|
||||
|
||||
### Patch
|
||||
- Refactored header structure: removed LoBBS and meta headers, updated include paths, introduced new plugin header
|
||||
|
||||
## [1.1.0] - 2025-12-05
|
||||
|
||||
### Minor
|
||||
- MPM plugin compatibility
|
||||
|
||||
### Patch
|
||||
- Direct messages now properly filter out broadcasts
|
||||
|
||||
## [1.0.1] - 2025-12-05
|
||||
|
||||
### Patch
|
||||
- Enhanced installation documentation with Mesh Forge method
|
||||
- Updated installation instructions for MPM integration
|
||||
|
||||
## [1.0.0] - 2025-11-28
|
||||
|
||||
### Major
|
||||
- Initial release of LoBBS (LoDB Bulletin Board System)
|
||||
- User registration and authentication
|
||||
- Bulletin board messaging system
|
||||
- Direct messaging between users
|
||||
- Session management
|
||||
- User directory and search functionality
|
||||
|
||||
[Unreleased]: https://github.com/MeshEnvy/lobbs/compare/v1.2.1...HEAD
|
||||
[1.2.1]: https://github.com/MeshEnvy/lobbs/compare/v1.2.0...v1.2.1
|
||||
[1.2.0]: https://github.com/MeshEnvy/lobbs/compare/v1.1.1...v1.2.0
|
||||
[1.1.1]: https://github.com/MeshEnvy/lobbs/compare/v1.1.0...v1.1.1
|
||||
[1.1.0]: https://github.com/MeshEnvy/lobbs/compare/v1.0.1...v1.1.0
|
||||
[1.0.1]: https://github.com/MeshEnvy/lobbs/compare/v1.0.0...v1.0.1
|
||||
[1.0.0]: https://github.com/MeshEnvy/lobbs/compare/c911244...v1.0.0
|
||||
34
README.md
34
README.md
@@ -1,7 +1,17 @@
|
||||
# LoBBS - Meshtastic BBS on the Firmware
|
||||
# LoBBS - Firmware-based BBS for Meshtastic
|
||||
|
||||
**A Meshtastic firmware plugin providing a full bulletin board system**
|
||||
|
||||
------
|
||||
|
||||
### Watch the Walkthrough
|
||||
|
||||
https://www.youtube.com/watch?v=FwtDY1QBXpQ
|
||||
|
||||
[](https://www.youtube.com/watch?v=FwtDY1QBXpQ)
|
||||
|
||||
-------
|
||||
|
||||
LoBBS is a Meshtastic plugin that runs a complete bulletin board system entirely inside the Meshtastic firmware. Once installed and built into your node, you can create user accounts, exchange private mail, broadcast news posts, and remotely administer the device without any sidecar services or host computer.
|
||||
|
||||
## Features
|
||||
@@ -16,15 +26,13 @@ LoBBS is a Meshtastic plugin that runs a complete bulletin board system entirely
|
||||
|
||||
### Using Mesh Forge (easy)
|
||||
|
||||
Use our [Mesh Forge build profile](https://meshforge.org/builds/new/835766d9e1b1c56c45d00d03f9ae96f376f2cf9e4d73c18a929b9849b9e88d42) to flash a LoBBS-enabled version of Meshtastic to your device.
|
||||
Use our [Mesh Forge build profile](https://meshforge.org/builds/new/?plugin=lobbs) to flash a LoBBS-enabled version of Meshtastic to your device.
|
||||
|
||||
### Build it yourself (experimental)
|
||||
|
||||
> Warning: This requires
|
||||
LoBBS is a [Meshtastic plugin](https://meshforge.org/plugins) that is automatically discovered and integrated by the [Mesh Plugin Manager](https://pypi.org/project/mesh-plugin-manager/) (MPM). To install LoBBS:
|
||||
|
||||
LoBBS is a [Meshtastic plugin](https://registry.meshforge.org) that is automatically discovered and integrated by the [Meshtastic Plugin Manager](https://pypi.org/project/mesh-plugin-manager/) (MPM). To install LoBBS:
|
||||
|
||||
1. **Install the Meshtastic Plugin Manager:**
|
||||
1. **Install the Mesh Plugin Manager:**
|
||||
|
||||
```bash
|
||||
pip install mesh-plugin-manager
|
||||
@@ -42,7 +50,7 @@ mpm install lobbs
|
||||
|
||||
3. **Build and flash:**
|
||||
|
||||
The Meshtastic Plugin Manager automatically discovers both plugins, generates protobuf files, and integrates them into the build. Simply build and flash as usual:
|
||||
The Mesh Plugin Manager automatically discovers both plugins, generates protobuf files, and integrates them into the build. Simply build and flash as usual:
|
||||
|
||||
```bash
|
||||
pio run -e esp32 -t upload
|
||||
@@ -66,12 +74,10 @@ LoBBS replies inline with human-readable summaries. Unread content is flagged wi
|
||||
|
||||
All user, mail, and news data is persisted via LoDB in the device filesystem. Clearing the filesystem, reflashing without preserving SPIFFS/LittleFS, or performing a full factory reset will delete the BBS contents. Regular backups of the filesystem are recommended for production deployments.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- Verify your node clock is roughly correct. Timestamps in mail and news rely on the RTC and GPS time sources provided by the firmware.
|
||||
- Confirm that your node stays logged in (no `/bye` issued) if you expect to receive `@mentions`. Unauthenticated nodes receive only the login help banner.
|
||||
- If protobuf generation fails, ensure both LoBBS and LoDB plugins are properly installed in `src/plugins/` and that the Meshtastic Plugin Manager can discover them.
|
||||
|
||||
## License
|
||||
|
||||
LoBBS is distributed under the MIT license. See the accompanying `LICENSE` file within this module for full text.
|
||||
LoBBS is distributed under the MIT license. See the accompanying `LICENSE` file within this module for full text. While LoBBS is MIT, it must be combined with Meshtastic source code which is GPL. You must therefore follow all GPL guidelines regarding the combined source and binary distributions of Meshtastic. The LoBBS source code may be distributed independently under MIT.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
LoBBS and MeshForge are independent projects not endorsed by or affiliated with the Meshtastic organization.
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "LoBBSModule.h"
|
||||
|
||||
@@ -138,19 +138,23 @@ bool LoBBSDal::createUser(const char *username, const char *password, uint32_t n
|
||||
// Calculate UUID first (username with host node ID as salt)
|
||||
lodb_uuid_t userUuid = usernameToUuid(username, hostNodeId);
|
||||
|
||||
// Check if this is the first user (no existing users)
|
||||
bool isFirstUser = (db->count("users") == 0);
|
||||
|
||||
// Create user record
|
||||
meshtastic_LoBBSUser user = meshtastic_LoBBSUser_init_zero;
|
||||
strncpy(user.username, username, sizeof(user.username) - 1);
|
||||
user.uuid = userUuid;
|
||||
user.password_hash.size = 32;
|
||||
hashPassword(password, user.password_hash.bytes);
|
||||
user.is_admin = isFirstUser;
|
||||
LoDbError err = db->insert("users", userUuid, &user);
|
||||
if (err != LODB_OK) {
|
||||
LOG_ERROR("Failed to create user: %s", username);
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO("Created user: %s", username);
|
||||
LOG_INFO("Created user: %s (admin: %s)", username, isFirstUser ? "yes" : "no");
|
||||
|
||||
// Log in the user (create session)
|
||||
return loginUser(username, nodeId);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "lobbs.pb.h"
|
||||
#include "LoDB.h"
|
||||
#include "lodb/src/plugin.h"
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
|
||||
|
||||
@@ -54,9 +54,7 @@ static bool loadUserByUuid(LoBBSDal *dal, uint64_t uuid, meshtastic_LoBBSUser *o
|
||||
found = true;
|
||||
}
|
||||
|
||||
for (auto *userPtr : users) {
|
||||
delete[] (uint8_t *)userPtr;
|
||||
}
|
||||
LoDb::freeRecords(users);
|
||||
|
||||
return found;
|
||||
}
|
||||
@@ -100,10 +98,7 @@ static void truncateMessage(const char *message, char *buffer, size_t bufferSize
|
||||
|
||||
static void freeMailMessages(std::vector<void *> &mailMessages)
|
||||
{
|
||||
for (auto *mailPtr : mailMessages) {
|
||||
delete[] (uint8_t *)mailPtr;
|
||||
}
|
||||
mailMessages.clear();
|
||||
LoDb::freeRecords(mailMessages);
|
||||
}
|
||||
|
||||
static void freeNewsEntries(std::vector<LoBBSNewsEntry> &newsItems)
|
||||
@@ -382,9 +377,7 @@ ProcessMessage LoBBSModule::handleReceived(const meshtastic_MeshPacket &mp)
|
||||
sendReply(mp.from, userListMsg.c_str());
|
||||
|
||||
// Free allocated records
|
||||
for (auto *userPtr : users) {
|
||||
delete[] (uint8_t *)userPtr;
|
||||
}
|
||||
LoDb::freeRecords(users);
|
||||
}
|
||||
|
||||
return ProcessMessage::CONTINUE;
|
||||
@@ -694,3 +687,5 @@ void LoBBSModule::sendReply(NodeNum to, const std::string &msg)
|
||||
reply->decoded.want_response = false;
|
||||
service->sendToMesh(reply);
|
||||
}
|
||||
|
||||
LoBBSModule *lobbsModule;
|
||||
@@ -1,11 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "meta.h"
|
||||
#include "plugin.h"
|
||||
#include "LoBBSDal.h"
|
||||
#include "SinglePortModule.h"
|
||||
#include "lobbs.pb.h"
|
||||
|
||||
#define LOBBS_HEADER "LoBBS v" LOBBS_VERSION "\nCommands:\n"
|
||||
|
||||
/**
|
||||
* LoBBS (Lo-Fi Bulletin Board System) Module
|
||||
@@ -36,4 +35,6 @@ class LoBBSModule : public SinglePortModule
|
||||
LoBBSDal *dal;
|
||||
|
||||
void sendReply(NodeNum to, const std::string &msg);
|
||||
};
|
||||
};
|
||||
|
||||
extern LoBBSModule *lobbsModule;
|
||||
|
||||
@@ -22,6 +22,11 @@ message LoBBSUser {
|
||||
* User UUID - deterministic hash derived from username
|
||||
*/
|
||||
uint64 uuid = 3;
|
||||
|
||||
/*
|
||||
* Whether this user is an administrator
|
||||
*/
|
||||
bool is_admin = 4;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#pragma MPM_MODULE(LoBBSModule)
|
||||
|
||||
#define LOBBS_VERSION "1.1.0"
|
||||
14
src/plugin.h
Normal file
14
src/plugin.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#define LOBBS_VERSION "1.2.1"
|
||||
#define LOBBS_HEADER "LoBBS v" LOBBS_VERSION "\nCommands:\n"
|
||||
|
||||
#include "LoBBSModule.h"
|
||||
|
||||
/**
|
||||
* This plugin registers a Module with Meshtastic. Modules are the primary way
|
||||
* to extend Meshtastic with new functionality. Modules are registered with the
|
||||
* MPM_REGISTER_MESHTASTIC_MODULE comment directive below.
|
||||
*/
|
||||
// MPM_REGISTER_MESHTASTIC_MODULE: LoBBSModule, lobbsModule, []
|
||||
|
||||
Reference in New Issue
Block a user