Sending your ip as part of peer_connection.rs

This commit is contained in:
Igor Katson 2024-08-31 11:35:26 +01:00
parent e9acbaa9dc
commit 3f014ee80a
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
3 changed files with 17 additions and 12 deletions

View file

@ -14,7 +14,10 @@ use librqbit_core::{
}; };
use parking_lot::RwLock; use parking_lot::RwLock;
use peer_binary_protocol::{ use peer_binary_protocol::{
extended::{handshake::ExtendedHandshake, ExtendedMessage}, extended::{
handshake::{ExtendedHandshake, YourIP},
ExtendedMessage,
},
serialize_piece_preamble, Handshake, Message, MessageOwned, PIECE_MESSAGE_DEFAULT_LEN, serialize_piece_preamble, Handshake, Message, MessageOwned, PIECE_MESSAGE_DEFAULT_LEN,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -248,6 +251,7 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
if supports_extended { if supports_extended {
let mut my_extended = ExtendedHandshake::new(); let mut my_extended = ExtendedHandshake::new();
my_extended.v = Some(ByteBuf(crate::client_name_and_version().as_bytes())); my_extended.v = Some(ByteBuf(crate::client_name_and_version().as_bytes()));
my_extended.yourip = Some(YourIP(self.addr.ip()));
self.handler self.handler
.update_my_extended_handshake(&mut my_extended)?; .update_my_extended_handshake(&mut my_extended)?;
let my_extended = Message::Extended(ExtendedMessage::Handshake(my_extended)); let my_extended = Message::Extended(ExtendedMessage::Handshake(my_extended));

View file

@ -56,14 +56,18 @@ impl ReadBuf {
if self.filled == 0 { if self.filled == 0 {
anyhow::bail!("peer disconnected while reading handshake"); anyhow::bail!("peer disconnected while reading handshake");
} }
let (h, size) = Handshake::deserialize(&self.buf[..self.filled]) let (h, size) = Handshake::deserialize(&self.buf[..self.filled]).map_err(|e| {
.map_err(|e| anyhow::anyhow!("error deserializing handshake: {:?} hadshake data {:?}", e, &self.buf[..self.filled.min(19)]))?; anyhow::anyhow!(
"error deserializing handshake: {:?} hadshake data {:?}",
e,
&self.buf[..self.filled.min(19)]
)
})?;
self.processed = size; self.processed = size;
Ok(h) Ok(h)
} }
// Read a message into the buffer, try to deserialize it and call the callback on it. // Read a message into the buffer, try to deserialize it and call the callback on it.
// We can't return the message because of a borrow checker issue.
pub async fn read_message( pub async fn read_message(
&mut self, &mut self,
mut conn: impl AsyncReadExt + Unpin, mut conn: impl AsyncReadExt + Unpin,
@ -77,13 +81,15 @@ impl ReadBuf {
self.processed += size; self.processed += size;
// Rust's borrow checker can't do this early return so resort to unsafe. // Rust's borrow checker can't do this early return so resort to unsafe.
#[allow(clippy::missing_transmute_annotations)] // This erases the lifetime so that it's happy.
let msg = unsafe { std::mem::transmute(msg) }; let msg: MessageBorrowed<'_> =
unsafe { std::mem::transmute(msg as MessageBorrowed<'_>) };
return Ok(msg); return Ok(msg);
} }
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),
}; };
self.prepare_for_read(need_additional_bytes); self.prepare_for_read(need_additional_bytes);
debug_assert!(!self.buf[self.filled..].is_empty());
let size = with_timeout(timeout, conn.read(&mut self.buf[self.filled..])) let size = with_timeout(timeout, conn.read(&mut self.buf[self.filled..]))
.await .await
.context("error reading from peer")?; .context("error reading from peer")?;

View file

@ -68,10 +68,7 @@ use librqbit_core::{
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use peer_binary_protocol::{ use peer_binary_protocol::{
extended::{ extended::{
handshake::{ExtendedHandshake, YourIP}, handshake::ExtendedHandshake, ut_metadata::UtMetadata, ut_pex::UtPex, ExtendedMessage,
ut_metadata::UtMetadata,
ut_pex::UtPex,
ExtendedMessage,
}, },
Handshake, Message, MessageOwned, Piece, Request, Handshake, Message, MessageOwned, Piece, Request,
}; };
@ -948,8 +945,6 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
&self, &self,
handshake: &mut ExtendedHandshake<ByteBuf>, handshake: &mut ExtendedHandshake<ByteBuf>,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let your_ip = self.addr.ip();
handshake.yourip = Some(YourIP(your_ip));
let info_bytes = &self.state.torrent().info_bytes; let info_bytes = &self.state.torrent().info_bytes;
if !info_bytes.is_empty() { if !info_bytes.is_empty() {
if let Ok(len) = info_bytes.len().try_into() { if let Ok(len) = info_bytes.len().try_into() {