Compare commits

...
Sign in to create a new pull request.

3 commits

Author SHA1 Message Date
dav
200f6f54f8 Add test auth button 2024-07-13 10:18:33 -07:00
dav
04f1561e96 Remove auth screen and make req async 2024-06-01 23:10:32 -07:00
dav
3061a71260 Add Fetching Slack Token 2024-05-25 11:15:14 -07:00
5 changed files with 362 additions and 35 deletions

275
burrow-gtk/Cargo.lock generated
View file

@ -125,6 +125,12 @@ dependencies = [
"syn 2.0.48", "syn 2.0.48",
] ]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
@ -152,6 +158,12 @@ version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]] [[package]]
name = "base64ct" name = "base64ct"
version = "1.6.0" version = "1.6.0"
@ -252,7 +264,7 @@ dependencies = [
"aead", "aead",
"anyhow", "anyhow",
"async-channel", "async-channel",
"base64", "base64 0.21.7",
"blake2", "blake2",
"caps", "caps",
"chacha20poly1305", "chacha20poly1305",
@ -293,7 +305,10 @@ dependencies = [
"gettext-rs", "gettext-rs",
"glib-build-tools", "glib-build-tools",
"relm4", "relm4",
"reqwest 0.12.4",
"serde",
"tokio", "tokio",
"url",
] ]
[[package]] [[package]]
@ -1206,7 +1221,26 @@ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http", "http 0.2.11",
"indexmap",
"slab",
"tokio",
"tokio-util",
"tracing",
]
[[package]]
name = "h2"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
dependencies = [
"atomic-waker",
"bytes",
"fnv",
"futures-core",
"futures-sink",
"http 1.1.0",
"indexmap", "indexmap",
"slab", "slab",
"tokio", "tokio",
@ -1267,6 +1301,17 @@ dependencies = [
"itoa", "itoa",
] ]
[[package]]
name = "http"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
dependencies = [
"bytes",
"fnv",
"itoa",
]
[[package]] [[package]]
name = "http-body" name = "http-body"
version = "0.4.6" version = "0.4.6"
@ -1274,7 +1319,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http 0.2.11",
"pin-project-lite",
]
[[package]]
name = "http-body"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
dependencies = [
"bytes",
"http 1.1.0",
]
[[package]]
name = "http-body-util"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
dependencies = [
"bytes",
"futures-core",
"http 1.1.0",
"http-body 1.0.0",
"pin-project-lite", "pin-project-lite",
] ]
@ -1300,20 +1368,40 @@ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
"futures-util", "futures-util",
"h2", "h2 0.3.24",
"http", "http 0.2.11",
"http-body", "http-body 0.4.6",
"httparse", "httparse",
"httpdate", "httpdate",
"itoa", "itoa",
"pin-project-lite", "pin-project-lite",
"socket2 0.5.5", "socket2",
"tokio", "tokio",
"tower-service", "tower-service",
"tracing", "tracing",
"want", "want",
] ]
[[package]]
name = "hyper"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
"h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"httparse",
"itoa",
"pin-project-lite",
"smallvec",
"tokio",
"want",
]
[[package]] [[package]]
name = "hyper-tls" name = "hyper-tls"
version = "0.5.0" version = "0.5.0"
@ -1321,12 +1409,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
dependencies = [ dependencies = [
"bytes", "bytes",
"hyper", "hyper 0.14.28",
"native-tls", "native-tls",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
] ]
[[package]]
name = "hyper-tls"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes",
"http-body-util",
"hyper 1.3.1",
"hyper-util",
"native-tls",
"tokio",
"tokio-native-tls",
"tower-service",
]
[[package]]
name = "hyper-util"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d8d52be92d09acc2e01dddb7fde3ad983fc6489c7db4837e605bc3fca4cb63e"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
"http 1.1.0",
"http-body 1.0.0",
"hyper 1.3.1",
"pin-project-lite",
"socket2",
"tokio",
"tower",
"tower-service",
"tracing",
]
[[package]] [[package]]
name = "idna" name = "idna"
version = "0.5.0" version = "0.5.0"
@ -2148,16 +2272,16 @@ version = "0.11.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
dependencies = [ dependencies = [
"base64", "base64 0.21.7",
"bytes", "bytes",
"encoding_rs", "encoding_rs",
"futures-core", "futures-core",
"futures-util", "futures-util",
"h2", "h2 0.3.24",
"http", "http 0.2.11",
"http-body", "http-body 0.4.6",
"hyper", "hyper 0.14.28",
"hyper-tls", "hyper-tls 0.5.0",
"ipnet", "ipnet",
"js-sys", "js-sys",
"log", "log",
@ -2177,7 +2301,49 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"winreg", "winreg 0.50.0",
]
[[package]]
name = "reqwest"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10"
dependencies = [
"base64 0.22.1",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
"hyper 1.3.1",
"hyper-tls 0.6.0",
"hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
"native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
"rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"system-configuration",
"tokio",
"tokio-native-tls",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"winreg 0.52.0",
] ]
[[package]] [[package]]
@ -2228,6 +2394,22 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "rustls-pemfile"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
dependencies = [
"base64 0.22.1",
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.16" version = "1.0.16"
@ -2304,18 +2486,18 @@ checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.195" version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.195" version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2428,16 +2610,6 @@ version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
[[package]]
name = "socket2"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
dependencies = [
"libc",
"winapi",
]
[[package]] [[package]]
name = "socket2" name = "socket2"
version = "0.5.5" version = "0.5.5"
@ -2463,7 +2635,7 @@ version = "9.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082"
dependencies = [ dependencies = [
"base64", "base64 0.21.7",
"digest", "digest",
"hex", "hex",
"miette", "miette",
@ -2507,6 +2679,12 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "system-configuration" name = "system-configuration"
version = "0.5.1" version = "0.5.1"
@ -2641,7 +2819,7 @@ dependencies = [
"mio", "mio",
"num_cpus", "num_cpus",
"pin-project-lite", "pin-project-lite",
"socket2 0.5.5", "socket2",
"tokio-macros", "tokio-macros",
"tracing", "tracing",
"windows-sys 0.48.0", "windows-sys 0.48.0",
@ -2727,6 +2905,27 @@ dependencies = [
"winnow", "winnow",
] ]
[[package]]
name = "tower"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
dependencies = [
"futures-core",
"futures-util",
"pin-project",
"pin-project-lite",
"tokio",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
[[package]] [[package]]
name = "tower-service" name = "tower-service"
version = "0.3.2" version = "0.3.2"
@ -2851,10 +3050,10 @@ dependencies = [
"libloading 0.7.4", "libloading 0.7.4",
"log", "log",
"nix 0.26.4", "nix 0.26.4",
"reqwest", "reqwest 0.11.23",
"schemars", "schemars",
"serde", "serde",
"socket2 0.4.10", "socket2",
"ssri", "ssri",
"tempfile", "tempfile",
"tokio", "tokio",
@ -3254,6 +3453,16 @@ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "winreg"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
dependencies = [
"cfg-if",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "x25519-dalek" name = "x25519-dalek"
version = "2.0.0" version = "2.0.0"

View file

@ -9,8 +9,11 @@ edition = "2021"
anyhow = "1.0" anyhow = "1.0"
relm4 = { version = "0.6", features = ["libadwaita", "gnome_44"]} relm4 = { version = "0.6", features = ["libadwaita", "gnome_44"]}
burrow = { version = "*", path = "../burrow/" } burrow = { version = "*", path = "../burrow/" }
tokio = { version = "1.35.0", features = ["time", "sync"] } tokio = { version = "1.35.0", features = ["time", "sync", "net"] }
gettext-rs = { version = "0.7.0", features = ["gettext-system"] } gettext-rs = { version = "0.7.0", features = ["gettext-system"] }
serde = { version = "1", features = ["derive"] }
url = "2.5.0"
reqwest = { version = "0.12.4", features = ["json"] }
[build-dependencies] [build-dependencies]
anyhow = "1.0" anyhow = "1.0"

106
burrow-gtk/src/auth.rs Normal file
View file

@ -0,0 +1,106 @@
use reqwest::{Client, Method};
use serde::{Deserialize, Serialize};
use std::process::Command;
use tokio::{
io::AsyncWriteExt,
io::{AsyncBufReadExt, BufReader},
net::TcpListener,
};
use url::Url;
const SLACK_CLIENT_ID: &str = "2210535565.6884042183125";
const SLACK_CLIENT_SECRET: &str = "2793c8a5255cae38830934c664eeb62d";
const SLACK_REDIRECT_URI: &str = "https://burrow.rs/callback/oauth2";
pub async fn slack_auth() {
let url = Url::parse_with_params(
"https://slack.com/openid/connect/authorize",
&[
("response_type", "code"),
("scope", "openid profile"),
("client_id", SLACK_CLIENT_ID),
("redirect_uri", SLACK_REDIRECT_URI),
],
)
.unwrap();
Command::new("xdg-open").arg(url.as_str()).spawn().unwrap();
let listener = TcpListener::bind("127.0.0.1:1024").await.unwrap();
let (mut stream, _) = listener.accept().await.unwrap();
let buf_reader = BufReader::new(&mut stream);
let mut lines = buf_reader.lines();
let mut http_request = vec![];
while let Some(line) = lines.next_line().await.unwrap() {
if !line.is_empty() {
http_request.push(line);
} else {
break;
}
}
let response = "HTTP/1.1 200 OK\r\n\r\n";
stream.write_all(response.as_bytes()).await.unwrap();
let code = http_request
.iter()
.filter_map(|field| {
if field.starts_with("GET ") {
Some(
field
.replace("GET /?code=", "")
.replace(" HTTP/1.1", "")
.to_owned(),
)
} else {
None
}
})
.next()
.unwrap();
#[derive(Debug, Clone, Deserialize)]
struct TokenRes {
ok: bool,
access_token: Option<String>,
token_type: Option<String>,
id_token: Option<String>,
}
let client = Client::builder().build().unwrap();
let res = client
.request(Method::POST, "https://slack.com/api/openid.connect.token")
.query(&[
("client_id", SLACK_CLIENT_ID),
("client_secret", SLACK_CLIENT_SECRET),
("code", &code),
("grant_type", "authorization_code"),
("redirect_uri", SLACK_REDIRECT_URI),
])
.send()
.await
.unwrap()
.json::<TokenRes>()
.await
.unwrap();
#[derive(Debug, Clone, Serialize)]
struct SlackAuthReq {
slack_token: String,
}
let res = client
.post("https://burrow-hidden-pine-3298.fly.dev/slack-auth")
.json(&SlackAuthReq {
slack_token: res.id_token.unwrap(),
})
.send()
.await
.unwrap()
.text()
.await
.unwrap();
println!("{:?}", res);
}

View file

@ -35,6 +35,7 @@ impl DiagGroup {
#[derive(Debug)] #[derive(Debug)]
pub enum DiagGroupMsg { pub enum DiagGroupMsg {
Refresh, Refresh,
TestSlackAuth,
} }
#[relm4::component(pub, async)] #[relm4::component(pub, async)]
@ -85,7 +86,11 @@ impl AsyncComponent for DiagGroup {
gtk::Button { gtk::Button {
set_label: "Refresh", set_label: "Refresh",
connect_clicked => DiagGroupMsg::Refresh connect_clicked => DiagGroupMsg::Refresh
} },
gtk::Button {
set_label: "Authenticate with Slack",
connect_clicked => DiagGroupMsg::TestSlackAuth,
},
} }
} }
@ -113,6 +118,9 @@ impl AsyncComponent for DiagGroup {
// Should be impossible to panic here // Should be impossible to panic here
*self = Self::new(Arc::clone(&self.daemon_client)).await.unwrap(); *self = Self::new(Arc::clone(&self.daemon_client)).await.unwrap();
} }
DiagGroupMsg::TestSlackAuth => {
auth::slack_auth().await;
}
} }
} }
} }

View file

@ -1,5 +1,6 @@
use anyhow::Result; use anyhow::Result;
mod auth;
pub mod components; pub mod components;
mod diag; mod diag;