Let Rojo pull auth cookie from registry on Windows

This commit is contained in:
Lucien Greathouse
2019-08-28 13:21:30 -07:00
parent e5575b782c
commit 8fe1fa48b8
6 changed files with 59 additions and 8 deletions

10
Cargo.lock generated
View File

@@ -1295,6 +1295,7 @@ dependencies = [
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
"winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@@ -1815,6 +1816,14 @@ dependencies = [
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "winreg"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "ws2_32-sys" name = "ws2_32-sys"
version = "0.2.1" version = "0.2.1"
@@ -2042,6 +2051,7 @@ dependencies = [
"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
"checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9" "checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5" "checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" "checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"

View File

@@ -50,6 +50,9 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
uuid = { version = "0.7", features = ["v4", "serde"] } uuid = { version = "0.7", features = ["v4", "serde"] }
[target.'cfg(windows)'.dependencies]
winreg = "0.6.2"
[dev-dependencies] [dev-dependencies]
lazy_static = "1.2" lazy_static = "1.2"
paste = "0.1" paste = "0.1"

30
src/auth_cookie.rs Normal file
View File

@@ -0,0 +1,30 @@
//! Implementation of automatically fetching authentication cookie from a Roblox
//! Studio installation.
#[cfg(windows)]
pub fn get_auth_cookie() -> Option<String> {
use winreg::{enums::HKEY_CURRENT_USER, RegKey};
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let cookies = hkcu
.open_subkey("Software\\Roblox\\RobloxStudioBrowser\\roblox.com")
.ok()?;
let entry: String = cookies.get_value(".ROBLOSECURITY").ok()?;
let mut cookie = None;
for kv_pair in entry.split(",") {
let mut pieces = kv_pair.split("::");
if let Some("COOK") = pieces.next() {
cookie = pieces.next();
}
}
cookie.map(Into::into)
}
#[cfg(not(windows))]
pub fn get_auth_cookie() -> Option<String> {
None
}

View File

@@ -54,7 +54,7 @@ fn main() {
(about: "Generates a place or model file out of the project and uploads it to Roblox.") (about: "Generates a place or model file out of the project and uploads it to Roblox.")
(@arg PROJECT: "Path to the project to upload. Defaults to the current directory.") (@arg PROJECT: "Path to the project to upload. Defaults to the current directory.")
(@arg kind: --kind +takes_value "The kind of asset to generate, 'place', or 'model'. Defaults to place.") (@arg kind: --kind +takes_value "The kind of asset to generate, 'place', or 'model'. Defaults to place.")
(@arg cookie: --cookie +takes_value "Security cookie to authenticate with. If not specified, Rojo will attempt to find one from the system automatically.") (@arg cookie: --cookie +takes_value "Authenication cookie to authenticate with. If not specified, Rojo will attempt to find one from the system automatically.")
(@arg asset_id: --asset_id +takes_value +required "Asset ID to upload to.") (@arg asset_id: --asset_id +takes_value +required "Asset ID to upload to.")
) )
); );
@@ -172,7 +172,7 @@ fn start_upload(sub_matches: &ArgMatches) {
}; };
let kind = sub_matches.value_of("kind"); let kind = sub_matches.value_of("kind");
let security_cookie = sub_matches.value_of("cookie").map(Into::into); let auth_cookie = sub_matches.value_of("cookie").map(Into::into);
let asset_id: u64 = { let asset_id: u64 = {
let arg = sub_matches.value_of("asset_id").unwrap(); let arg = sub_matches.value_of("asset_id").unwrap();
@@ -188,12 +188,12 @@ fn start_upload(sub_matches: &ArgMatches) {
let options = commands::UploadOptions { let options = commands::UploadOptions {
fuzzy_project_path, fuzzy_project_path,
security_cookie: security_cookie, auth_cookie,
asset_id, asset_id,
kind, kind,
}; };
match commands::upload(&options) { match commands::upload(options) {
Ok(_) => {} Ok(_) => {}
Err(e) => { Err(e) => {
error!("{}", e); error!("{}", e);

View File

@@ -2,20 +2,27 @@ use std::path::PathBuf;
use failure::Fail; use failure::Fail;
use crate::auth_cookie::get_auth_cookie;
#[derive(Debug, Fail)] #[derive(Debug, Fail)]
pub enum UploadError { pub enum UploadError {
#[fail(display = "This error cannot happen")] #[fail(display = "Rojo could not find your Roblox auth cookie. Please pass one via --cookie.")]
StubError, NeedAuthCookie,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct UploadOptions<'a> { pub struct UploadOptions<'a> {
pub fuzzy_project_path: PathBuf, pub fuzzy_project_path: PathBuf,
pub security_cookie: Option<String>, pub auth_cookie: Option<String>,
pub asset_id: u64, pub asset_id: u64,
pub kind: Option<&'a str>, pub kind: Option<&'a str>,
} }
pub fn upload(_options: &UploadOptions) -> Result<(), UploadError> { pub fn upload(options: UploadOptions) -> Result<(), UploadError> {
let cookie = options
.auth_cookie
.or_else(get_auth_cookie)
.ok_or(UploadError::NeedAuthCookie)?;
unimplemented!("TODO: Reimplement upload command"); unimplemented!("TODO: Reimplement upload command");
} }

View File

@@ -12,6 +12,7 @@ pub mod commands;
#[doc(hidden)] #[doc(hidden)]
pub mod project; pub mod project;
mod auth_cookie;
mod imfs; mod imfs;
mod message_queue; mod message_queue;
mod path_map; mod path_map;