Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# pre-commit: block commits containing secrets
# Scans staged files for known secret patterns
set -e

PATTERNS_FILE="$(git rev-parse --show-toplevel)/.secret-patterns.txt"
STAGED=$(git diff --cached --name-only --diff-filter=ACM 2>/dev/null)

if [ ! -f "$PATTERNS_FILE" ]; then
exit 0 # no patterns file = no scanning
fi

FOUND=0
for file in $STAGED; do
[ -f "$file" ] || continue
while IFS= read -r pattern; do
[ -z "$pattern" ] && continue
[[ "$pattern" == \#* ]] && continue
MATCH=$(git diff --cached -- "$file" | grep -nP "$pattern" 2>/dev/null | head -3)
if [ -n "$MATCH" ]; then
echo "SECRET DETECTED in $file (pattern: $pattern):"
echo "$MATCH"
FOUND=1
fi
done < "$PATTERNS_FILE"
done

if [ $FOUND -eq 1 ]; then
echo ""
echo "COMMIT BLOCKED — secret pattern detected."
echo "Override (NOT RECOMMENDED): git commit --no-verify"
exit 1
fi

exit 0
41 changes: 41 additions & 0 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env bash
# pre-push: block pushes containing secrets + run quality gates
# Scans all commits being pushed for secret patterns
set -e

PATTERNS_FILE="$(git rev-parse --show-toplevel)/.secret-patterns.txt"

if [ ! -f "$PATTERNS_FILE" ]; then
exit 0
fi

# Get commits being pushed
RANGE="@{u}..HEAD"
COMMITS=$(git rev-list "$RANGE" 2>/dev/null || echo "")

if [ -z "$COMMITS" ]; then
# No upstream — scan last 5 commits
COMMITS=$(git rev-list HEAD~5..HEAD 2>/dev/null || echo "")
fi

FOUND=0
while IFS= read -r pattern; do
[ -z "$pattern" ] && continue
[[ "$pattern" == \#* ]] && continue
MATCH=$(git log -p $RANGE 2>/dev/null | grep -nP "$pattern" 2>/dev/null | head -5)
if [ -n "$MATCH" ]; then
echo "SECRET in push history (pattern: $pattern):"
echo "$MATCH"
FOUND=1
fi
done < "$PATTERNS_FILE"

if [ $FOUND -eq 1 ]; then
echo ""
echo "PUSH BLOCKED — secrets detected in commit history."
echo "Scrub with: git filter-repo --replace-text .secret-patterns.txt"
exit 1
fi

echo "No secrets detected."
exit 0
28 changes: 28 additions & 0 deletions .secret-patterns.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Secret patterns — one regex per line, # for comments
# Block commits/pushes containing these patterns

# Nostr private keys
nsec1[a-z0-9]{20,}

# API keys (PPQ, OpenAI, etc.)
sk-[A-Za-z0-9]{10,}

# z.ai key format (32-char hex hash + dot + alphanumeric)
[0-9a-f]{32}\.[A-Za-z0-9]{8,}

# Private keys (PEM format)
-----BEGIN [A-Z ]*PRIVATE KEY

# Bearer tokens
Bearer [A-Za-z0-9\-._~+/]{20,}

# Hardcoded password/secret assignments (not env vars)
password.*=.*['\"][^'\"]{4,}['\"]
api_key.*=.*['\"][^'\"]{8,}['\"]
secret_key.*=.*['\"][^'\"]{8,}['\"]

# Signal phone numbers
\+1\d{10}

# Matrix access tokens
syt\.[A-Za-z0-9_-]{10,}
44 changes: 44 additions & 0 deletions boards/esp32c3_supermini.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"build": {
"arduino": {
"ldscript": "esp32c3_out.ld"
},
"core": "esp32",
"extra_flags": [
"-DARDUINO_ESP32C3_SUPERMINI",
"-DARDUINO_USB_MODE=1",
"-DARDUINO_USB_CDC_ON_BOOT=1"
],
"f_cpu": "160000000L",
"f_flash": "80000000L",
"flash_mode": "dio",
"hwids": [
[
"0x303a",
"0x1001"
]
],
"mcu": "esp32c3",
"variant": "esp32c3_supermini"
},
"connectivity": [
"wifi"
],
"debug": {
"openocd_target": "esp32c3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "ESP32-C3 SuperMini V1 (Maker go)",
"upload": {
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.aliexpress.com/item/1005006155740481.html",
"vendor": "Maker go"
}
52 changes: 52 additions & 0 deletions src/helpers/radiolib/CustomLR2021.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include <RadioLib.h>
#include "MeshCore.h"

class CustomLR2021 : public LR2021 {
bool _rx_boosted = false;

public:
CustomLR2021(Module *mod) : LR2021(mod) {
irqDioNum = LR2021_IRQ_DIO;
}

float getFreqMHz() const { return freqMHz; }

uint8_t getSpreadingFactor() const { return spreadingFactor; }

int16_t setRxBoostedGainMode(uint8_t level) {
_rx_boosted = (level > 0);
return LR2021::setRxBoostedGainMode(level);
}

bool getRxBoostedGainMode() const { return _rx_boosted; }

bool isReceiving() {
uint32_t irq = getIrqStatus();
// Use LR2021-specific IRQ flags if available, fall back to LR11x0
#ifdef RADIOLIB_LR2021_IRQ_PREAMBLE_DETECTED
bool detected = (irq & RADIOLIB_LR2021_IRQ_LORA_HEADER_VALID) ||
(irq & RADIOLIB_LR2021_IRQ_PREAMBLE_DETECTED);
#else
bool detected = (irq & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID) ||
Comment thread
c03rad0r marked this conversation as resolved.
(irq & RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED);
#endif
return detected;
}

bool std_init(SPIClass *spi = NULL) {
(void)spi;

int status = begin(LORA_FREQ, LORA_BW, LORA_SF, 5,
RADIOLIB_LR2021_LORA_SYNC_WORD_PRIVATE,
LORA_TX_POWER, 16, 0.0);
if (status != RADIOLIB_ERR_NONE) {
MESH_DEBUG_PRINTLN("LR2021: radio init failed: %d", status);
return false;
}

setCRC(1);
return true;
}
};
74 changes: 74 additions & 0 deletions src/helpers/radiolib/CustomLR2021Wrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#pragma once

#include "CustomLR2021.h"
#include "RadioLibWrappers.h"

class CustomLR2021Wrapper : public RadioLibWrapper {
public:
CustomLR2021Wrapper(CustomLR2021 &radio, mesh::MainBoard &board)
: RadioLibWrapper(radio, board) {}

void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override {
((CustomLR2021 *)_radio)->setFrequency(freq);
((CustomLR2021 *)_radio)->setSpreadingFactor(sf);
((CustomLR2021 *)_radio)->setBandwidth(bw);
((CustomLR2021 *)_radio)->setCodingRate(cr);
updatePreamble(sf);
}

bool isReceivingPacket() override {
return ((CustomLR2021 *)_radio)->isReceiving();
}

float getCurrentRSSI() override {
float rssi = -110;
((CustomLR2021 *)_radio)->getRssiInst(&rssi);
return rssi;
}

void onSendFinished() override {
RadioLibWrapper::onSendFinished();
_radio->setPreambleLength(
preambleLengthForSF(getSpreadingFactor()));
}

float getLastRSSI() const override {
return ((CustomLR2021 *)_radio)->getRSSI();
}

float getLastSNR() const override {
return ((CustomLR2021 *)_radio)->getSNR();
}

uint8_t getSpreadingFactor() const override {
return ((CustomLR2021 *)_radio)->getSpreadingFactor();
}

float packetScore(float snr, int packet_len) override {
int sf = ((CustomLR2021 *)_radio)->getSpreadingFactor();
return packetScoreInt(snr, sf, packet_len);
}

void powerOff() override {
((CustomLR2021 *)_radio)->sleep(false, 0);
}

void doResetAGC() override {
CustomLR2021 *r = (CustomLR2021 *)_radio;
float freq = r->getFreqMHz();
r->sleep(true, 0);
r->standby(RADIOLIB_LR2021_STANDBY_RC, true);
r->calibrate(RADIOLIB_LR2021_CALIBRATE_ALL);
r->setFrequency(freq);
r->setRxBoostedGainMode(RADIOLIB_LR2021_RX_BOOST_LF);
}

void setRxBoostedGainMode(bool en) override {
((CustomLR2021 *)_radio)->setRxBoostedGainMode(
en ? RADIOLIB_LR2021_RX_BOOST_LF : 0);
}

bool getRxBoostedGainMode() const override {
return ((CustomLR2021 *)_radio)->getRxBoostedGainMode();
}
};
Loading