Skip to content

Commit 9ac5b55

Browse files
committed
wip
1 parent 81b06cc commit 9ac5b55

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ pretty_assertions = "1.4.0"
162162
derive-new = "0.7.0"
163163
diesel-bind-if-some = "0.1.0"
164164
tuplex = "0.1.2"
165+
sha2 = "0.10.8"
165166

166167
[dependencies]
167168
lemmy_api = { workspace = true }

crates/api_crud/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ accept-language = "3.1.0"
3333
serde_json = { workspace = true }
3434
serde = { workspace = true }
3535
serde_with = { workspace = true }
36+
sha2 = { workspace = true }
37+
base64 = { workspace = true }
3638

3739
[package.metadata.cargo-shear]
3840
ignored = ["futures"]

crates/api_crud/src/user/create.rs

+18-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use activitypub_federation::{config::Data, http_signatures::generate_actor_keypair};
22
use actix_web::{web::Json, HttpRequest};
3+
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
34
use lemmy_api_common::{
45
claims::Claims,
56
context::LemmyContext,
@@ -47,7 +48,8 @@ use lemmy_utils::{
4748
};
4849
use serde::{Deserialize, Serialize};
4950
use serde_with::skip_serializing_none;
50-
use std::collections::HashSet;
51+
use sha2::{Digest, Sha256};
52+
use std::{collections::HashSet, iter};
5153

5254
#[skip_serializing_none]
5355
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
@@ -524,27 +526,37 @@ async fn oauth_request_access_token(
524526
pkce_code_verifier: Option<&str>,
525527
redirect_uri: &str,
526528
) -> LemmyResult<TokenResponse> {
527-
let mut form = vec![
529+
let form = [
528530
("grant_type", "authorization_code"),
529531
("code", code),
530532
("redirect_uri", redirect_uri),
531533
("client_id", &oauth_provider.client_id),
532534
("client_secret", &oauth_provider.client_secret),
533535
];
534-
if let Some(code_verifier) = pkce_code_verifier {
535-
form.push(("code_verifier", code_verifier));
536-
}
536+
537+
let digest = pkce_code_verifier.map(str::as_bytes).map(Sha256::digest);
538+
let code_verifier = digest.map(|input| URL_SAFE_NO_PAD.encode(input));
539+
540+
let form = match code_verifier.as_deref() {
541+
Some(code_verifier) => [&form[..], &[("code_verifier", code_verifier)]].concat(),
542+
None => form.to_vec(),
543+
};
537544

538545
// Request an Access Token from the OAUTH provider
539546
let response = context
540547
.client()
541548
.post(oauth_provider.token_endpoint.as_str())
542549
.header("Accept", "application/json")
543-
.form(&*form)
550+
.form(&form[..])
544551
.send()
545552
.await;
546553

547554
let response = response.map_err(|_| LemmyErrorType::OauthLoginFailed)?;
555+
dbg!(
556+
response.status(),
557+
response.headers(),
558+
response.error_for_status_ref()
559+
);
548560
if !response.status().is_success() {
549561
Err(LemmyErrorType::OauthLoginFailed)?;
550562
}

0 commit comments

Comments
 (0)