From eeaa34e4c32ba1f1a8eb66521b7d027666886520 Mon Sep 17 00:00:00 2001 From: wangpengfei Date: Mon, 19 Feb 2024 23:37:47 +0800 Subject: [PATCH] add StarUML --- tool/StarUML/license-manager.js | 175 ++++++++++++++++++++++++++++++++ tool/StarUML/main.py | 43 ++++++++ 2 files changed, 218 insertions(+) create mode 100644 tool/StarUML/license-manager.js create mode 100644 tool/StarUML/main.py diff --git a/tool/StarUML/license-manager.js b/tool/StarUML/license-manager.js new file mode 100644 index 0000000..089d910 --- /dev/null +++ b/tool/StarUML/license-manager.js @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2013-2014 Minkyu Lee. All rights reserved. + * + * NOTICE: All information contained herein is, and remains the + * property of Minkyu Lee. The intellectual and technical concepts + * contained herein are proprietary to Minkyu Lee and may be covered + * by Republic of Korea and Foreign Patents, patents in process, + * and are protected by trade secret or copyright law. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from Minkyu Lee (niklaus.lee@gmail.com). + * + */ + +const { EventEmitter } = require("events"); +const fs = require("fs"); +const path = require("path"); +const crypto = require("crypto"); +const UnregisteredDialog = require("../dialogs/unregistered-dialog"); +const SK = "DF9B72CC966FBE3A46F99858C5AEE"; +const packageJSON = require("../../package.json"); + +// Check License When File Save +const LICENSE_CHECK_PROBABILITY = 0.3; + +const PRO_DIAGRAM_TYPES = [ + "SysMLRequirementDiagram", + "SysMLBlockDefinitionDiagram", + "SysMLInternalBlockDiagram", + "SysMLParametricDiagram", + "BPMNDiagram", + "WFWireframeDiagram", + "AWSDiagram", + "GCPDiagram", +]; + +var status = false; +var licenseInfo = null; + +/** + * Set Registration Status + * This function is out of LicenseManager class for the security reason + * (To disable changing License status by API) + * @private + * @param {boolean} newStat + * @return {string} + */ +function setStatus(licenseManager, newStat) { + if (status !== newStat) { + status = newStat; + licenseManager.emit("statusChanged", status); + } +} + +/** + * @private + */ +class LicenseManager extends EventEmitter { + constructor() { + super(); + this.projectManager = null; + } + + isProDiagram(diagramType) { + return true; + } + + /** + * Get Registration Status + * @return {string} + */ + getStatus() { + return status; + } + + /** + * Get License Infomation + * @return {Object} + */ + getLicenseInfo() { + return licenseInfo; + } + + findLicense() { + var licensePath = path.join(app.getUserPath(), "/license.key"); + if (!fs.existsSync(licensePath)) { + licensePath = path.join(app.getAppPath(), "../license.key"); + } + if (fs.existsSync(licensePath)) { + return licensePath; + } else { + return null; + } + } + + /** + * Check license validity + * + * @return {Promise} + */ + validate() { + return new Promise((resolve, reject) => { + try { + // Local check + var file = this.findLicense(); + if (!file) { + reject("License key not found"); + } else { + var data = fs.readFileSync(file, "utf8"); + licenseInfo = JSON.parse(data); + resolve(licenseInfo); + } + } catch (err) { + reject(err); + } + }); + } + + checkLicenseValidity() { + if (packageJSON.config.setappBuild) { + setStatus(this, true); + } else { + this.validate().then( + () => { + setStatus(this, true); + }, + () => { + setStatus(this, false); + UnregisteredDialog.showDialog(); + }, + ); + } + } + + /** + * Check the license key in server and store it as license.key file in local + * + * @param {string} licenseKey + */ + register(licenseKey) { + return new Promise((resolve, reject) => { + var data = { + name: "QiuChenlyTeam", + product: "STARUML.V6", + licenseType: "PRO", + quantity: "99999", + timestamp: "1575275098", + licenseKey: "88888888888888", + crackedAuthor: "BilZzard" + } + if (data.product === packageJSON.config.product_id) { + var file = path.join(app.getUserPath(), "/license.key"); + fs.writeFileSync(file, JSON.stringify(data, 2)); + licenseInfo = data; + setStatus(this, true); + resolve(data); + } + }); + } + + htmlReady() { + this.projectManager.on("projectSaved", (filename, project) => { + var val = Math.floor(Math.random() * (1.0 / LICENSE_CHECK_PROBABILITY)); + if (val === 0) { + this.checkLicenseValidity(); + } + }); + } + + appReady() { + this.checkLicenseValidity(); + } +} + +module.exports = LicenseManager; diff --git a/tool/StarUML/main.py b/tool/StarUML/main.py new file mode 100644 index 0000000..947bedf --- /dev/null +++ b/tool/StarUML/main.py @@ -0,0 +1,43 @@ +import os + +# 检查是否安装了 asar 命令 +def check_asar_command(): + return os.system("command -v asar > /dev/null 2>&1") == 0 + +if not check_asar_command(): + print("草泥马,先安装asar。") + exit(1) + +# 获取用户输入的用户名 +username = input("请输入用户名: ") +# 执行bash命令 +bash_extract = """ +cd /Applications/StarUML.app/Contents/Resources && asar extract app.asar app +""" +os.system(bash_extract) + +# 复制license-manager.js文件到目标位置 +destination_path = "/Applications/StarUML.app/Contents/Resources/app/src/engine/" +os.system("cp -f license-manager.js {}".format(destination_path)) + + +# 将字符串中的"BilZzard"替换为用户输入的文本 +with open(destination_path + "license-manager.js", 'r') as file: + js_content = file.read() +new_js_content = js_content.replace('QiuChenlyTeam', username) + +# 将替换后的内容写回到js文件 +with open(destination_path + "license-manager.js", 'w') as file: + file.write(new_js_content) + +# 执行bash命令 +print("需要修复app,看到提示后输入root密码。") + +bash_pack = """ +cd /Applications/StarUML.app/Contents/Resources && +asar pack app app.asar && +rm -rf app && sudo xattr -r -d com.apple.quarantine /Applications/StarUML.app +""" +os.system(bash_pack) + +print("脚本执行完成。请打开后从设置-隐私与安全中打开!之后随便输入激活码即可激活!")