Neopets Mobile: Difference between revisions

From Computers Wiki
Jump to navigationJump to search
(→‎Nokia 6280 V02.30.00 (en) Singtel: Add session check responses)
(→‎Both: Add other code snippet)
Line 80: Line 80:
var3.writeShort(255);
var3.writeShort(255);
var3.close();
var3.close();
}
</syntaxhighlight>

<syntaxhighlight lang="java">
private static final h a(HttpConnection var0) throws IOException, o {
int var1;
if ((var1 = var0.getResponseCode()) != 200) {
throw new o(var1, var0.getResponseMessage());
} else {
String var2;
if ((var2 = var0.getType()) != null && var2.equals("application/x-www-form-urlencoded")) {
DataInputStream var3;
String var4;
String var5;
if ((var5 = a(var4 = a(var3 = var0.openDataInputStream()), "session")) != null) {
b(var5);
}

String var6;
if ((var6 = a(var4, "url")) != null) {
e = var6;
}

int var7;
if ((var7 = var3.read()) == true) {
return new h(-1, new byte[0]);
} else {
int var8 = var7 << 8 | var3.readByte() & 255;
byte[] var10 = new byte[(var3.readInt() + 7) / 8];
var3.readFully(var10);
if (var3.read() != -1) {
throw new o(500, "Too much data in response");
} else {
var3.close();
if (var8 != 32768 && var8 != 32868) {
return new h(var8, var10);
} else {
throw new o(500, new String(var10, 1, var10.length - 1));
}
}
}
} else {
throw new o(500, "Invalid response Content-Type: " + var2);
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>

Revision as of 03:10, 21 May 2023

Neopets Mobile does not refer to the 2021 interface of the website, but the 2006 flip phone application that has long been discontinued.

Archival

https://www.jellyneo.net/?go=mobile

https://pinkpt.com//neodex/index.php?title=Neopets_Mobile

https://drive.google.com/file/d/1Cj8hqk4VI-O408kgMnKpffPmI-kxKmWR/view

Attempts to reverse engineer the long-defunct API

TODO (The jars are all minified, but perhaps I can extract the API URLs from them and document what the application expects to get back)

The META-INF/MANIFEST.MF for the Nokia 6280 version specifies a Java version of 1.4.2_04.

The decompiler used is quiltflower: https://github.com/QuiltMC/quiltflower and the javax.microedition classes were copied from https://github.com/mcpat/java-microedition-libraries

Nokia 6280 V02.30.00 (en) Singtel

m.java contains two calls:

The session check appears to return one of the following values, with anything else as a failure code of -1:

Response Treated as ID
SUBSCRIBED 1
UNSUBSCRIBED 2
REVOKED 3
SECURITY 5

Nokia 6111

m.java contains one call:

Both

In b.java for the 6280 version and m.java for the 6111 version, there is code for the following POST request (taken from the 6280 version):

   private static final void a(HttpConnection var0, p var1, boolean var2) throws IOException {
      var0.setRequestMethod("POST");
      var0.setRequestProperty("content-type", "application/x-www-form-urlencoded");
      var0.setRequestProperty("connection", "close");
      if (a != null) {
         var0.setRequestProperty("x-up-calling-line-id", a);
      }

      DataOutputStream var3 = var0.openDataOutputStream();
      if (var2) {
         a(var3, "session=" + b);
         a(var3, "&");
      }

      a(var3, "client=NEOPETS/2.8");
      a(var3, "&");
      a(var3, "game=" + c);
      if (a > 0) {
         a(var3, "&");
         a(var3, "center=" + a);
      }

      if (d != null) {
         a(var3, "&");
         a(var3, "language=" + d);
      }

      a(var3, "\n");
      var3.writeShort(var1.a);
      var3.writeInt(8 * var1.a());
      var1.a(var3);
      var3.writeShort(255);
      var3.close();
   }
   private static final h a(HttpConnection var0) throws IOException, o {
      int var1;
      if ((var1 = var0.getResponseCode()) != 200) {
         throw new o(var1, var0.getResponseMessage());
      } else {
         String var2;
         if ((var2 = var0.getType()) != null && var2.equals("application/x-www-form-urlencoded")) {
            DataInputStream var3;
            String var4;
            String var5;
            if ((var5 = a(var4 = a(var3 = var0.openDataInputStream()), "session")) != null) {
               b(var5);
            }

            String var6;
            if ((var6 = a(var4, "url")) != null) {
               e = var6;
            }

            int var7;
            if ((var7 = var3.read()) == true) {
               return new h(-1, new byte[0]);
            } else {
               int var8 = var7 << 8 | var3.readByte() & 255;
               byte[] var10 = new byte[(var3.readInt() + 7) / 8];
               var3.readFully(var10);
               if (var3.read() != -1) {
                  throw new o(500, "Too much data in response");
               } else {
                  var3.close();
                  if (var8 != 32768 && var8 != 32868) {
                     return new h(var8, var10);
                  } else {
                     throw new o(500, new String(var10, 1, var10.length - 1));
                  }
               }
            }
         } else {
            throw new o(500, "Invalid response Content-Type: " + var2);
         }
      }
   }