hangups-rs

Rust version of hangups (WIP) Currently Login not possible
git clone git://archive.git.mtrnord.blog/Nordgedanken/hangups-rs.git
Log | Files | Refs | README | LICENSE

commit b54e35f960f78cd09030f573f3f6c06ae98c60b2
parent e2e2bad3bce7ca43b0087ae8de448a27baa48855
Author: MTRNord <mtrnord1@gmail.com>
Date:   Thu, 13 Apr 2017 10:53:38 +0200

cleanup code structure

Diffstat:
M.gitignore | 2+-
MCargo.toml | 2--
Asrc/hangups/mod.rs | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/lib.rs | 105++++++-------------------------------------------------------------------------
4 files changed, 102 insertions(+), 100 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -8,4 +8,4 @@ Cargo.lock target/ **/*.rs.bk Cargo.lock -src/proto/**/* +src/hangups/proto/**/* diff --git a/Cargo.toml b/Cargo.toml @@ -7,7 +7,5 @@ authors = ["MTRNord"] yup-oauth2 = "1.0.5" hyper = "0.10.2" hyper-native-tls = "0.2.2" -serde = "0.9" -serde_json = "0.9" protobuf = "1.2.2" rand = "0.3" diff --git a/src/hangups/mod.rs b/src/hangups/mod.rs @@ -0,0 +1,93 @@ +#[path = "proto/hangouts.rs"] mod hangouts; + +pub mod hangups { + use hangups::hangouts::{MessageContent, Segment, SegmentType, RequestHeader, EventRequestHeader, + SendChatMessageRequest, DeliveryMediumType, OffTheRecordStatus, + EventType, SendChatMessageResponse, DeliveryMedium, ConversationId}; + use protobuf::RepeatedField; + use rand::random; + use hyper::header::Headers; + use hyper::header::Cookie; + use hyper::client::Client; + header! { (ContentType, "content-type") => [String] } + header! { + (XGoogEncodeResponseIfExecutable, "X-Goog-Encode-Response-If-Executable") => [String] + } + + fn get_auth_headers() {} + + fn api_request(endpoint_url: String, + content_type: String, + cookies: String, + payload: SendChatMessageRequest) { + let mut headers = Headers::new(); + headers.set(Cookie(vec![String::from(cookies.to_owned())])); + headers.set(ContentType(String::from(content_type.to_owned()))); + headers.set(XGoogEncodeResponseIfExecutable(String::from("base64".to_owned()))); + let client = Client::new(); + let post_request = client.post(&*endpoint_url).headers(headers); + } + + fn protobuf_api_request(api_endpoint: String, + request_struct: SendChatMessageRequest, + response_struct: SendChatMessageResponse) { + let url = format!("https://clients6.google.com/chat/v1/{}", api_endpoint); + let output = api_request(url, + String::from("application/x-protobuf"), + String::from("proto"), + request_struct); + } + + pub fn send_message(message: String, conv_id_raw: String) { + //Prepare message + let segment_type = SegmentType::SEGMENT_TYPE_TEXT; + let mut segment_raw = Segment::new(); + segment_raw.set_field_type(segment_type); + segment_raw.set_text(message); + let mut segment = RepeatedField::new(); + segment.push(segment_raw); + let mut message_content = MessageContent::new(); + message_content.set_segment(segment); + + + //Prepare Request + let mut request_header = RequestHeader::new(); + request_header.set_language_code(String::from("en")); + + let mut delivery_medium = DeliveryMedium::new(); + delivery_medium.set_medium_type(DeliveryMediumType::DELIVERY_MEDIUM_BABEL); + let expected_otr = OffTheRecordStatus::OFF_THE_RECORD_STATUS_ON_THE_RECORD; + let client_generated_id = random::<u64>(); + let event_type = EventType::EVENT_TYPE_REGULAR_CHAT_MESSAGE; + let mut event_request_header = EventRequestHeader::new(); + let mut conv_id = ConversationId::new(); + conv_id.set_id(conv_id_raw); + event_request_header.set_conversation_id(conv_id); + event_request_header.set_delivery_medium(delivery_medium); + event_request_header.set_expected_otr(expected_otr); + event_request_header.set_client_generated_id(client_generated_id); + event_request_header.set_event_type(event_type); + + let mut request = SendChatMessageRequest::new(); + request.set_request_header(request_header); + request.set_message_content(message_content); + request.set_event_request_header(event_request_header); + + //Prepare response + let response = SendChatMessageResponse::new(); + + let err = protobuf_api_request(String::from("conversations/sendchatmessage"), request, response); + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_send_message() { + use super::hangups::send_message; + + let test_message = String::from("TEST!"); + let test_conv = String::from("Ugxu9JRlbNPSqk5Ye1V4AaABAQ"); + send_message(test_message, test_conv); + } +} diff --git a/src/lib.rs b/src/lib.rs @@ -1,9 +1,8 @@ +#![allow(unused_variables)] #[macro_use] extern crate hyper; extern crate hyper_native_tls; extern crate yup_oauth2 as oauth2; -extern crate serde; -extern crate serde_json; extern crate protobuf; extern crate rand; @@ -13,7 +12,7 @@ pub mod auth { use hyper::net::HttpsConnector; use hyper_native_tls::NativeTlsClient; use oauth2::{Authenticator, DefaultAuthenticatorDelegate, MemoryStorage, GetToken, - ApplicationSecret}; + ApplicationSecret, FlowType}; use std::io::{stdin, stdout, Write}; let ssl = NativeTlsClient::new().unwrap(); @@ -24,7 +23,7 @@ pub mod auth { let client_secret = String::from("KWsJlkaMn1jGLxQpWxMnOox-"); let token_uri = String::from("https://accounts.google.com/o/oauth2/token"); let auth_uri = String::from("https://accounts.google.com/o/oauth2/programmatic_auth"); - let redirect_uri = String::from(""); + let redirect_uri = String::from("urn:ietf:wg:oauth:2.0:oob"); if client_email == String::from("") { let mut client_email = String::new(); println!("Please enter Google Email: "); @@ -48,7 +47,7 @@ pub mod auth { auth_uri: auth_uri, redirect_uris: vec![redirect_uri], project_id: None, - client_email: None, + client_email: Some(client_email), auth_provider_x509_cert_url: None, client_x509_cert_url: None, }; @@ -56,12 +55,12 @@ pub mod auth { DefaultAuthenticatorDelegate, client, <MemoryStorage as Default>::default(), - None) - .token(&["https://www.googleapis.com/auth/userinfo.email"]); + Some(FlowType::InstalledInteractive)) + .token(&["https://www.google.com/accounts/OAuthLogin", "https://www.googleapis.com/auth/userinfo.email"]); match res { Ok(t) => { println!("Acquired access_token: {}", t.access_token); - println!("Acquired access_token: {}", t.refresh_token); + println!("Acquired refresh_token: {}", t.refresh_token); } Err(err) => println!("Failed to acquire token: {}", err), } @@ -69,85 +68,7 @@ pub mod auth { } } -#[path = "."] -pub mod hangups { - #[path = "proto/hangouts.rs"] mod hangouts; - use self::hangouts::{MessageContent, Segment, SegmentType, RequestHeader, EventRequestHeader, - SendChatMessageRequest, DeliveryMediumType, OffTheRecordStatus, - EventType, SendChatMessageResponse, DeliveryMedium, ConversationId}; - use protobuf::RepeatedField; - use rand::random; - use hyper::header::Headers; - use hyper::header::Cookie; - use hyper::client::Client; - header! { (ContentType, "content-type") => [String] } - header! { - (XGoogEncodeResponseIfExecutable, "X-Goog-Encode-Response-If-Executable") => [String] - } - - fn get_auth_headers() {} - - fn api_request(endpoint_url: String, - content_type: String, - cookies: String, - payload: SendChatMessageRequest) { - let mut headers = Headers::new(); - headers.set(Cookie(vec![String::from(cookies.to_owned())])); - headers.set(ContentType(String::from(content_type.to_owned()))); - headers.set(XGoogEncodeResponseIfExecutable(String::from("base64".to_owned()))); - let client = Client::new(); - let post_request = client.post(&*endpoint_url).headers(headers); - } - - fn protobuf_api_request(api_endpoint: String, - request_struct: SendChatMessageRequest, - response_struct: SendChatMessageResponse) { - let url = format!("https://clients6.google.com/chat/v1/{}", api_endpoint); - let output = api_request(url, - String::from("application/x-protobuf"), - String::from("proto"), - request_struct); - } - - pub fn send_message(message: String, conv_id_raw: String) { - //Prepare message - let segment_type = SegmentType::SEGMENT_TYPE_TEXT; - let mut segment_raw = Segment::new(); - segment_raw.set_field_type(segment_type); - segment_raw.set_text(message); - let mut segment = RepeatedField::new(); - segment.push(segment_raw); - let mut message_content = MessageContent::new(); - message_content.set_segment(segment); - - - //Prepare Request - let mut request_header = RequestHeader::new(); - request_header.set_language_code(String::from("en")); - - let mut delivery_medium = DeliveryMedium::new(); - delivery_medium.set_medium_type(DeliveryMediumType::DELIVERY_MEDIUM_BABEL); - let expected_otr = OffTheRecordStatus::OFF_THE_RECORD_STATUS_ON_THE_RECORD; - let client_generated_id = random::<u64>(); - let event_type = EventType::EVENT_TYPE_REGULAR_CHAT_MESSAGE; - let mut event_request_header = EventRequestHeader::new(); - let mut conv_id = ConversationId::new(); - conv_id.set_id(conv_id_raw); - event_request_header.set_conversation_id(conv_id); - event_request_header.set_delivery_medium(delivery_medium); - event_request_header.set_expected_otr(expected_otr); - event_request_header.set_client_generated_id(client_generated_id); - event_request_header.set_event_type(event_type); - - let mut request = SendChatMessageRequest::new(); - request.set_request_header(request_header); - request.set_message_content(message_content); - request.set_event_request_header(event_request_header); - - //Prepare response - let response = SendChatMessageResponse::new(); - } -} +pub mod hangups; #[cfg(test)] mod tests { @@ -158,7 +79,6 @@ mod tests { use std::env; match env::var_os("CI") { - #[allow(unused_variables)] Some(env) => println!("CI's currently not supported at this test"), None => { let mut client_email = String::new(); @@ -177,13 +97,4 @@ mod tests { } } } - - #[test] - fn test_send_message() { - use super::hangups::send_message; - - let test_message = String::from("TEST!"); - let test_conv = String::from("Ugxu9JRlbNPSqk5Ye1V4AaABAQ"); - send_message(test_message, test_conv); - } }