Skip to content

Instantly share code, notes, and snippets.

@trandaison
Last active June 2, 2025 14:32
Show Gist options
  • Save trandaison/40b1d83618ae8e3d2da59df8c395093a to your computer and use it in GitHub Desktop.
Save trandaison/40b1d83618ae8e3d2da59df8c395093a to your computer and use it in GitHub Desktop.
Get full version of StarUML

Note: This is the guide for v 2.x.

For the v3, please follow this url: https://blog.csdn.net/sam_shan/article/details/80585240 Thanks @liy-cn for contributing.

For the v6, please follow the comment below: https://gist.github.com/trandaison/40b1d83618ae8e3d2da59df8c395093a?permalink_comment_id=5079514#gistcomment-5079514

StarUML

Download: StarUML.io

Crack

Source: jorgeancal

After installing StartUML successfully, modify LicenseManagerDomain.js as follow:

/**
 * File name: LicenseManagerDomain.js
 * Mac OS: /Applications/StarUML.app/Contents/www/license/node/
 * Linux: /opt/staruml/www/license/node/
 */

(function () {
    "use strict";
 
    var NodeRSA = require('node-rsa');
 
    function validate(PK, name, product, licenseKey) {
        return{
           name: "sontd",
           product: "StarUML",
           licenseType: "vip",
           quantity: "unlimited",
           licenseKey: "no, thanks!"
        };
    }
 
    function init(domainManager) {
        if (!domainManager.hasDomain("LicenseManager")) {
            domainManager.registerDomain("LicenseManager", {major: 0, minor: 1});
        }
        domainManager.registerCommand(
            "LicenseManager", // domain name
            "validate",       // command name
            validate,         // command handler function
            false,            // this command is synchronous in Node ("false" means synchronous")
            "Validate License",
            [
                {
                    name: "PK",
                    type: "string",
                    description: "PK"
                },
                {
                    name: "name",
                    type: "string",
                    description: "name of license owner"
                },
                {
                    name: "product",
                    type: "string",
                    description: "product name"
                },
                {
                    name: "licenseKey",
                    type: "string",
                    description: "license key"
                }
            ],
            [
                {
                    name: "result", // return values
                    type: "object",
                    description: "result"
                }
            ]
        );
    }
 
    exports.init = init;
 
}());

Now, open it and go to Help > Enter License and you have to write the name and the licence key which you have written on LicenseManagerDomain.js. In this example would be the next:

name: "sontd"
License Key: "no, thanks!"

Enjoy it!

@riven-lol
Copy link

Instructions:

  1. Copy and paste this updated code into the app/src/engine/license-manager.js file.
  2. Run the following command to repackage the app: asar pack app app.asar

Updated Code:

const { EventEmitter } = require("events");
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const UnregisteredDialog = require("../dialogs/unregistered-dialog");
const packageJSON = require("../../package.json");

const SK = "DF9B72CC966FBE3A46F99858C5AEE";

// 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 PRO_DIAGRAM_TYPES.includes(diagramType);
  }

  /**
   * Get Registration Status
   * @return {string}
   */
  getStatus() {
    return status;
  }

  /**
   * Get License Information
   * @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) => {
      // Skip all validation and assume license is valid
      resolve('License is valid');  // Directly resolve the promise
    });
  }

  /**
   * Return evaluation period status
   * @Private
   * @return {number} Remaining days
   */
  checkEvaluationPeriod() {
    return 30;  // Always return a valid evaluation period (30 days remaining)
  }

  async checkLicenseValidity() {
    if (packageJSON.config.setappBuild) {
      setStatus(this, true);
    } else {
      try {
        // Always consider the license valid without validation
        const result = await this.validate();
        setStatus(this, true);
      } catch (err) {
        const remains = this.checkEvaluationPeriod();
        const isExpired = remains < 0;
        const result = await UnregisteredDialog.showDialog(remains);
        setStatus(this, false);
        if (isExpired) {
          app.quit();
        }
      }
    }
  }

  /**
   * 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) => {
      // Skip the server-side validation and assume success
      var data = { product: packageJSON.config.product_id, licenseKey: licenseKey };
      var file = path.join(app.getUserPath(), "/license.key");
      fs.writeFileSync(file, JSON.stringify(data, null, 2));
      licenseInfo = data;
      setStatus(this, true);
      resolve(data); // Always resolve as successful
    });
  }

  htmlReady() {}

  appReady() {
    this.checkLicenseValidity();
  }
}

module.exports = LicenseManager; 

There is a problem when exporting the file to image (PNG, JPG), the App will ask for licenseType and this code is null, so it unable to export the Image

update function below to fix it, i didn't test on PRO Diagram yet, but it's working for export image

var licenseInfo = {
  licenseType: "PRO",
};

register(licenseKey) {
    return new Promise((resolve, reject) => {
      var data = {
        product: packageJSON.config.product_id,
        licenseKey: licenseKey,
        licenseType: "PRO",
      };
      var file = path.join(app.getUserPath(), "/license.key");
      fs.writeFileSync(file, JSON.stringify(data, null, 2));
      licenseInfo = data;
      setStatus(this, true);
      resolve(data);
    });
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment