|
1 | 1 | use activitypub_federation::{config::Data, http_signatures::generate_actor_keypair};
|
2 | 2 | use actix_web::{web::Json, HttpRequest};
|
| 3 | +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; |
3 | 4 | use lemmy_api_common::{
|
4 | 5 | claims::Claims,
|
5 | 6 | context::LemmyContext,
|
@@ -47,7 +48,8 @@ use lemmy_utils::{
|
47 | 48 | };
|
48 | 49 | use serde::{Deserialize, Serialize};
|
49 | 50 | use serde_with::skip_serializing_none;
|
50 |
| -use std::collections::HashSet; |
| 51 | +use sha2::{Digest, Sha256}; |
| 52 | +use std::{collections::HashSet, iter}; |
51 | 53 |
|
52 | 54 | #[skip_serializing_none]
|
53 | 55 | #[derive(Debug, Serialize, Deserialize, Clone, Default)]
|
@@ -524,27 +526,37 @@ async fn oauth_request_access_token(
|
524 | 526 | pkce_code_verifier: Option<&str>,
|
525 | 527 | redirect_uri: &str,
|
526 | 528 | ) -> LemmyResult<TokenResponse> {
|
527 |
| - let mut form = vec![ |
| 529 | + let form = [ |
528 | 530 | ("grant_type", "authorization_code"),
|
529 | 531 | ("code", code),
|
530 | 532 | ("redirect_uri", redirect_uri),
|
531 | 533 | ("client_id", &oauth_provider.client_id),
|
532 | 534 | ("client_secret", &oauth_provider.client_secret),
|
533 | 535 | ];
|
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 | + }; |
537 | 544 |
|
538 | 545 | // Request an Access Token from the OAUTH provider
|
539 | 546 | let response = context
|
540 | 547 | .client()
|
541 | 548 | .post(oauth_provider.token_endpoint.as_str())
|
542 | 549 | .header("Accept", "application/json")
|
543 |
| - .form(&*form) |
| 550 | + .form(&form[..]) |
544 | 551 | .send()
|
545 | 552 | .await;
|
546 | 553 |
|
547 | 554 | let response = response.map_err(|_| LemmyErrorType::OauthLoginFailed)?;
|
| 555 | + dbg!( |
| 556 | + response.status(), |
| 557 | + response.headers(), |
| 558 | + response.error_for_status_ref() |
| 559 | + ); |
548 | 560 | if !response.status().is_success() {
|
549 | 561 | Err(LemmyErrorType::OauthLoginFailed)?;
|
550 | 562 | }
|
|
0 commit comments