Skip to content

Commit b1014c5

Browse files
committed
Add command to generate JWT tokens
We should not search for 3rd party JWT generators, but have kernelci-storage embedded features. Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
1 parent 742a943 commit b1014c5

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

src/main.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,17 @@ struct Args {
5757
#[clap(
5858
short,
5959
long,
60+
default_value = "false",
6061
help = "Generate JWT secret"
6162
)]
6263
generate_jwt_secret: bool,
64+
65+
#[clap(
66+
long,
67+
default_value = "",
68+
help = "Generate JWT token for email"
69+
)]
70+
generate_jwt_token: String,
6371
}
6472

6573
struct ReceivedFile {
@@ -99,6 +107,19 @@ async fn initial_setup() -> Option<RustlsConfig> {
99107
std::process::exit(0);
100108
}
101109

110+
if args.generate_jwt_token != "" {
111+
let token_r = storjwt::generate_jwt_token(&args.generate_jwt_token);
112+
let token = match token_r {
113+
Ok(token) => token,
114+
Err(e) => {
115+
eprintln!("Error generating JWT token: {}", e);
116+
std::process::exit(1);
117+
}
118+
};
119+
println!("JWT token: {}", token);
120+
std::process::exit(0);
121+
}
122+
102123
if let Err(e) = std::env::set_current_dir(&args.files_directory) {
103124
eprintln!("Error changing directory: {}", e);
104125
std::process::exit(1);

src/storjwt.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::Args;
22
use clap::Parser;
33
use hmac::{Hmac, Mac};
4-
use jwt::{Header, Token, VerifyWithKey};
4+
use jwt::{Header, Token, VerifyWithKey, SignWithKey};
55
use sha2::Sha256;
66
use std::collections::BTreeMap;
77
use toml::value::Table;
8-
8+
use rand::{distributions::Alphanumeric, Rng};
99
pub fn verify_jwt_token(token_str: &str) -> Result<BTreeMap<String, String>, jwt::Error> {
1010
// config.toml, jwt_secret parameter
1111
let args = Args::parse();
@@ -48,3 +48,16 @@ pub fn generate_jwt_secret() {
4848
.collect();
4949
println!("jwt_secret=\"{}\"", secret);
5050
}
51+
52+
pub fn generate_jwt_token(email: &str) -> Result<String, jwt::Error> {
53+
let args = Args::parse();
54+
let cfg_file = args.config_file;
55+
let toml_cfg = std::fs::read_to_string(&cfg_file).unwrap();
56+
let parsed_toml = toml_cfg.parse::<Table>().unwrap();
57+
let key_str = parsed_toml["jwt_secret"].as_str().unwrap();
58+
let key: Hmac<Sha256> = Hmac::new_from_slice(key_str.as_bytes())?;
59+
let mut claims = BTreeMap::new();
60+
claims.insert("email".to_string(), email.to_string());
61+
let token_str = claims.sign_with_key(&key)?;
62+
Ok(token_str)
63+
}

0 commit comments

Comments
 (0)