mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2025-12-12 23:24:35 +01:00
Automatically apply RSA patch
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
"game_path": "选择游戏安装路径",
|
||||
"game_command": "启动游戏的命令行",
|
||||
"game_executable": "选择游戏可执行文件",
|
||||
"recover_metadata": "紧急情况下恢复元数据文件",
|
||||
"recover_rsa": "紧急情况下删除补丁文件",
|
||||
"grasscutter_jar": "选择 Grasscutter JAR 文件",
|
||||
"toggle_encryption": "启用加密",
|
||||
"install_certificate": "安装代理证书",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "选择语言",
|
||||
"background": "设置自定义背景(链接或文件)",
|
||||
"theme": "设置主题",
|
||||
"patch_metadata": "自动修改元数据",
|
||||
"patch_rsa": "自动修改RSA",
|
||||
"use_proxy": "使用内置代理",
|
||||
"wipe_login": "清除登录缓存",
|
||||
"horny_mode": "Horny 模式"
|
||||
@@ -72,9 +72,9 @@
|
||||
"gc_dev_data": "下载最新的 Grasscutter 开发版数据,不包括 JAR 文件。此选项在更新时有帮助。",
|
||||
"encryption": "此项设置通常应该处于关闭状态。",
|
||||
"resources": "资源文件在运行 Grasscutter 服务器时是必要的。此选项在已经存在资源文件时不可选。",
|
||||
"emergency_metadata": "在出现意外情况时,自动将元数据恢复至原始版本",
|
||||
"emergency_rsa": "在出现意外情况时自动将 RSA 恢复到原始版本",
|
||||
"use_proxy": "使用 Cultivation 的内置代理。除非你使用 Fiddler 等软件,否则应启用此项。",
|
||||
"patch_metadata": "自动修改和恢复游戏元数据。除非要游玩旧版本/非官方版本,抑或你已经手动修改了元数据,否则应启用此项。"
|
||||
"patch_rsa": "自动修改和恢复 RSA 补丁。 除非您玩的是旧版/非官方版本,或者您手动修改了 RSA,否则应该启用此功能。"
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "選擇遊戲安裝路徑",
|
||||
"game_command": "遊戲啟動命令",
|
||||
"game_executable": "選擇遊戲執行檔",
|
||||
"recover_metadata": "緊急恢復Metadata",
|
||||
"recover_rsa": "緊急恢復RSA",
|
||||
"grasscutter_jar": "選擇伺服器JAR檔案",
|
||||
"toggle_encryption": "設定加密",
|
||||
"install_certificate": "安裝代理憑證",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "語言",
|
||||
"background": "選擇自定義背景(網址或檔案)",
|
||||
"theme": "選擇主題",
|
||||
"patch_metadata": "自動修補Metadata",
|
||||
"patch_rsa": "自動修補RSA",
|
||||
"use_proxy": "使用內建代理伺服器",
|
||||
"wipe_login": "擦除登錄緩存",
|
||||
"horny_mode": "Horny模式"
|
||||
@@ -72,9 +72,9 @@
|
||||
"gc_dev_data": "下載當前最新的Grasscutter開發版本的資料文件,其中不會附帶JAR文件。這個選項在更新時很有用。",
|
||||
"encryption": "在正常情況下,此選項應該被關閉。",
|
||||
"resources": "資源文件在架設一個Grasscutter伺服器時是必要的。 這個選項會在您已經有裡面有檔案的資源資料夾時不可選。",
|
||||
"emergency_metadata": "一旦有東西出了問題,此選項可以把您的Metadata恢復成官方版本。",
|
||||
"emergency_rsa": "一旦有東西出了問題,此選項可以把您的rsa恢復成官方版本。",
|
||||
"use_proxy": "使用Cultivation內建的代理伺服器。此選項應該被啟用,除非你使用其他的代理伺服器。",
|
||||
"patch_metadata": "自動修補和恢復Metadata。除非您的遊戲版本是舊的或者是非官方的,此選項應該被啟用。"
|
||||
"patch_rsa": "自動修補和恢復RSA。除非您的遊戲版本是舊的或者是非官方的,此選項應該被啟用。"
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"disabled": "Deaktiviert",
|
||||
"game_path": "Spielpfad",
|
||||
"game_executable": "Spiel Datei auswählen",
|
||||
"recover_metadata": "Notfall Wiederherstellung der Metadaten",
|
||||
"recover_rsa": "Notfall Wiederherstellung der RSA",
|
||||
"grasscutter_jar": "Grasscuter JAR auswählen",
|
||||
"toggle_encryption": "Verschlüsselung umschalten",
|
||||
"install_certificate": "Installeer proxy certificaat",
|
||||
@@ -24,7 +24,7 @@
|
||||
"language": "Sprache auswählen",
|
||||
"background": "Benutzerdefinierten Hintergrund festlegen (link oder bild)",
|
||||
"theme": "Theme auswählen",
|
||||
"patch_metadata": "Metadaten automatisch patchen",
|
||||
"patch_rsa": "RSA automatisch patchen",
|
||||
"use_proxy": "Gebruik interne proxy",
|
||||
"wipe_login": "Wis de inlogcache",
|
||||
"horny_mode": "Geile modus"
|
||||
@@ -70,9 +70,9 @@
|
||||
"gc_stable_data": "Laden Sie die stabilen Grasscutter Daten herunter, welche keine Jar-Datei enthalten. Dies ist nützlich zum Aktualisieren.",
|
||||
"gc_dev_data": "Laden Sie die neuesten Grasscutter-Entwicklungsdateien herunter, welche keine Jar-Datei enthält. Dies ist nützlich zum Aktualisieren.",
|
||||
"resources": "Diese werden auch benötigt, um einen Grasscutter-Server auszuführen. Diese Schaltfläche ist grau, wenn Sie einen bestehenden Ressourcenordner mit Inhalten haben",
|
||||
"emergency_metadata": "Im Fall, dass etwas schief laufen sollte, kannst du deine Metadaten auf die letzte offizielle Version zurücksetzen",
|
||||
"emergency_rsa": "Im Fall, dass etwas schief laufen sollte, kannst du deine RSA auf die letzte offizielle Version zurücksetzen",
|
||||
"use_proxy": "Nutze den internen Proxy von Cultivation. Du solltest dies aktivieren, es sei denn du nutzt Programme wie Fiddler",
|
||||
"patch_metadata": "Patche und aktualisiere deine Metadaten automatisch. Solange du nicht mit einer alten/nicht offiziellen Version spielst oder deine Metadaten manuell gepatcht hast, sollte dies aktiviert sein."
|
||||
"patch_rsa": "Patche und aktualisiere deine RSA automatisch. Solange du nicht mit einer alten/nicht offiziellen Version spielst oder deine RSA manuell gepatcht hast, sollte dies aktiviert sein."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "Set Game Install Path",
|
||||
"game_command": "Game Launch Command",
|
||||
"game_executable": "Set Game Executable",
|
||||
"recover_metadata": "Emergency Metadata Recovery",
|
||||
"recover_rsa": "Emergency Delete RSA",
|
||||
"grasscutter_jar": "Set Grasscutter JAR",
|
||||
"toggle_encryption": "Toggle Encryption",
|
||||
"install_certificate": "Install Proxy Certificate",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "Select Language",
|
||||
"background": "Set Custom Background (link or image file)",
|
||||
"theme": "Set Theme",
|
||||
"patch_metadata": "Automatically Patch Metadata",
|
||||
"patch_rsa": "Automatically Patch RSA",
|
||||
"use_proxy": "Use Internal Proxy",
|
||||
"wipe_login": "Wipe Login Cache",
|
||||
"horny_mode": "Horny Mode"
|
||||
@@ -72,9 +72,9 @@
|
||||
"gc_dev_data": "Download the latest development Grasscutter data files, which does not come with a jar file. This is useful for updating.",
|
||||
"encryption": "This should usually be disabled.",
|
||||
"resources": "These are also required to run a Grasscutter server. This button will be grey if you have an existing resources folder with contents inside",
|
||||
"emergency_metadata": "In case something went wrong, restore your metadata to the latest official versions metadata. Only for 2.8/3.0",
|
||||
"emergency_rsa": "In case something went wrong, force delete RSA patch.",
|
||||
"use_proxy": "Use the Cultivation internal proxy. You should have this enabled unless you use something like Fiddler",
|
||||
"patch_metadata": "Patch and unpatch your game metadata automatically. Unless playing with old/non-official versions (2.8/3.0), this should be disabled."
|
||||
"patch_rsa": "Patch and unpatch your game RSA automatically. Unless playing with old/non-official versions (3.0 and older), this should be enabled."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "Ruta de instalación del juego",
|
||||
"game_command": "Comando de lanzamiento del juego",
|
||||
"game_executable": "Establecer ejecutable del juego",
|
||||
"recover_metadata": "Recuperación de Metadatos de Emergencia",
|
||||
"recover_rsa": "Recuperación de RSA de Emergencia",
|
||||
"grasscutter_jar": "Establecer JAR de Grasscutter",
|
||||
"toggle_encryption": "Alternar Cifrado",
|
||||
"install_certificate": "Instalar Certificado Proxie",
|
||||
@@ -24,7 +24,7 @@
|
||||
"grasscutter_with_game": "Iniciar automáticamente Grasscutter con el juego",
|
||||
"language": "Seleccionar Idioma",
|
||||
"background": "Establecer Fondo Personalizado (link o archivo de imagen)",
|
||||
"patch_metadata": "Automatically Patch Metadata",
|
||||
"patch_rsa": "Parchear RSA automáticamente",
|
||||
"theme": "Establecer Tema",
|
||||
"use_proxy": "Use Internal Proxy",
|
||||
"wipe_login": "Wipe Login Cache",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "Définir le chemin d'installation du jeu",
|
||||
"game_command": "Commande de lancement du jeu",
|
||||
"game_executable": "definir l'executable du jeu",
|
||||
"recover_metadata": "Récupération d'urgence des métadonnées",
|
||||
"recover_rsa": "Récupération d'urgence des RSA",
|
||||
"grasscutter_jar": "definir le Jar Grasscutter",
|
||||
"toggle_encryption": "activer l'encryption",
|
||||
"install_certificate": "Installer le certificat du proxy",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "Choisir la langue",
|
||||
"background": "definir un arriere plan personnalise (lien ou fichier image)",
|
||||
"theme": "definir un theme",
|
||||
"patch_metadata": "Corriger automatiquement les métadonnées",
|
||||
"patch_rsa": "Corriger automatiquement les RSA",
|
||||
"use_proxy": "Utiliser un proxy interne",
|
||||
"wipe_login": "Effacer le cache de connexion",
|
||||
"horny_mode": "Mode excitation"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"game_path": "Mengatur jalur penginstalan game",
|
||||
"game_command": "Perintah peluncuran game",
|
||||
"game_executable": "Mengatur game yang dapat dieksekusi",
|
||||
"recover_metadata": "Pemulihan metadata darurat",
|
||||
"recover_rsa": "Pemulihan RSA darurat",
|
||||
"grasscutter_jar": "Path ke Grasscutter JAR",
|
||||
"toggle_encryption": "Alihkan enkripsi",
|
||||
"install_certificate": "Instal sertifikat proxy",
|
||||
@@ -24,7 +24,7 @@
|
||||
"language": "Pilih Bahasa",
|
||||
"background": "Atur Kustom Latar Belakang (link atau gambar file)",
|
||||
"theme": "Atur Tema",
|
||||
"patch_metadata": "Automatically Patch Metadata",
|
||||
"patch_rsa": "Automatically Patch RSA",
|
||||
"use_proxy": "Gunakan Proxy Internal",
|
||||
"wipe_login": "Menghapus Cache Login",
|
||||
"horny_mode": "Mode Terangsang"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "게임 설치 경로 설정",
|
||||
"game_command": "게임 시작 명령",
|
||||
"game_executable": "게임 실행 파일 설정",
|
||||
"recover_metadata": "긴급 메타데이터 복구",
|
||||
"recover_rsa": "긴급 RSA 복원",
|
||||
"grasscutter_jar": "그래스커터 JAR 설정",
|
||||
"toggle_encryption": "암호화 전환",
|
||||
"install_certificate": "프록시 인증서 설치",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "언어 선택",
|
||||
"background": "사용자 지정 배경 설정(링크 또는 이미지 파일)",
|
||||
"theme": "테마 설정",
|
||||
"patch_metadata": "자동으로 메타데이터 패치 적용",
|
||||
"patch_rsa": "RSA 패치 자동 적용",
|
||||
"use_proxy": "내부 프록시 사용",
|
||||
"wipe_login": "로그인 캐시 지우기",
|
||||
"horny_mode": "Horny 모드"
|
||||
@@ -72,9 +72,9 @@
|
||||
"gc_dev_data": "jar 파일과 함께 제공되지 않는 최신 개발 Grasscuter 데이터 파일을 다운로드합니다. 이것은 업데이트하는 데 유용합니다.",
|
||||
"encryption": "일반적으로 이 기능을 사용하지 않도록 설정해야 합니다.",
|
||||
"resources": "또한 Grasscutter 서버를 실행하는 데도 필요합니다. 내용이 포함된 기존 리소스 폴더가 있는 경우 이 버튼은 회색으로 표시됩니다",
|
||||
"emergency_metadata": "문제가 발생한 경우 메타데이터를 최신 공식 버전 메타데이터로 복원합니다.",
|
||||
"emergency_rsa": "문제가 있는 경우 RSA 패치를 제거하십시오.",
|
||||
"use_proxy": "Culturation 내부 프록시를 사용합니다. 피들러와 같은 것을 사용하지 않는 한 이 기능을 활성화해야 합니다",
|
||||
"patch_metadata": "게임 메타데이터를 자동으로 패치 및 패치 해제합니다. 이전/비공식 버전으로 재생하거나 메타데이터를 수동으로 패치한 경우를 제외하고는 이 기능을 사용하도록 설정해야 합니다."
|
||||
"patch_rsa": "게임 RSA를 자동으로 패치 및 패치 해제합니다. 이전/비공식 버전을 사용하거나 RSA를 수동으로 패치하지 않은 경우 이 기능을 활성화해야 합니다."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"enabled": "Iespējots",
|
||||
"disabled": "Atspējots",
|
||||
"game_executable": "Iestatīt spēles izpildāmu",
|
||||
"recover_metadata": "Avārijas metadatu atjaunošana",
|
||||
"recover_rsa": "Avārijas RSA atjaunošana",
|
||||
"grasscutter_jar": "Iestatiet Grasscutter JAR",
|
||||
"toggle_encryption": "Pārslēgt Šifrēšanu",
|
||||
"install_certificate": "Proxy sertifikāta instalēšana",
|
||||
@@ -23,7 +23,7 @@
|
||||
"language": "Izvēlēties valodu",
|
||||
"background": "Iestatīt pielāgotu fonu (saite vai attēla fails)",
|
||||
"theme": "Iestatīt tēmu",
|
||||
"patch_metadata": "Automātiski ielāpot metadatus",
|
||||
"patch_rsa": "Automātiski ielāpot RSA",
|
||||
"use_proxy": "Izmantot iekšējo starpniekserveri",
|
||||
"wipe_login": "Noslaucīt pieteikšanās kešatmiņu",
|
||||
"horny_mode": "Uzbudināts režīms"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"disabled": "Uitgeschakeld",
|
||||
"game_path": "Spel Installatie Pad Instellen",
|
||||
"game_executable": "Stel De Exe Van Het Spel In",
|
||||
"recover_metadata": "Noodherstel Van De Metadata",
|
||||
"recover_rsa": "Noodherstel Van De RSA",
|
||||
"grasscutter_jar": "Stel De Grasscutter JAR In",
|
||||
"toggle_encryption": "Versleuteling Inschakelen",
|
||||
"install_certificate": "Proxy-certificaat installeren",
|
||||
@@ -24,7 +24,7 @@
|
||||
"language": "Selecteer Taal",
|
||||
"background": "Aangepaste Achtergrond Instellen (link of afbeeldingsbestand)",
|
||||
"theme": "Thema instellen",
|
||||
"patch_metadata": "Metadata Automatisch Bijwerken",
|
||||
"patch_rsa": "RSA Automatisch Bijwerken",
|
||||
"use_proxy": "Gebruik Interne Proxy",
|
||||
"wipe_login": "Login cache wissen",
|
||||
"horny_mode": "Geile modus"
|
||||
@@ -71,9 +71,9 @@
|
||||
"gc_dev_data": "Download de nieuwste versie van de Grasscutter data bestanden, die niet met een jar file komen. Dit is handig voor het bijwerken.",
|
||||
"encryption": "Dit wordt meestal uitgeschakeld.",
|
||||
"resources": "Deze zijn ook nodig om een Grasscutter server te draaien. Deze knop zal grijs zijn als u een bestaande resources map heeft met inhoud erin",
|
||||
"emergency_metadata": "Voor het geval er iets fout is gegaan, herstel uw metadata naar de laatste offici<63>le versies metadata.",
|
||||
"emergency_rsa": "Voor het geval er iets fout is gegaan, herstel uw rsa naar de laatste offici<63>le versies rsa.",
|
||||
"use_proxy": "Gebruik de Cultivation interne proxy. U zou dit ingeschakeld moeten hebben, tenzij u iets als Fiddler gebruikt",
|
||||
"patch_metadata": "Patch en unpatch je spel metadata automatisch. Tenzij je met oude/niet-offici<63>le versies speelt, of je hebt je metadata handmatig gepatcht, zou dit ingeschakeld moeten zijn."
|
||||
"patch_rsa": "Patch en unpatch je spel rsa automatisch. Tenzij je met oude/niet-offici<63>le versies speelt, of je hebt je rsa handmatig gepatcht, zou dit ingeschakeld moeten zijn."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"disabled": "Выключено",
|
||||
"game_path": "Установить путь к файлам игры",
|
||||
"game_executable": "Установить исполняемый файл игры",
|
||||
"recover_metadata": "Принудительное восстановление Метаданных",
|
||||
"recover_rsa": "Принудительное удаление RSA",
|
||||
"grasscutter_jar": "Установить Grasscutter JAR",
|
||||
"toggle_encryption": "Переключить шифрование",
|
||||
"install_certificate": "Установить сертификат для работы Прокси",
|
||||
@@ -24,7 +24,7 @@
|
||||
"language": "Установить язык",
|
||||
"background": "Установить свой фон (ссылка или файл)",
|
||||
"theme": "Установить тему",
|
||||
"patch_metadata": "Автоматический патч Метаданных при запуске",
|
||||
"patch_rsa": "Автоматическое исправление RSA",
|
||||
"use_proxy": "Использовать встроенный Прокси",
|
||||
"wipe_login": "Очистить кэш входа в систему",
|
||||
"horny_mode": "роговой режим"
|
||||
@@ -71,9 +71,9 @@
|
||||
"gc_dev_data": "Скачать последнюю версию для разработки Grasscutter, в которой нету jar файла. Это полезно для обновления.",
|
||||
"encryption": "Обычно это должно быть выключено.",
|
||||
"resources": "Это необходимо для запуска сервера Grasscutter. Эта кнопка будет серой, если у Вас уже есть не пустая папка с ресурсами.",
|
||||
"emergency_metadata": "Если что-то пошло не так, восстановит Метаданные до последней официальной версии.",
|
||||
"emergency_rsa": "Если что-то пошло не так, восстановит RSA до последней официальной версии.",
|
||||
"use_proxy": "Использовать встроенный Прокси. Отключите если используете Fiddler или подобную программу",
|
||||
"patch_metadata": "Патчит и восстанавливает Метаданные автоматически. Если вы не играете на старых/модифицированых версиях, или сами в ручную патчите Метаданные, эта опция должна быть включена."
|
||||
"patch_rsa": "Патчит и восстанавливает RSA автоматически. Если вы не играете на старых/модифицированых версиях, или сами в ручную патчите Метаданные, эта опция должна быть включена."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"game_path": "Đường dẫn cài game",
|
||||
"game_command": "Lệnh khởi chạy game",
|
||||
"game_executable": "Tập tin thực thi game",
|
||||
"recover_metadata": "Khôi phục metadata khẩn cấp",
|
||||
"recover_rsa": "Khôi phục RSA khẩn cấp",
|
||||
"grasscutter_jar": "Tập tin JAR Grasscutter",
|
||||
"toggle_encryption": "Bật/tắt mã hóa",
|
||||
"install_certificate": "Cài chứng chỉ proxy",
|
||||
@@ -25,7 +25,7 @@
|
||||
"language": "Ngôn ngữ",
|
||||
"background": "Hình nền tùy chỉnh (liên kết hoặc tập tin hình ảnh)",
|
||||
"theme": "Giao diện",
|
||||
"patch_metadata": "Tự động vá metadata",
|
||||
"patch_rsa": "Tự động vá RSA",
|
||||
"use_proxy": "Sử dụng proxy nội bộ",
|
||||
"wipe_login": "Tẩy sạch cache đăng nhập",
|
||||
"horny_mode": "Chế độ hứng tình"
|
||||
@@ -72,9 +72,9 @@
|
||||
"gc_dev_data": "Tải xuống tệp dữ liệu phiên bản mới nhất của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.",
|
||||
"encryption": "Mục này nên được tắt.",
|
||||
"resources": "Tài nguyên được yêu cầu để chạy máy chủ Grasscutter. Nút này sẽ có màu xám nếu bạn đã có sẵn một thư mục tài nguyên (resources) có nội dung bên trong",
|
||||
"emergency_metadata": "Trong trường hợp gặp vấn đề, khôi phục lại metadata về phiên bản chính thức mới nhất.",
|
||||
"emergency_rsa": "Trong trường hợp gặp vấn đề, khôi phục lại RSA về phiên bản chính thức mới nhất.",
|
||||
"use_proxy": "Sử dụng proxy nội bộ của Cultivation. Nên bật tùy chọn này trừ khi bạn đang sử dụng một ứng dụng khác, như Fiddler",
|
||||
"patch_metadata": "Tự động vá và sửa lại metadata của game. Tùy chọn này nên được bật trừ khi bạn đang sử dụng phiên bản cũ, phiên bản không chính thức hoặc bạn đã tự vá metadata rồi."
|
||||
"patch_rsa": "Tự động vá và sửa lại RSA của game. Tùy chọn này nên được bật trừ khi bạn đang sử dụng phiên bản cũ, phiên bản không chính thức hoặc bạn đã tự vá rsa rồi."
|
||||
},
|
||||
"swag": {
|
||||
"akebi_name": "Akebi",
|
||||
|
||||
@@ -22,7 +22,6 @@ mod downloader;
|
||||
mod file_helpers;
|
||||
mod gamebanana;
|
||||
mod lang;
|
||||
mod metadata_patcher;
|
||||
mod proxy;
|
||||
mod system_helpers;
|
||||
mod unzip;
|
||||
@@ -119,8 +118,7 @@ fn main() {
|
||||
web::web_get,
|
||||
gamebanana::get_download_links,
|
||||
gamebanana::list_submissions,
|
||||
gamebanana::list_mods,
|
||||
metadata_patcher::patch_metadata
|
||||
gamebanana::list_mods
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
use regex::Regex;
|
||||
use std::{fs, fs::File, fs::OpenOptions, io::Read, io::Write, path::Path};
|
||||
|
||||
// For these two functions, a non-zero return value indicates failure.
|
||||
extern "C" {
|
||||
fn decrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||
fn encrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn patch_metadata(metadata_folder: &str) -> bool {
|
||||
let metadata_file = &(metadata_folder.to_owned() + "\\global-metadata-unpatched.dat");
|
||||
// check if metadata_file exists
|
||||
if !Path::new(metadata_file).exists() {
|
||||
println!("Metadata file not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
println!("Patching metadata file: {}", metadata_file);
|
||||
let decrypted = decrypt_metadata(metadata_file);
|
||||
if do_vecs_match(&decrypted, &Vec::new()) {
|
||||
println!("Failed to decrypt metadata file.");
|
||||
return false;
|
||||
}
|
||||
|
||||
let modified = replace_keys(&decrypted);
|
||||
if do_vecs_match(&modified, &Vec::new()) {
|
||||
println!("Failed to replace keys in metadata file.");
|
||||
return false;
|
||||
}
|
||||
|
||||
let encrypted = encrypt_metadata(&modified);
|
||||
if do_vecs_match(&encrypted, &Vec::new()) {
|
||||
println!("Failed to re-encrypt metadata file.");
|
||||
return false;
|
||||
}
|
||||
|
||||
//write encrypted to file
|
||||
let mut file = match OpenOptions::new()
|
||||
.create(true)
|
||||
.write(true)
|
||||
.open(&(metadata_folder.to_owned() + "\\global-metadata-patched.dat"))
|
||||
{
|
||||
Ok(file) => file,
|
||||
Err(e) => {
|
||||
println!("Failed to open global-metadata: {}", e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
file.write_all(&encrypted).unwrap();
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fn decrypt_metadata(file_path: &str) -> Vec<u8> {
|
||||
let mut file = match File::open(file_path) {
|
||||
Ok(file) => file,
|
||||
Err(e) => {
|
||||
println!("Failed to open global-metadata: {}", e);
|
||||
return Vec::new();
|
||||
}
|
||||
};
|
||||
let mut data = Vec::new();
|
||||
|
||||
// Read metadata file
|
||||
match file.read_to_end(&mut data) {
|
||||
Ok(_) => (),
|
||||
Err(e) => {
|
||||
println!("Failed to read global-metadata: {}", e);
|
||||
return Vec::new();
|
||||
}
|
||||
}
|
||||
|
||||
// Decrypt metadata file
|
||||
let success = unsafe { decrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||
if success {
|
||||
println!("Successfully decrypted global-metadata");
|
||||
data
|
||||
} else {
|
||||
println!("Failed to decrypt global-metadata");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
fn replace_keys(data: &[u8]) -> Vec<u8> {
|
||||
let mut new_data = String::new();
|
||||
|
||||
unsafe {
|
||||
let data_str = String::from_utf8_unchecked(data.to_vec());
|
||||
|
||||
let re = Regex::new(r"<RSAKeyValue>((.|\n|\r)*?)</RSAKeyValue>").unwrap();
|
||||
let matches = re.find_iter(&data_str);
|
||||
|
||||
// dispatch key is index 3
|
||||
// password key is index 2
|
||||
|
||||
for (i, rmatch) in matches.enumerate() {
|
||||
let key = rmatch.as_str();
|
||||
|
||||
if i == 2 {
|
||||
println!("Replacing password key");
|
||||
new_data = replace_rsa_key(&data_str, key, "passwordKey.txt");
|
||||
} else if i == 3 {
|
||||
println!("Replacing dispatch key");
|
||||
new_data = replace_rsa_key(&new_data, key, "dispatchKey.txt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new_data.as_bytes().to_vec();
|
||||
}
|
||||
|
||||
fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String {
|
||||
// Read dispatch key file
|
||||
unsafe {
|
||||
// Get key path from current directory
|
||||
let key_file_path = std::env::current_dir()
|
||||
.unwrap()
|
||||
.join("keys")
|
||||
.join(file_name);
|
||||
|
||||
let key_data = match fs::read(&key_file_path) {
|
||||
Ok(file) => file,
|
||||
Err(e) => {
|
||||
println!("Failed to open {}: {}", key_file_path.to_str().unwrap(), e);
|
||||
return String::new();
|
||||
}
|
||||
};
|
||||
|
||||
let new_key = String::from_utf8_unchecked(key_data.to_vec());
|
||||
|
||||
// Replace old key with new key
|
||||
old_data.replace(to_replace, &new_key)
|
||||
}
|
||||
}
|
||||
|
||||
fn encrypt_metadata(old_data: &[u8]) -> Vec<u8> {
|
||||
let mut data = old_data.to_vec();
|
||||
|
||||
let success = unsafe { encrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||
if success {
|
||||
println!("Successfully encrypted global-metadata");
|
||||
data
|
||||
} else {
|
||||
println!("Failed to encrypt global-metadata");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool {
|
||||
a == b
|
||||
}
|
||||
Reference in New Issue
Block a user