From 17e0bacdd851c95246ce4f910e743d7f331081c5 Mon Sep 17 00:00:00 2001 From: olebeck Date: Sun, 20 Feb 2022 13:56:09 +0100 Subject: [PATCH] save resource packs to subfolder fix saving non drm resource packs --- main.go | 52 +++++++++++++++++++++++++++----------------------- marketplace.go | 25 ++++++++++++++---------- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/main.go b/main.go index 6551b75..646d1c2 100644 --- a/main.go +++ b/main.go @@ -125,6 +125,12 @@ func main() { target += ":19132" } + host, _, err := net.SplitHostPort(target) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid target: %s\n", err) + os.Exit(1) + } + sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) ctx, cancel := context.WithCancel(context.Background()) @@ -145,16 +151,14 @@ func main() { token := get_token() src := auth.RefreshTokenSource(&token) - var packet_func func(header packet.Header, payload []byte, src, dst net.Addr) + var packet_func func(header packet.Header, payload []byte, src, dst net.Addr) = nil if debug { packet_func = PacketLogger - } else { - packet_func = nil } // connect fmt.Printf("Connecting to %s\n", target) - serverConn, err := minecraft.Dialer{ + serverConn, err = minecraft.Dialer{ TokenSource: src, PacketFunc: packet_func, }.DialContext(ctx, "raknet", target) @@ -174,29 +178,29 @@ func main() { } println("Connected") - println("ripping Resource Packs") - // dump keys, download and decrypt the packs - keys := make(map[string]string) - for _, pack := range serverConn.ResourcePacks() { - keys[pack.UUID()] = pack.ContentKey() - fmt.Printf("ResourcePack(Id: %s Key: %s | Name: %s Version: %s)\n", pack.UUID(), keys[pack.UUID()], pack.Name(), pack.Version()) + if len(serverConn.ResourcePacks()) > 0 { + println("ripping Resource Packs") + os.Mkdir(host, 0777) - fmt.Printf("Downloading...\n") - pack_data, err := download_pack(pack) - if err != nil { - panic(err) - } - if save_encrypted { - os.WriteFile(pack.Name()+".ENCRYPTED.zip", pack_data, 0666) - } - fmt.Printf("Decrypting...\n") - if err := decrypt_pack(pack_data, pack.Name()+".mcpack", keys[pack.UUID()]); err != nil { - panic(fmt.Errorf("failed to decrypt %s: %s", pack.Name(), err)) - } - } + // dump keys, download and decrypt the packs + keys := make(map[string]string) + for _, pack := range serverConn.ResourcePacks() { + keys[pack.UUID()] = pack.ContentKey() + fmt.Printf("ResourcePack(Id: %s Key: %s | Name: %s Version: %s)\n", pack.UUID(), keys[pack.UUID()], pack.Name(), pack.Version()) - if len(keys) > 0 { + pack_data, err := download_pack(pack) + if err != nil { + panic(fmt.Errorf("failed to download pack: %s", err)) + } + if save_encrypted { + os.WriteFile(host+"/"+pack.Name()+".ENCRYPTED.zip", pack_data, 0666) + } + fmt.Printf("Decrypting...\n") + if err := decrypt_pack(pack_data, host+"/"+pack.Name()+".mcpack", keys[pack.UUID()]); err != nil { + panic(fmt.Errorf("failed to decrypt %s: %s", pack.Name(), err)) + } + } fmt.Printf("Writing keys to %s\n", KEYS_FILE) dump_keys(keys) } else { diff --git a/marketplace.go b/marketplace.go index 8d6c8fd..eb36a41 100644 --- a/marketplace.go +++ b/marketplace.go @@ -59,17 +59,22 @@ func decrypt_pack(pack_zip []byte, filename, key string) error { { ff, err := z.Open("contents.json") if err != nil { - return err + if os.IsNotExist(err) { + content = ContentJson{} + } else { + return err + } + } else { + buf, _ := io.ReadAll(ff) + dec, _ := cfb_decrypt(buf[0x100:], []byte(key)) + dec = bytes.Split(dec, []byte("\x00"))[0] // remove trailing \x00 (example: play.galaxite.net) + fw, _ := zw.Create("contents.json") + fw.Write(dec) + if err := json.Unmarshal(dec, &content); err != nil { + return err + } + written["contents.json"] = true } - buf, _ := io.ReadAll(ff) - dec, _ := cfb_decrypt(buf[0x100:], []byte(key)) - dec = bytes.Split(dec, []byte("\x00"))[0] // remove trailing \x00 (example: play.galaxite.net) - fw, _ := zw.Create("contents.json") - fw.Write(dec) - if err := json.Unmarshal(dec, &content); err != nil { - return err - } - written["contents.json"] = true } // copy and decrypt all content