From a9849f473a5dd5176616a07b57a75459089ce9a5 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:02:00 -0600 Subject: [PATCH] Whoa boy rust is a problem child --- .gitignore | 1 + secert-hitler/Cargo.lock | 84 +++++++++++ secert-hitler/Cargo.toml | 10 ++ secert-hitler/src/config.rs | 1 + .../src/controller/gamemaster/gamemaster.rs | 23 +++ secert-hitler/src/controller/mod.rs | 0 secert-hitler/src/controller/state/event.rs | 19 +++ .../src/controller/state/mockroom.rs | 134 ++++++++++++++++++ .../src/controller/state/mockrooms.rs | 89 ++++++++++++ secert-hitler/src/controller/state/room.rs | 14 ++ secert-hitler/src/controller/state/rooms.rs | 13 ++ secert-hitler/src/main.rs | 11 ++ secert-hitler/src/model/mod.rs | 0 secert-hitler/src/view/mod.rs | 0 testdata/matrix-sandbox/build.sh | 19 +-- testdata/matrix-sandbox/synapse-test-log.yaml | 43 ++++++ testdata/matrix-sandbox/synapse-test.key | 1 + 17 files changed, 454 insertions(+), 8 deletions(-) create mode 100644 secert-hitler/Cargo.lock create mode 100644 secert-hitler/Cargo.toml create mode 100644 secert-hitler/src/config.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster.rs create mode 100644 secert-hitler/src/controller/mod.rs create mode 100644 secert-hitler/src/controller/state/event.rs create mode 100644 secert-hitler/src/controller/state/mockroom.rs create mode 100644 secert-hitler/src/controller/state/mockrooms.rs create mode 100644 secert-hitler/src/controller/state/room.rs create mode 100644 secert-hitler/src/controller/state/rooms.rs create mode 100644 secert-hitler/src/main.rs create mode 100644 secert-hitler/src/model/mod.rs create mode 100644 secert-hitler/src/view/mod.rs create mode 100644 testdata/matrix-sandbox/synapse-test-log.yaml create mode 100644 testdata/matrix-sandbox/synapse-test.key diff --git a/.gitignore b/.gitignore index d20ab8d..efd4a88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/*.sw* **/*.db +**/target diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock new file mode 100644 index 0000000..440f6fb --- /dev/null +++ b/secert-hitler/Cargo.lock @@ -0,0 +1,84 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" + +[[package]] +name = "ppv-lite86" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "secert-hitler" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml new file mode 100644 index 0000000..de858f8 --- /dev/null +++ b/secert-hitler/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "secert-hitler" +version = "0.1.0" +authors = ["bel "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rand = "*" diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs new file mode 100644 index 0000000..e993cd0 --- /dev/null +++ b/secert-hitler/src/config.rs @@ -0,0 +1 @@ +pub static PORT:&str = ":8080"; diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs new file mode 100644 index 0000000..d3ad63e --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -0,0 +1,23 @@ +#[derive(Debug)] +pub struct GameMaster { + room_id: String, +} + +impl GameMaster { + fn new() -> GameMaster { + GameMaster{ + room_id: "hello".to_string(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new() { + let gm = GameMaster::new(); + println!("made: {:?}", gm); + } +} diff --git a/secert-hitler/src/controller/mod.rs b/secert-hitler/src/controller/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/secert-hitler/src/controller/state/event.rs b/secert-hitler/src/controller/state/event.rs new file mode 100644 index 0000000..b8f5492 --- /dev/null +++ b/secert-hitler/src/controller/state/event.rs @@ -0,0 +1,19 @@ +#[derive(Clone, Debug)] +pub struct Event { + pub sender: String, + pub body: String, + pub next: String, +} + +#[cfg(test)] +mod tests { + #[test] + fn event() { + let e = super::Event{ + sender: "sender".to_string(), + body: "body".to_string(), + next: "next".to_string(), + }; + println!("{:?}", e); + } +} diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/controller/state/mockroom.rs new file mode 100644 index 0000000..36d01ee --- /dev/null +++ b/secert-hitler/src/controller/state/mockroom.rs @@ -0,0 +1,134 @@ +use super::room::Room; +use super::event::Event; + +use rand::{self, Rng}; +use rand::distributions::Alphanumeric; + +#[derive(Clone, Debug)] +pub struct MockRoom { + last: String, + room_id: String, + events: Vec, +} + +impl MockRoom { + pub fn create() -> MockRoom { + MockRoom::join(rands()) + } + + pub fn join(room_id: String) -> MockRoom { + MockRoom { + last: "".to_string(), + room_id: room_id, + events: vec![], + } + } + + pub fn room(&self) -> impl Room { + self.clone() + } +} + +impl Room for MockRoom { + fn sync(&mut self) -> Vec { + let mut unseen: Vec = vec![]; + let mut last = self.last.clone(); + for e in &self.events { + if e.next == self.last { + unseen.clear(); + } else { + unseen.push(e.clone()); + last = e.next.clone(); + } + } + self.last = last; + return unseen; + } + + fn send(&mut self, message: String) -> Result<&str, &str> { + let e = Event{ + sender: rands(), + next: rands(), + body: message, + }; + self.events.push(e); + Ok("ok") + } + + fn room_id(&self) -> String { + self.room_id.clone() + } +} + +pub fn rands() -> String { + rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(10) + .collect::() +} + +#[cfg(test)] +mod tests { + use super::Room; + use super::MockRoom; + use super::Event; + use super::rands; + + fn _dummy() -> MockRoom { + let mut r = MockRoom::create(); + r.last = "1".to_string(); + r.events = vec![]; + for i in 0..5 { + r.events.push(Event{ + sender: i.to_string(), + next: i.to_string(), + body: i.to_string(), + }); + } + r + } + + #[test] + fn randstest() { + let a = rands(); + let b = rands(); + assert!(a != b, "a == {} == b == {}", a, b); + } + + #[test] + fn create() { + let mut r: MockRoom = MockRoom::create(); + println!("{:?}", r.sync()); + } + + #[test] + fn join() { + let rid = "a".to_string(); + let r: MockRoom = MockRoom::join(rid.to_string()); + assert!(r.room_id == rid); + } + + #[test] + fn sync() { + let mut r = _dummy(); + let events = r.sync(); + assert!(events.len() == 3, "want {}, got {}: {:?}", 3, events.len(), events); + assert!(events[0].sender == "2"); + assert!(events[0].body == "2"); + assert!(events[0].next == "2"); + assert!(r.last == "4", "want last==4, got {}", r.last); + } + + #[test] + fn send() { + let mut r = _dummy(); + let message = "message".to_string(); + r.sync(); + assert!(r.send(message.clone()).ok().unwrap() == "ok"); + assert!(r.last == "4"); + let events = r.sync(); + assert!(events.len() == 1); + assert!(events[0].body == message, "want {}, got {}: {:?}", message, events[0].body, events); + assert!(r.last != "4"); + } +} diff --git a/secert-hitler/src/controller/state/mockrooms.rs b/secert-hitler/src/controller/state/mockrooms.rs new file mode 100644 index 0000000..963aa5f --- /dev/null +++ b/secert-hitler/src/controller/state/mockrooms.rs @@ -0,0 +1,89 @@ +use super::rooms::Rooms; +use super::room::Room; +use super::mockroom::MockRoom; + +// #[derive(Clone, Debug)] +pub struct MockRooms { + rooms: Vec, +} + +impl MockRooms { + pub fn new() -> MockRooms { + MockRooms { + rooms: vec![], + } + } +} + +impl Rooms for MockRooms { + fn create(&mut self) -> Box { + let room = MockRoom::create(); + let _room = room.room(); + self.rooms.push(room); + Box::new(_room) + } + + fn join(&self, room_id: String) -> Result, &str> { + for r in &self.rooms { + if r.room_id() == room_id { + return Ok(Box::new(r.room())); + } + } + Err("not found") + } +} + +#[cfg(test)] +mod tests { + use super::MockRooms; + use super::MockRoom; + use super::Rooms; + + fn _dummy() -> MockRooms { + let mut mrs = MockRooms::new(); + for i in 0..5 { + let random = MockRoom::create(); + mrs.rooms.push(random); + let joined = MockRoom::join(i.to_string()); + mrs.rooms.push(joined); + } + assert!(mrs.rooms.len() == 10); + mrs + } + + #[test] + fn mockrooms() { + let mrs = MockRooms::new(); + assert!(mrs.rooms.len() == 0); + } + + #[test] + fn create() { + let mut mrs = _dummy(); + let was = mrs.rooms.len(); + let _ = mrs.create(); + let is = mrs.rooms.len(); + assert!(was+1 == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + } + + #[test] + fn join_404() { + let mrs = _dummy(); + let was = mrs.rooms.len(); + let r = mrs.join("does not exist".to_string()); + let is = mrs.rooms.len(); + assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + assert!(!r.is_ok()); + } + + #[test] + fn join_found() { + let mrs = _dummy(); + let was = mrs.rooms.len(); + let r = mrs.join("0".to_string()); + let is = mrs.rooms.len(); + assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + assert!(r.is_ok()); + assert!(r.ok().unwrap().room_id() == "0"); + } +} diff --git a/secert-hitler/src/controller/state/room.rs b/secert-hitler/src/controller/state/room.rs new file mode 100644 index 0000000..8d7b354 --- /dev/null +++ b/secert-hitler/src/controller/state/room.rs @@ -0,0 +1,14 @@ +use super::event; + +pub trait Room { + fn sync(&mut self) -> Vec; + fn send(&mut self, message: String) -> Result<&str, &str>; + fn room_id(&self) -> String; +} + +#[cfg(test)] +mod tests { + #[test] + fn room() { + } +} diff --git a/secert-hitler/src/controller/state/rooms.rs b/secert-hitler/src/controller/state/rooms.rs new file mode 100644 index 0000000..f417088 --- /dev/null +++ b/secert-hitler/src/controller/state/rooms.rs @@ -0,0 +1,13 @@ +use super::room::Room; + +pub trait Rooms { + fn create(&mut self) -> Box; + fn join(&self, room_id: String) -> Result, &str>; +} + +#[cfg(test)] +mod tests { + #[test] + fn rooms() { + } +} diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs new file mode 100644 index 0000000..5f819e9 --- /dev/null +++ b/secert-hitler/src/main.rs @@ -0,0 +1,11 @@ +mod config; +#[path = "./controller/gamemaster/gamemaster.rs"] mod gamemaster; +#[path = "./controller/state/event.rs"] mod event; +#[path = "./controller/state/room.rs"] mod room; +#[path = "./controller/state/rooms.rs"] mod rooms; +#[path = "./controller/state/mockroom.rs"] mod mockroom; +#[path = "./controller/state/mockrooms.rs"] mod mockrooms; + +fn main() { + println!("{}", config::PORT); +} diff --git a/secert-hitler/src/model/mod.rs b/secert-hitler/src/model/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/secert-hitler/src/view/mod.rs b/secert-hitler/src/view/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/testdata/matrix-sandbox/build.sh b/testdata/matrix-sandbox/build.sh index bea59f2..dc4e997 100644 --- a/testdata/matrix-sandbox/build.sh +++ b/testdata/matrix-sandbox/build.sh @@ -1,7 +1,10 @@ #! /bin/bash if ! ps aux | grep -v grep | grep homeserver; then - homeserver -c config.yaml & + cp synapse-test.key /tmp/ + cp synapse-test-log.yaml /tmp/ + homeserver -c config.yaml &> /tmp/synapse-test.log & + disown fi # pick a username @@ -9,7 +12,7 @@ username="$(cat /proc/sys/kernel/random/uuid)" # register out="$( - curl -sS http://192.168.0.86:39487/_matrix/client/r0/register \ + curl -sS http://localhost:39487/_matrix/client/r0/register \ -X POST \ -H 'content-type: application/json' \ -d "$( @@ -31,7 +34,7 @@ home_server="$(echo "$out" | jq -r .home_server)" room="$(cat /proc/sys/kernel/random/uuid)" out="$( - curl -sS http://192.168.0.86:39487/_matrix/client/r0/createRoom\ + curl -sS http://localhost:39487/_matrix/client/r0/createRoom\ -X POST \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -46,7 +49,7 @@ room_id="$(echo "$out" | jq -r .room_id)" # join a room by name # curl -XPOST -d '{}' "https://localhost:8448/_matrix/client/r0/join/%21asfLdzLnOdGRkdPZWu:localhost?access_token=YOUR_ACCESS_TOKEN" -curl -sS "http://192.168.0.86:39487/_matrix/client/r0/join/$room_id" \ +curl -sS "http://localhost:39487/_matrix/client/r0/join/$room_id" \ -X POST \ -H 'Authorization: Bearer '"$access_token" \ -d '{}' @@ -58,7 +61,7 @@ txid="$(cat /proc/sys/kernel/random/uuid)" message="hello wurl" out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ + curl -sS "http://localhost:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ -X PUT \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -74,7 +77,7 @@ printf "%s\n" "$out" # get recent messages # curl --globoff -XGET 'https://localhost:8448/_matrix/client/r0/sync?filter={"room":{"timeline":{"limit":1}}}&access_token=YOUR_ACCESS_TOKEN' out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/sync" \ + curl -sS "http://localhost:39487/_matrix/client/r0/sync" \ -X GET \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -89,7 +92,7 @@ txid="$(cat /proc/sys/kernel/random/uuid)" message="hello wurl2" out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ + curl -sS "http://localhost:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ -X PUT \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -104,7 +107,7 @@ printf "%s\n" "$out" # get second recent messages # curl --globoff -XGET 'https://localhost:8448/_matrix/client/r0/sync?filter={"room":{"timeline":{"limit":1}}}&access_token=YOUR_ACCESS_TOKEN' -curl -sS "http://192.168.0.86:39487/_matrix/client/r0/sync?since=$since" \ +curl -sS "http://localhost:39487/_matrix/client/r0/sync?since=$since" \ -X GET \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ diff --git a/testdata/matrix-sandbox/synapse-test-log.yaml b/testdata/matrix-sandbox/synapse-test-log.yaml new file mode 100644 index 0000000..91633e4 --- /dev/null +++ b/testdata/matrix-sandbox/synapse-test-log.yaml @@ -0,0 +1,43 @@ +# Log configuration for Synapse. +# +# This is a YAML file containing a standard Python logging configuration +# dictionary. See [1] for details on the valid settings. +# +# [1]: https://docs.python.org/3.7/library/logging.config.html#configuration-dictionary-schema + +version: 1 + +formatters: + precise: + format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s' + +filters: + context: + (): synapse.logging.context.LoggingContextFilter + request: "" + +handlers: + file: + class: logging.handlers.RotatingFileHandler + formatter: precise + filename: /home/bel/Go/src/local/containers/secret-hitler-via-matrix/testdata/matrix-sandbox/homeserver.log + maxBytes: 104857600 + backupCount: 10 + filters: [context] + encoding: utf8 + console: + class: logging.StreamHandler + formatter: precise + filters: [context] + +loggers: + synapse.storage.SQL: + # beware: increasing this to DEBUG will make synapse log sensitive + # information such as access tokens. + level: INFO + +root: + level: INFO + handlers: [file, console] + +disable_existing_loggers: false diff --git a/testdata/matrix-sandbox/synapse-test.key b/testdata/matrix-sandbox/synapse-test.key new file mode 100644 index 0000000..72bb5ae --- /dev/null +++ b/testdata/matrix-sandbox/synapse-test.key @@ -0,0 +1 @@ +ed25519 a_RcOc CohEFmFuSDY+kHBbY//SMIUZp+hIuyOMEphT2NLEsDc