17 Commits

Author SHA1 Message Date
f18285b853 security: remove hardcoded secret key and improve key handling
All checks were successful
Android Build Final Fixed / build-android (push) Successful in 7m27s
2026-01-30 22:39:13 +01:00
88e7d0cf6b Build: Android-Signierung hinzugefügt
All checks were successful
Android Build Final Fixed / build-android (push) Successful in 7m13s
2026-01-30 22:03:20 +01:00
6a11a0e0d7 Build: Android-Signierung hinzugefügt
All checks were successful
Android Build Final Fixed / build-android (push) Successful in 7m29s
2026-01-30 21:53:55 +01:00
f2d36798ba Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m23s
2026-01-30 21:45:18 +01:00
6b89925ab8 Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m13s
2026-01-30 21:35:00 +01:00
edefcab01c Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m10s
2026-01-30 21:26:41 +01:00
c41394e116 Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m12s
2026-01-30 21:17:46 +01:00
c6c00d1e4b Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m9s
2026-01-30 21:07:52 +01:00
c00e9c83c9 Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m15s
2026-01-30 20:42:59 +01:00
0f9d28de61 Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 2m7s
2026-01-30 20:36:43 +01:00
432185a92d Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 58s
2026-01-30 20:33:22 +01:00
89509418be Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 7m9s
2026-01-30 20:18:33 +01:00
bd7306ecf2 Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 2m26s
2026-01-30 20:15:23 +01:00
c5053e70db Build: Android-Signierung hinzugefügt
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 0s
2026-01-30 20:14:02 +01:00
c744f3bcc5 Android Build CD/CI
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 5m38s
2026-01-30 19:51:39 +01:00
174da803ec Android Build CD/CI
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 2m29s
2026-01-30 19:43:07 +01:00
ca9e360bfd Android Build CD/CI
Some checks failed
Android Build Final Fixed / build-android (push) Failing after 2m23s
2026-01-30 19:38:49 +01:00
4 changed files with 58 additions and 16 deletions

View File

@@ -1,5 +1,8 @@
name: Android Build Final Fixed name: Android Build Final Fixed
on: [push] on:
push:
branches: [main]
tags: ["v*"] # Triggert bei v0.1.0, v1.0, etc.
jobs: jobs:
build-android: build-android:
@@ -53,23 +56,51 @@ jobs:
export PATH="$HOME/.cargo/bin:$PATH" export PATH="$HOME/.cargo/bin:$PATH"
export ANDROID_HOME=$HOME/android-sdk export ANDROID_HOME=$HOME/android-sdk
export NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393 export NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
# 1. Frontend mit Trunk bauen # 1. Frontend bauen
trunk build --release trunk build --release
# 2. Android APK bauen # 2. Android Build
if [ ! -d "src-tauri/gen/android" ]; then if [ ! -d "src-tauri/gen/android" ]; then
cargo-tauri android init cargo-tauri android init
fi fi
cargo-tauri android build --target aarch64 --apk true cargo-tauri android build --target aarch64 --apk true
# 3. APK manuell signieren
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | tr -d '[:space:]' > keystore.b64
base64 -d keystore.b64 > release.keystore
UNSIGNED_APK=$(find src-tauri/gen/android/app/build/outputs/apk/universal/release -name "*-unsigned.apk" | head -n 1)
APKSIGNER=$(find $ANDROID_HOME/build-tools -name apksigner | sort -r | head -n 1)
$APKSIGNER sign --ks release.keystore \
--ks-type PKCS12 \
--ks-key-alias "${{ secrets.ANDROID_KEY_ALIAS }}" \
--ks-pass pass:"${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" \
--key-pass pass:"${{ secrets.ANDROID_KEY_PASSWORD }}" \
--v4-signing-enabled true \
--out Marstemedia-Signed.apk \
"$UNSIGNED_APK"
echo "Signierung erfolgreich!"
env: env:
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
- name: Upload APK Artifact - name: Upload Artifact
# Downgrade auf v3, da v4 auf Gitea/GHES oft nicht funktioniert
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: Xiaomi-App name: Marstemedia-Signed
# v3 unterstützt Wildcards etwas anders, daher geben wir den Pfad präzise an path: Marstemedia-Signed.apk
path: src-tauri/gen/android/app/build/outputs/apk/release/*.apk
- name: Create Gitea Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
with:
files: Marstemedia-Signed.apk
# Gitea braucht manchmal explizit den Namen/Body
name: "Release ${{ github.ref_name }}"
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
/target/ /target/
/Cargo.lock /Cargo.lock
/.jj/ /.jj/
my-release-key.keystore

View File

@@ -21,6 +21,7 @@ easy-nostr = { path = "./easy-nostr" }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
feed-rs = "2.3.1" feed-rs = "2.3.1"
ron = "0.8" ron = "0.8"
nostr-sdk = "0.44.1"
# FIX: default-features entfernt und rustls-tls hinzugefügt # FIX: default-features entfernt und rustls-tls hinzugefügt
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] }

View File

@@ -1,5 +1,6 @@
use easy_nostr::EasyNostr; use easy_nostr::EasyNostr;
use serde::Serialize; use nostr_sdk::prelude::{Keys, ToBech32};
use serde::Serialize; // Import für die Schlüssel-Generierung
// Diese Struktur ist für den Transport zum Frontend (JSON) // Diese Struktur ist für den Transport zum Frontend (JSON)
#[derive(Serialize)] #[derive(Serialize)]
@@ -11,12 +12,20 @@ pub struct LocalPost {
#[tauri::command] #[tauri::command]
pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> { pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> {
// 1. Verbindung aufbauen // 1. Temporären Einweg-Schlüssel generieren
let easy = EasyNostr::new("nsec1fkhszd5sv8yp6g966qdh5kuph25g4nn9pa2k5rwpuglt6rde8u8qwr3r87") // Das erzeugt ein Schlüsselpaar im RAM, das nach dem Funktionsaufruf verschwindet.
let random_keys = Keys::generate();
let temp_nsec = random_keys
.secret_key()
.to_bech32()
.map_err(|e| format!("Fehler beim Generieren des Keys: {}", e))?;
// 2. Verbindung mit dem temporären Key aufbauen
let easy = EasyNostr::new(&temp_nsec)
.await .await
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
// 2. Relays hinzufügen // 3. Relays hinzufügen
easy.add_relays(vec![ easy.add_relays(vec![
"wss://relay.damus.io", "wss://relay.damus.io",
"wss://nos.lol", "wss://nos.lol",
@@ -25,16 +34,16 @@ pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> {
.await .await
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
// 3. Posts von der Library holen // 4. Posts von der Library holen
let raw_posts = easy.get_random_posts().await.map_err(|e| e.to_string())?; let raw_posts = easy.get_random_posts().await.map_err(|e| e.to_string())?;
// 4. Mappen: Library-Typ -> Unser serialisierbarer Typ // 5. Mappen: Library-Typ -> Unser serialisierbarer Typ
let mapped_posts = raw_posts let mapped_posts = raw_posts
.into_iter() .into_iter()
.map(|p| LocalPost { .map(|p| LocalPost {
content: p.content, content: p.content,
author: p.author.to_string(), author: p.author.to_string(),
created_at: p.created_at.as_secs(), // Hier geändert von as_u64() created_at: p.created_at.as_secs(),
}) })
.collect(); .collect();