pub struct GrantLoginWithQrCodeBuilder<'a> { /* private fields */ }e2e-encryption only.Expand description
Builder for QR login grant handlers.
Implementations§
Source§impl<'a> GrantLoginWithQrCodeBuilder<'a>
impl<'a> GrantLoginWithQrCodeBuilder<'a>
Sourcepub fn device_creation_timeout(self, device_creation_timeout: Duration) -> Self
pub fn device_creation_timeout(self, device_creation_timeout: Duration) -> Self
Set the device creation timeout.
§Arguments
device_creation_timeout- The duration to wait for the homeserver to create the new device after consenting the login before giving up.
Sourcepub fn scan(self, data: &'a QrCodeData) -> GrantLoginWithScannedQrCode<'a>
pub fn scan(self, data: &'a QrCodeData) -> GrantLoginWithScannedQrCode<'a>
This method allows you to grant login to a new device by scanning a QR code generated by the new device.
The new device needs to display the QR code which this device can scan and call this method to grant the login.
A successful login grant using this method will automatically mark the new device as verified and transfer all end-to-end encryption related secrets, like the private cross-signing keys and the backup key from this device device to the new device.
For the reverse flow where this device generates the QR code
for the new device to scan, use
GrantLoginWithQrCodeBuilder::generate.
§Arguments
data- The data scanned from a QR code.
§Example
use anyhow::bail;
use futures_util::StreamExt;
use matrix_sdk::{
Client, authentication::oauth::{
qrcode::{GrantLoginProgress, QrCodeData, QrCodeModeData, QrProgress},
}
};
use std::{error::Error, io::stdin};
// You'll need to use a different library to scan and extract the raw bytes from the QR
// code.
let qr_code_data = QrCodeData::from_bytes(bytes)?;
// Build the client as usual.
let client = Client::builder()
.server_name_or_homeserver_url("matrix.org")
.handle_refresh_tokens()
.build()
.await?;
let oauth = client.oauth();
// Subscribing to the progress is necessary to capture
// the checkcode in order to display it to the other device and to obtain the verification URL to
// open it in a browser so the user can consent to the new login.
let mut grant = oauth.grant_login_with_qr_code().scan(&qr_code_data);
let mut progress = grant.subscribe_to_progress();
// Create a task which will show us the progress and allows us to receive
// and feed back data.
let task = tokio::spawn(async move {
while let Some(state) = progress.next().await {
match state {
GrantLoginProgress::Starting | GrantLoginProgress::SyncingSecrets => (),
GrantLoginProgress::EstablishingSecureChannel(QrProgress { check_code }) => {
println!("Please enter the checkcode on your other device: {:?}", check_code);
}
GrantLoginProgress::WaitingForAuth { verification_uri } => {
println!("Please open {verification_uri} to confirm the new login")
},
GrantLoginProgress::Done => break,
}
}
Ok::<(), Box<dyn Error + Send + Sync>>(())
});
// Now run the future to grant the login.
grant.await?;
task.abort();
println!("Successfully granted login");Sourcepub fn generate(self) -> GrantLoginWithGeneratedQrCode<'a>
pub fn generate(self) -> GrantLoginWithGeneratedQrCode<'a>
This method allows you to grant login to a new device by generating a QR code on this device to be scanned by the new device.
This device needs to call this method to generate and display the QR code which the new device can scan to initiate the grant process.
A successful login grant using this method will automatically mark the new device as verified and transfer all end-to-end encryption related secrets, like the private cross-signing keys and the backup key from this device device to the new device.
For the reverse flow where the new device generates the QR code
for this device to scan, use GrantLoginWithQrCodeBuilder::scan.
§Example
use anyhow::bail;
use futures_util::StreamExt;
use matrix_sdk::{
Client, authentication::oauth::{
qrcode::{GeneratedQrProgress, GrantLoginProgress}
}
};
use std::{error::Error, io::stdin};
// Build the client as usual.
let client = Client::builder()
.server_name_or_homeserver_url("matrix.org")
.handle_refresh_tokens()
.build()
.await?;
let oauth = client.oauth();
// Subscribing to the progress is necessary since we need to capture the
// QR code, feed the checkcode back in and obtain the verification URL to
// open it in a browser so the user can consent to the new login.
let mut grant = oauth.grant_login_with_qr_code().generate();
let mut progress = grant.subscribe_to_progress();
// Create a task which will show us the progress and allows us to receive
// and feed back data.
let task = tokio::spawn(async move {
while let Some(state) = progress.next().await {
match state {
GrantLoginProgress::Starting | GrantLoginProgress::SyncingSecrets => (),
GrantLoginProgress::EstablishingSecureChannel(GeneratedQrProgress::QrReady(qr_code_data)) => {
println!("Please scan the QR code on your other device: {:?}", qr_code_data);
}
GrantLoginProgress::EstablishingSecureChannel(GeneratedQrProgress::QrScanned(checkcode_sender)) => {
println!("Please enter the code displayed on your other device");
let mut s = String::new();
stdin().read_line(&mut s)?;
let check_code = s.trim().parse::<u8>()?;
checkcode_sender.send(check_code).await?;
}
GrantLoginProgress::WaitingForAuth { verification_uri } => {
println!("Please open {verification_uri} to confirm the new login")
},
GrantLoginProgress::Done => break,
}
}
Ok::<(), Box<dyn Error + Send + Sync>>(())
});
// Now run the future to grant the login.
grant.await?;
task.abort();
println!("Successfully granted login");Trait Implementations§
Auto Trait Implementations§
impl<'a> Freeze for GrantLoginWithQrCodeBuilder<'a>
impl<'a> !RefUnwindSafe for GrantLoginWithQrCodeBuilder<'a>
impl<'a> Send for GrantLoginWithQrCodeBuilder<'a>
impl<'a> Sync for GrantLoginWithQrCodeBuilder<'a>
impl<'a> Unpin for GrantLoginWithQrCodeBuilder<'a>
impl<'a> !UnwindSafe for GrantLoginWithQrCodeBuilder<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more