From 85b3fde1de0531d8b3d0470b7a47ddcacd04a192 Mon Sep 17 00:00:00 2001 From: Pixirora Date: Mon, 9 Sep 2024 21:02:26 -0400 Subject: [PATCH] Update Last.fm auth callback & API key/shared secret the new API key/shared secret was so I could add the new description to the browser sign in page --- gradle.properties | 1 + .../impl/scrobble/LastFMScrobbler.java | 32 +++++++++++++------ .../impl/scrobble/LegacyLastFMScrobbler.java | 23 +++++++++++++ .../kitten_heart/impl/scrobble/Scrobbler.java | 2 +- .../src/main/rust/bridge/http/server.rs | 2 +- .../kitten-thoughts/src/main/rust/errors.rs | 5 +-- .../src/main/rust/http/server.rs | 18 +++++++++-- 7 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LegacyLastFMScrobbler.java diff --git a/gradle.properties b/gradle.properties index cacf3ce..fc576cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,7 @@ org.gradle.jvmargs = -Xmx4G org.gradle.caching = true org.gradle.parallel = true +org.gradle.configureondemand = true # Mod Properties mod_version = 0.3.0 diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LastFMScrobbler.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LastFMScrobbler.java index 9e740f8..a28d571 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LastFMScrobbler.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LastFMScrobbler.java @@ -19,13 +19,13 @@ import net.pixaurora.kitten_heart.impl.network.XMLHelper; public class LastFMScrobbler implements Scrobbler { - public static final String API_KEY = "693bf5425eb442ceaf6f627993c7918d"; - public static final String SHARED_SECRET = "9920afdfeba7ec08b3dc966f9d603cd5"; + public static final String API_KEY = "6f9e533b5f6631a5aa3070f5e757de8c"; + public static final String SHARED_SECRET = "97fbf9a3d76ba36dfb5a2f6c3215bf49"; public static final String ROOT_API_URL = "http://ws.audioscrobbler.com/2.0/"; public static final String SETUP_URL = "https://last.fm/api/auth?api_key=" + API_KEY; - public static final ScrobblerType TYPE = new ScrobblerType<>("last.fm", LastFMScrobbler.class, + public static final ScrobblerType TYPE = new ScrobblerType<>("last.fm.new", LastFMScrobbler.class, SETUP_URL, LastFMScrobbler::setup); private final LastFMSession session; @@ -51,14 +51,14 @@ public void startScrobbling(ScrobbleInfo track) throws KitTunesException { args.put("artist", track.artistTitle()); args.put("track", track.trackTitle()); - args.put("api_key", API_KEY); + args.put("api_key", this.apiKey()); args.put("sk", this.session.key); if (track.albumTitle().isPresent()) { args.put("album", track.albumTitle().get()); } - this.handleScrobbling(addSignature(args)); + this.handleScrobbling(this.addSignature(args)); } @Override @@ -70,7 +70,7 @@ public void completeScrobbling(ScrobbleInfo track) throws KitTunesException { args.put("artist", track.artistTitle()); args.put("track", track.trackTitle()); args.put("timestamp", String.valueOf(track.startTime().getEpochSecond())); - args.put("api_key", API_KEY); + args.put("api_key", this.apiKey()); args.put("sk", this.session.key); Optional albumTitle = track.albumTitle(); @@ -78,7 +78,7 @@ public void completeScrobbling(ScrobbleInfo track) throws KitTunesException { args.put("album", albumTitle.get()); } - this.handleScrobbling(addSignature(args)); + this.handleScrobbling(this.addSignature(args)); } private void handleScrobbling(Map args) throws KitTunesException { @@ -87,7 +87,11 @@ private void handleScrobbling(Map args) throws KitTunesException UnhandledKitTunesException.runOrThrow(() -> HttpHelper.logResponse(responseBody)); } - private static Map addSignature(Map parameters) { + private Map addSignature(Map parameters) { + return addSignature(parameters, this.sharedSecret()); + } + + private static Map addSignature(Map parameters, String sharedSecret) { List> sortedParameters = parameters.entrySet().stream() .sorted(Comparator.comparing(entry -> entry.getKey())).collect(Collectors.toList()); @@ -96,7 +100,7 @@ private static Map addSignature(Map parameters) regularSignature += parameter.getKey() + parameter.getValue(); } - regularSignature += SHARED_SECRET; + regularSignature += sharedSecret; parameters = new HashMap<>(parameters); parameters.put("api_sig", Encryption.signMd5(regularSignature)); @@ -111,7 +115,7 @@ private static LastFMSession createSession(String token) throws ScrobblerParsing args.put("api_key", API_KEY); args.put("token", token); - InputStream responseBody = HttpHelper.get(ROOT_API_URL, addSignature(args)); + InputStream responseBody = HttpHelper.get(ROOT_API_URL, addSignature(args, SHARED_SECRET)); Document body = XMLHelper.getDocument(responseBody); @@ -125,6 +129,14 @@ public ScrobblerType type() { return TYPE; } + protected String apiKey() { + return API_KEY; + } + + protected String sharedSecret() { + return SHARED_SECRET; + } + public static class LastFMSession { private final String name; private final String key; diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LegacyLastFMScrobbler.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LegacyLastFMScrobbler.java new file mode 100644 index 0000000..9197572 --- /dev/null +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/LegacyLastFMScrobbler.java @@ -0,0 +1,23 @@ +package net.pixaurora.kitten_heart.impl.scrobble; + +public class LegacyLastFMScrobbler extends LastFMScrobbler { + public static final String API_KEY = "693bf5425eb442ceaf6f627993c7918d"; + public static final String SHARED_SECRET = "9920afdfeba7ec08b3dc966f9d603cd5"; + + public static final ScrobblerType TYPE = new ScrobblerType<>("last.fm", + LegacyLastFMScrobbler.class, null, null); + + public LegacyLastFMScrobbler(LastFMSession session) { + super(session); + } + + @Override + protected String apiKey() { + return API_KEY; + } + + @Override + protected String sharedSecret() { + return SHARED_SECRET; + } +} diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/Scrobbler.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/Scrobbler.java index a05b202..b691e60 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/Scrobbler.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/scrobble/Scrobbler.java @@ -8,7 +8,7 @@ public interface Scrobbler extends SimpleScrobbler, SpecifiesType { public static final DispatchGroup> TYPES = new DispatchGroup<>( - "scrobbler", Arrays.asList(LastFMScrobbler.TYPE)); + "scrobbler", Arrays.asList(LastFMScrobbler.TYPE, LegacyLastFMScrobbler.TYPE)); public String username() throws KitTunesException; } diff --git a/projects/kitten-thoughts/src/main/rust/bridge/http/server.rs b/projects/kitten-thoughts/src/main/rust/bridge/http/server.rs index b980c52..3e660f6 100644 --- a/projects/kitten-thoughts/src/main/rust/bridge/http/server.rs +++ b/projects/kitten-thoughts/src/main/rust/bridge/http/server.rs @@ -70,6 +70,6 @@ pub extern "system" fn Java_net_pixaurora_kitten_1thoughts_impl_http_server_Serv object: JObject<'local>, ) -> () { if let Err(error) = drop(&object, &mut env) { - error.throw(&mut env); + panic!("Couldn't drop server due to an error! {}", error); } } diff --git a/projects/kitten-thoughts/src/main/rust/errors.rs b/projects/kitten-thoughts/src/main/rust/errors.rs index c3849e7..0cc74cd 100644 --- a/projects/kitten-thoughts/src/main/rust/errors.rs +++ b/projects/kitten-thoughts/src/main/rust/errors.rs @@ -21,8 +21,9 @@ pub type Result = core::result::Result; impl Error { pub fn throw(&self, env: &mut JNIEnv) { - env.throw_new("java/io/IOException", self.to_string()) - .unwrap(); + if let Err(error) = env.throw_new("java/io/IOException", self.to_string()) { + eprintln!("Couldn't throw exception due to an error! {}", error); + } } } diff --git a/projects/kitten-thoughts/src/main/rust/http/server.rs b/projects/kitten-thoughts/src/main/rust/http/server.rs index 0a00e86..7fc7162 100644 --- a/projects/kitten-thoughts/src/main/rust/http/server.rs +++ b/projects/kitten-thoughts/src/main/rust/http/server.rs @@ -22,9 +22,21 @@ pub struct Server { shutdown: Option, } -#[get("/?")] +async fn handle_received_token(sender: &Sender, token: String) { + if let Err(error) = sender.send(token).await { + eprintln!("Couldn't send token due to an error! {}", error); + } +} + +#[get("/auth/callback/generic?")] +async fn receive_generic_token(sender: &State>, code: String) -> RawHtml<&str> { + handle_received_token(sender.inner(), code).await; + RawHtml(RESPONSE) +} + +#[get("/auth/callback/lastfm?")] async fn receive_lastfm_token(sender: &State>, token: String) -> RawHtml<&str> { - sender.inner().send(token).await.unwrap(); + handle_received_token(sender.inner(), token).await; RawHtml(RESPONSE) } @@ -42,7 +54,7 @@ impl Server { ..Config::release_default() }) .manage(sender) - .mount("/", routes![receive_lastfm_token]); + .mount("/", routes![receive_generic_token, receive_lastfm_token]); let server = server.ignite().await?; self.shutdown = Some(server.shutdown());