Simple copy protection done right :)



  • @d-healey Outstanding! Thank you!



  • @Christoph-Hart I am trying to check the serial input on 2 different serial lists. There are two serial lists;

    • Bundle serials (stores and checks the file in "../Individual_RegistrationInfo.js" )
    • Individual serials (stores and checks the file in "../Bundle_RegistrationInfo.js" )

    It works on bundle serial list checking but not works on Individual serial list 😞 What is the thing that I missed?

    namespace Authorisation
    {
        const var SerialInput = Content.getComponent("SerialInput");
        const var Description = Content.getComponent("Description");
        const var SerialStateLabel = Content.getComponent("SerialStateLabel");
        const var AuthorisationDialogue = Content.getComponent("AuthorisationDialogue");
    
        
        
        inline function onSubmitButtonControl(component, value)
        {
          if(!value) 
                return;
        
            local v = SerialInput.getValue();
            Console.print(v);
    	
    // Checks if it's in the Individual Serial sList
            if(Individual_serials.Data.contains(v))
            {
                Console.print("Serial number found");
            
                local data = 
                {
                    "Serial": v
                };
            
    // Saves as Individual_RegistrationInfo.js 
                Engine.dumpAsJSON(data, "../Individual_RegistrationInfo.js");
                
                setValidLicense(true);
            }
            
      
     // Checks if it's in the Bundle Serial sList
        if(Bundle_serials.Data.contains(v))
            {
                Console.print("Serial number found");
            
                local data = 
                {
                    "Serial": v
                };
    
     // Saves as Bundle_RegistrationInfo.js 
                Engine.dumpAsJSON(data, "../Bundle_RegistrationInfo.js");
                
                setValidLicense(true);
            }      
    
            
            else
            {
                Console.print("Invalid serial number");
                Description.set("text", "INVALID KEY THAT DOES NOT MATCH WITH YOUR LICENSE");
                
                setValidLicense(false);
            }
        };
    
        Content.getComponent("SubmitButton").setControlCallback(onSubmitButtonControl);
    
    
    
        inline function setValidLicense(isValid)
        {
                
            if(isValid)
            {
                // My action
            }
            else
            {
                // My action
            }
        }
    
        inline function checkOnLoad()
        {
            SerialInput.set("text", "");
            
    // Load the serial from the stored files
    
            local pData_Individual = Engine.loadFromJSON("../Individual_RegistrationInfo.js");
            local pData_Bundle = Engine.loadFromJSON("../Bundle_RegistrationInfo.js");
            
            Console.print("Checking serial");
        
    // Individual serials
            if(pData_Individual)    
            {
                local v = pData_Individual.Serial;
                Console.print("Restored serial: " + v);
            
               if(Individual_serials.Data.contains(v))
                {
                    setValidLicense(true);
                    return;
                }
        }
    
    // Bundle serials    
          if(pData_Bundle)    
            {
                local v = pData_Bundle.Serial;
                Console.print("Restored serial: " + v);
            
               if(Bundle_serials.Data.contains(v))
                {
                    setValidLicense(true);
                    return;
                }      
        }
    
          setValidLicense(false);
      }    
        
    // Call this on startup
        checkOnLoad();
    
    }
    


  • Basics:

    if(x)
    {
        // Will be executed if x is true
    }
    if(y)
    {
       // will be executed if y is true
    }
    else
    {
       // will be executed if y is false 
       // no matter what x is
    }
    

    Solution:

    else if(y)
    

    Protipp: y is Bundle_serials.Data.contains(v) 🙂



  • @staiff I already did it

    reg.png



  • This post is deleted!


  • Have you guys seen https://soraco.co/ ? It appears to be $900 (one time fee) for 1 cross platform license server. Have you guys seen anything more cost effective?
    @Christoph-Hart Could this be implemented with a HISE product?



  • @dustbro said in Simple copy protection done right 🙂:

    Have you guys seen https://soraco.co/ ? It appears to be $900 (one time fee) for 1 cross platform license server. Have you guys seen anything more cost effective?
    @Christoph-Hart Could this be implemented with a HISE product?

    Only works with Windows by the looks of it and not compatible with the GNU GPL.

    Edit: oh actually is says Mac and Android too, but at the bottom of the page it only has Windows compatibility labels... no GNU/Linux support either. Also, how would this be any better than the server/client license (not the simple copy protection discussed in this thread) Christoph already provides?



  • @d-healey This would be for closed source projects.

    @d-healey said in Simple copy protection done right 🙂:

    how would this be any better than the server/client license Christoph already provides?

    This would give you the ability to offer Trial licenses, as well as subscriptions.



  • @dustbro said in Simple copy protection done right 🙂:

    @d-healey This would be for closed source projects.

    Oh definitely, but HISE is licensed under the GNU GPL, so Christoph would have to either provide two binaries and sets of source code, one with the proprietary code and one without, or offer a way for individual developers to link HISE to Soraco themselves - assuming Soraco allows you to connect to their system in a way that is GNU GPL compatible.



  • To be honest I have no interest embedding other copy protection services. There is the GPL way, the simple solution sketched up here and an inhouse solution for more advanced copy protection so there are plenty of options available.

    I embedded TurboActivate in a product a few years ago and it was absolute nightmare so I vowed to myself to never do this again 😉



  • @d-healey said in Simple copy protection done right 🙂:

    but HISE is licensed under the GNU GPL

    Honestly, I don't know the intricacies of the licenses. 🙂 I just assumed that you pay a fee for a commercial version of HISE, and you do what you want with it.

    @Christoph-Hart said in Simple copy protection done right 🙂:

    I have no interest embedding other copy protection services

    Fair enough! It looks like I'll be investigating your inhouse solution shortly.



  • @dustbro said in Simple copy protection done right 🙂:

    Honestly, I don't know the intricacies of the licenses. 🙂 I just assumed that you pay a fee for a commercial version of HISE, and you do what you want with it.

    You can't mix proprietary software with any software licensed under the GNU GPL, it has to be 100% free. But you can link to proprietary software as long as it's independent.

    The HISE commercial license doesn't mean you are suddenly able to release commercial plugins - you already have that freedom with the GNU GPL - it's called a commercial license because you have to pay for it. And what it grants you is the freedom to restrict your users (isn't that nice 😛 )


Log in to reply
 

9
Online

517
Users

1.9k
Topics

14.6k
Posts