ISV add-on license model

mseifertmseifert Member Posts: 4
Hi

We have developed a Navision add-on for VMI and are designing the license structure. The license will be rather expensive that thus, we would like to be able to sell user licenses as well. We would like the license to follow the number of NAV licenses, but that is not possible, according to Microsoft. They suggested that we would write some code to accommodate it.

Have any of you experience in license models for NAV add-on and could guide us in what it possible (and practical)?


// Morten Seifert
// Morten

Comments

  • matttraxmatttrax Member Posts: 2,309
    NAV itself really does not work for this.

    You can do concurrent users, but you have to store the max count somewhere. And that can be changed by a skilled SQL programmer, or anyone with a NAV Designer's License. Same deal with named users I guess. You'll have to think outside the NAV box. Maybe store it in the registry or in a dll file somewhere.

    I'm a little surprised you can't have two granules in your add-on. One for user count and one for the actual software. So they would buy 10 of the user granule for your add-on and 1 of the code granule. I guess even with that there'd be a way around it. You'd be writing code to limit the number of records in a custom table with a SQL Developer / NAV Developer could remove.

    Definitely an interesting challenge.
  • kinekine Member Posts: 12,562
    We have solved it with some combination of NAV code and signed config file ("license" file) which we are generating for each customer.
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • mseifertmseifert Member Posts: 4
    I like the idea of using a user granule. I have created the following code, which keeps track of sessions using my application (each object would need to called the Codeunit to check for license).

    I then have a table "Pitory Setup", which holds the number of licenses allowed. However, as matttrax said, it could be modified from a SQL Server.

    By using the table "License Information", I should be able to find the user granule and the number of times it has been purchased and use that number is stead of my "Pitory Setup"."Concurrent Users".

    Any thoughts?

    OBJECT Table 6077825 Pitory User Session
    {
      OBJECT-PROPERTIES
      {
        Date=01-03-10;
        Time=14:17:21;
        Modified=Yes;
        Version List=;
      }
      PROPERTIES
      {
      }
      FIELDS
      {
        { 1   ;   ;Connection ID       ;Integer        }
        { 2   ;   ;User ID             ;Text30         }
      }
      KEYS
      {
        {    ;Connection ID,User ID                   ;Clustered=Yes }
      }
      FIELDGROUPS
      {
      }
      CODE
      {
    
        BEGIN
        END.
      }
    }
    
    OBJECT Codeunit 6077824 Pitory User Mgt.
    {
      OBJECT-PROPERTIES
      {
        Date=01-03-10;
        Time=11:26:51;
        Modified=Yes;
        Version List=;
      }
      PROPERTIES
      {
        OnRun=BEGIN
                StartSession();
              END;
    
      }
      CODE
      {
    
        PROCEDURE StartSession@1000000000();
        VAR
          PitorySetup@1000000002 : Record 6077824;
          Session@1000000000 : Record 2000000009;
          PitorySession@1000000001 : Record 6077825;
          TXT_ConcurrentUsersExceeded@1000000003 : TextConst 'DAN=Antallet af samtidigere brugere overskredet.\Antal brugere: %1\Antal licenser: %2';
        BEGIN
          // Clean Sessions
          IF PitorySession.FINDSET(TRUE) THEN REPEAT
            IF NOT Session.GET(PitorySession."Connection ID") THEN
              PitorySession.DELETE()
            ELSE
              IF PitorySession."User ID" <> UPPERCASE(Session."User ID") THEN
                PitorySession.DELETE();
          UNTIL PitorySession.NEXT = 0;
    
          // Insert
          Session.RESET();
          Session.SETRANGE("My Session", TRUE);
          Session.FINDFIRST();
    
          PitorySession.INIT();
          PitorySession."Connection ID" := Session."Connection ID";
          PitorySession."User ID" := UPPERCASE(Session."User ID");
          IF NOT PitorySession.INSERT() THEN
            ; // OK
    
          // Count
          PitorySetup.GET('');
          PitorySession.RESET();
          IF PitorySession.COUNT() > PitorySetup."Concurrent Users" THEN
            ERROR(TXT_ConcurrentUsersExceeded, PitorySession.COUNT(), PitorySetup."Concurrent Users");
        END;
    
        BEGIN
        END.
      }
    }
    
    // Morten
  • kinekine Member Posts: 12,562
    May be good is to add the Login date and time to the table to check these two values for change.
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • matttraxmatttrax Member Posts: 2,309
    mseifert wrote:
    By using the table "License Information", I should be able to find the user granule and the number of times it has been purchased and use that number is stead of my "Pitory Setup"."Concurrent Users".

    But again, if this is NAV code that just looks at the License Information table instead, people like me can go in and change it. Just stick an EXIT(99999) at the top of the function that returns the max user count.

    Even if it is a dll file that can be de-compiled and re-compiled. I don't know much about signing config files and how that works, but it sounds promising.
  • David_SingletonDavid_Singleton Member Posts: 5,479
    mseifert wrote:
    I like the idea of using a user granule. I have created the following code, which keeps track of sessions using my application (each object would need to called the Codeunit to check for license).

    I then have a table "Pitory Setup", which holds the number of licenses allowed. However, as matttrax said, it could be modified from a SQL Server.

    I think you are making it too complex.

    Start out buy acknowledging that no matter what you do, some customer will crack the code if you want to. Then work on the basis that your customers are not criminals at heart.

    Now put basic code in there that counts users and give a warning. But don't go out of your way to make it hacker proof. Sure you will get some customers that try to cheat, but really most will be honest and not steal your software.

    Just make it very very clear to the end user that if they exceed the user count they are in breach of contract, and have a contract that makes it worth your while to sue them if they do.
    David Singleton
  • matttraxmatttrax Member Posts: 2,309
    Start out buy acknowledging that no matter what you do, some customer will crack the code if you want to.

    This is true with every piece of software. Given NAV's "open source" nature, it becomes even more true. Most customer's don't have developer licenses and they would have to go through a partner to make this kind of change. Hopefully the partner(s) you would be dealing with would not do this kind of thing.
Sign In or Register to comment.