/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ /** Contains static utilities for generating key-files that can be unlocked by the OnlineUnlockStatus class. */ class JUCE_API KeyGeneration { public: /** Generates the content of a key-file which can be sent to a user's machine to unlock a product. The returned value is a block of text containing an RSA-encoded block, followed by some human-readable details. If you pass this block of text to OnlineUnlockStatus::applyKeyFile(), it will decrpyt it, and if the key matches and the machine numbers match, it will unlock that machine. Typically the way you'd use this on a server would be to build a small executable that simply calls this method and prints the result, so that the webserver can use this as a reply to the product's auto-registration mechanism. The keyGenerationAppMain() function is an example of how to build such a function. @see OnlineUnlockStatus */ static String JUCE_CALLTYPE generateKeyFile (const String& appName, const String& userEmail, const String& userName, const String& machineNumbers, const RSAKey& privateKey); //============================================================================== /** This is a simple implementation of a key-generator that you could easily wrap in a command-line main() function for use on your server. So for example you might use this in a command line app called "unlocker" and then call it like this: unlocker MyGreatApp Joe_Bloggs joebloggs@foobar.com 1234abcd,95432ff 22d9aec92d986dd1,923ad49e9e7ff294c */ static inline int keyGenerationAppMain (int argc, char* argv[]) { StringArray args; for (int i = 1; i < argc; ++i) args.add (argv[i]); if (args.size() != 5) { std::cout << "Requires 5 arguments: app-name user-email username machine-numbers private-key" << std::endl << " app-name: name of the product being unlocked" << std::endl << " user-email: user's email address" << std::endl << " username: name of the user. Careful not to allow any spaces!" << std::endl << " machine-numbers: a comma- or semicolon-separated list of all machine ID strings this user can run this product on (no whitespace between items!)" << std::endl << " private-key: the RSA private key corresponding to the public key you've used in the app" << std::endl << std::endl; return 1; } if (! args[4].containsChar (',')) { std::cout << "Not a valid RSA key!" << std::endl; return 1; } std::cout << generateKeyFile (args[0], args[1], args[2], args[3], RSAKey (args[4])) << std::endl; return 0; } };