Compare commits
8 Commits
up-session
...
127-no-suc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e7f1c7e4e | ||
|
|
0732a0bbad | ||
|
|
b5673001ca | ||
|
|
81829c1523 | ||
|
|
b9d2b8374f | ||
|
|
5716784f5d | ||
|
|
b6ddc720d8 | ||
|
|
5438e53361 |
@@ -9,7 +9,7 @@ homepage = "https://github.com/cocool97/adb_client"
|
||||
keywords = ["adb", "android", "tcp", "usb"]
|
||||
license = "MIT"
|
||||
repository = "https://github.com/cocool97/adb_client"
|
||||
version = "2.1.13"
|
||||
version = "2.1.15"
|
||||
|
||||
# To build locally when working on a new release
|
||||
[patch.crates-io]
|
||||
|
||||
@@ -14,7 +14,7 @@ base64 = { version = "0.22.1" }
|
||||
bincode = { version = "1.3.3" }
|
||||
byteorder = { version = "1.5.0" }
|
||||
chrono = { version = "0.4.40", default-features = false, features = ["std"] }
|
||||
homedir = { version = "0.3.4" }
|
||||
homedir = { version = "= 0.3.4" }
|
||||
image = { version = "0.25.5", default-features = false }
|
||||
log = { version = "0.4.26" }
|
||||
mdns-sd = { version = "0.13.9", default-features = false, features = [
|
||||
|
||||
@@ -19,19 +19,24 @@ use crate::device::adb_transport_message::{AUTH_RSAPUBLICKEY, AUTH_SIGNATURE, AU
|
||||
use crate::{Result, RustADBError, USBTransport};
|
||||
|
||||
pub fn read_adb_private_key<P: AsRef<Path>>(private_key_path: P) -> Result<Option<ADBRsaKey>> {
|
||||
Ok(read_to_string(private_key_path.as_ref()).map(|pk| {
|
||||
match ADBRsaKey::new_from_pkcs8(&pk) {
|
||||
Ok(pk) => Some(pk),
|
||||
Err(e) => {
|
||||
log::error!("Error while create RSA private key: {e}");
|
||||
None
|
||||
}
|
||||
}
|
||||
})?)
|
||||
// Try to read the private key file from given path
|
||||
// If the file is not found, return None
|
||||
// If there is another error while reading the file, return this error
|
||||
// Else, return the private key content
|
||||
let pk = match read_to_string(private_key_path.as_ref()) {
|
||||
Ok(pk) => pk,
|
||||
Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(None),
|
||||
Err(e) => return Err(e.into()),
|
||||
};
|
||||
|
||||
match ADBRsaKey::new_from_pkcs8(&pk) {
|
||||
Ok(pk) => Ok(Some(pk)),
|
||||
Err(e) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
/// Search for adb devices with known interface class and subclass values
|
||||
fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
||||
pub fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
||||
let mut found_devices = vec![];
|
||||
for device in rusb::devices()?.iter() {
|
||||
let Ok(des) = device.device_descriptor() else {
|
||||
@@ -57,7 +62,8 @@ fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
||||
}
|
||||
}
|
||||
|
||||
fn is_adb_device<T: UsbContext>(device: &Device<T>, des: &DeviceDescriptor) -> bool {
|
||||
/// Check whether a device with given descriptor is an ADB device
|
||||
pub fn is_adb_device<T: UsbContext>(device: &Device<T>, des: &DeviceDescriptor) -> bool {
|
||||
const ADB_SUBCLASS: u8 = 0x42;
|
||||
const ADB_PROTOCOL: u8 = 0x1;
|
||||
|
||||
@@ -134,9 +140,15 @@ impl ADBUSBDevice {
|
||||
transport: USBTransport,
|
||||
private_key_path: PathBuf,
|
||||
) -> Result<Self> {
|
||||
let private_key = match read_adb_private_key(private_key_path)? {
|
||||
let private_key = match read_adb_private_key(&private_key_path)? {
|
||||
Some(pk) => pk,
|
||||
None => ADBRsaKey::new_random()?,
|
||||
None => {
|
||||
log::warn!(
|
||||
"No private key found at path {}. Using a temporary random one.",
|
||||
private_key_path.display()
|
||||
);
|
||||
ADBRsaKey::new_random()?
|
||||
}
|
||||
};
|
||||
|
||||
let mut s = Self {
|
||||
@@ -180,6 +192,11 @@ impl ADBUSBDevice {
|
||||
self.get_transport_mut().write_message(message)?;
|
||||
|
||||
let message = self.get_transport_mut().read_message()?;
|
||||
// If the device returned CNXN instead of AUTH it does not require authentication,
|
||||
// so we can skip the auth steps.
|
||||
if message.header().command() == MessageCommand::Cnxn {
|
||||
return Ok(());
|
||||
}
|
||||
message.assert_command(MessageCommand::Auth)?;
|
||||
|
||||
// At this point, we should have receive an AUTH message with arg0 == 1
|
||||
|
||||
@@ -35,10 +35,10 @@ impl<T: ADBMessageTransport> Write for MessageWriter<T> {
|
||||
Ok(response) => {
|
||||
response
|
||||
.assert_command(MessageCommand::Okay)
|
||||
.map_err(|e| Error::new(ErrorKind::Other, e))?;
|
||||
.map_err(Error::other)?;
|
||||
Ok(buf.len())
|
||||
}
|
||||
Err(e) => Err(Error::new(ErrorKind::Other, e)),
|
||||
Err(e) => Err(Error::other(e)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,9 @@ mod shell_message_writer;
|
||||
use adb_message_device::ADBMessageDevice;
|
||||
pub use adb_tcp_device::ADBTcpDevice;
|
||||
pub use adb_transport_message::{ADBTransportMessage, ADBTransportMessageHeader};
|
||||
pub use adb_usb_device::{ADBUSBDevice, get_default_adb_key_path};
|
||||
pub use adb_usb_device::{
|
||||
ADBUSBDevice, get_default_adb_key_path, is_adb_device, search_adb_devices,
|
||||
};
|
||||
pub use message_writer::MessageWriter;
|
||||
pub use models::{ADBRsaKey, MessageCommand, MessageSubcommand};
|
||||
pub use shell_message_writer::ShellMessageWriter;
|
||||
|
||||
@@ -17,7 +17,7 @@ mod transports;
|
||||
mod utils;
|
||||
|
||||
pub use adb_device_ext::ADBDeviceExt;
|
||||
pub use device::{ADBTcpDevice, ADBUSBDevice};
|
||||
pub use device::{ADBTcpDevice, ADBUSBDevice, is_adb_device, search_adb_devices};
|
||||
pub use emulator_device::ADBEmulatorDevice;
|
||||
pub use error::{Result, RustADBError};
|
||||
pub use mdns::*;
|
||||
|
||||
@@ -42,18 +42,15 @@ impl<R: Read> Read for ADBRecvCommandReader<R> {
|
||||
let mut error_msg = vec![0; length];
|
||||
self.inner.read_exact(&mut error_msg)?;
|
||||
|
||||
Err(std::io::Error::new(
|
||||
std::io::ErrorKind::Other,
|
||||
format!(
|
||||
"ADB request failed: {}",
|
||||
String::from_utf8_lossy(&error_msg)
|
||||
),
|
||||
))
|
||||
Err(std::io::Error::other(format!(
|
||||
"ADB request failed: {}",
|
||||
String::from_utf8_lossy(&error_msg)
|
||||
)))
|
||||
}
|
||||
_ => Err(std::io::Error::new(
|
||||
std::io::ErrorKind::Other,
|
||||
format!("Unknown response from device {:#?}", header),
|
||||
)),
|
||||
_ => Err(std::io::Error::other(format!(
|
||||
"Unknown response from device {:#?}",
|
||||
header
|
||||
))),
|
||||
}
|
||||
} else {
|
||||
// Computing minimum to ensure to stop reading before next header...
|
||||
|
||||
Reference in New Issue
Block a user