Initial commit: interaction with OVH API
Signed-off-by: Louis Vallat <louis@louis-vallat.xyz>
This commit is contained in:
commit
0091f148b5
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
*.lock
|
18
Cargo.toml
Normal file
18
Cargo.toml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
[package]
|
||||||
|
name = "tlsa"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
inotify = "0.10"
|
||||||
|
hyper = { version = "0.14", features = ["full"] }
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
tokio-test = "0.4.2"
|
||||||
|
hyper-tls = "0.5.0"
|
||||||
|
cookie = "0.15.1"
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = "1"
|
||||||
|
sha1 = { version = "0.6", features = ["std"] }
|
||||||
|
|
37
src/main.rs
Normal file
37
src/main.rs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
use std::time::{UNIX_EPOCH, SystemTime};
|
||||||
|
use hyper_tls::HttpsConnector;
|
||||||
|
use hyper::{Client, Method};
|
||||||
|
use serde_json::json;
|
||||||
|
use crate::utils::{body_to_str, build_request};
|
||||||
|
|
||||||
|
mod utils;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let client = Client::builder().build::<_, hyper::Body>(HttpsConnector::new());
|
||||||
|
let application_key = "";
|
||||||
|
let application_secret = "";
|
||||||
|
let consumer_key = "";
|
||||||
|
|
||||||
|
let req = build_request(application_key, application_secret, consumer_key,
|
||||||
|
&Method::GET, "https://eu.api.ovh.com/1.0/auth/time", "", 0);
|
||||||
|
let res = client.request(req).await.unwrap();
|
||||||
|
let s = res.status();
|
||||||
|
assert!(s.is_success());
|
||||||
|
let b = body_to_str(res.into_body()).await.parse::<i64>().unwrap();
|
||||||
|
let delta = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() as i64 - b;
|
||||||
|
println!("Delta is {}", delta);
|
||||||
|
|
||||||
|
let req = build_request(application_key, application_secret, consumer_key,
|
||||||
|
&Method::GET, "https://eu.api.ovh.com/1.0/domain/zone/{zone}/", "", delta);
|
||||||
|
let res = client.request(req).await.unwrap();
|
||||||
|
println!("{} - {}", res.status(), body_to_str(res.into_body()).await);
|
||||||
|
|
||||||
|
|
||||||
|
let req = build_request(application_key, application_secret, consumer_key,
|
||||||
|
&Method::POST, "https://eu.api.ovh.com/1.0/domain/zone/{zone}/record",
|
||||||
|
&json!({"fieldType" : "TXT", "subDomain": "XXXXXX", "target": "XXXXXXXXXXXXXXX"}).to_string(), delta);
|
||||||
|
let res = client.request(req).await.unwrap();
|
||||||
|
println!("{} - {}", res.status(), body_to_str(res.into_body()).await);
|
||||||
|
}
|
||||||
|
|
31
src/utils.rs
Normal file
31
src/utils.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
use std::time::{UNIX_EPOCH, SystemTime};
|
||||||
|
use hyper::{Request, Method, Body, body};
|
||||||
|
|
||||||
|
pub async fn body_to_str(res: Body) -> String {
|
||||||
|
return String::from_utf8(body::to_bytes(res).await.unwrap().to_vec()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_signature(app_secret: &str, consumer_key: &str, method: &Method,
|
||||||
|
query: &str, body: &str, delta: i64) -> String {
|
||||||
|
let stringapi = format!("{}+{}+{}+{}+{}+{}", app_secret, consumer_key,
|
||||||
|
method.as_str(), query, body,
|
||||||
|
SystemTime::now().duration_since(UNIX_EPOCH)
|
||||||
|
.unwrap().as_secs() as i64 + delta);
|
||||||
|
return format!("$1${}", sha1::Sha1::from(stringapi).hexdigest());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build_request(app_key: &str, app_secret: &str, consumer_key: &str,
|
||||||
|
method: &Method, uri: &str, body: &str, delta: i64) -> Request<Body> {
|
||||||
|
return Request::builder()
|
||||||
|
.method(method)
|
||||||
|
.uri(uri)
|
||||||
|
.header("X-Ovh-Application", app_key)
|
||||||
|
.header("X-Ovh-Timestamp", SystemTime::now().duration_since(UNIX_EPOCH)
|
||||||
|
.unwrap().as_secs() as i64 + delta)
|
||||||
|
.header("X-Ovh-Consumer", consumer_key)
|
||||||
|
.header("X-Ovh-Signature", get_signature(app_secret, consumer_key, method,
|
||||||
|
uri, body, delta))
|
||||||
|
.header("Content-Type", "application/json;charset=utf-8")
|
||||||
|
.body(Body::from(body.to_string()))
|
||||||
|
.expect("Build");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user