Offline->online = TA_FAIL - help!

I'm using the current drop in C++ and doing this:

HRESULT hr; GENUINE_OPTIONS opts; opts.nLength = sizeof(GENUINE_OPTIONS);

// How often to verify with the LimeLM servers (90 days) opts.nDaysBetweenChecks = 0;

// The grace period if TurboActivate couldn't connect to the servers. // after the grace period is over IsGenuinEx() will return TA_FAIL instead of // TA_E_INET or TA_E_INET_DELAYED opts.nGraceDaysOnInetErr = 0;

// Don't show an error if the activation was done offline opts.flags = TA_SKIP_OFFLINE;

hr = IsGenuineEx((STRCTYPE)gAppGUID, &opts);

My issues:

1. If the user goes offline and runs the software, they will continue to get an error from IsGenuineEx() even after the network connection is re-established (TA_FAIL).

2. With a working internet connection: If I revoke the user's license, I still get TA_FAIL. Expected: get TA_E_REVOKED.

3. If I restore a user's revoked license, I still get TA_FAIL. Expected: get TA_OK.

I noticed in the docs: \\ IsGenuineEx() previously had a TA_E_INET error, \\ and instead of hammering the end-user's network, \\ IsGenuineEx() is waiting 5 hours before rechecking on the network.

This would explain results 1-3, I suppose, but if this is the cause, that behavior is not acceptable:My software will be used in a high-volume production environment and if the software is waiting for 5 hours to pass before trying the internet connection again, there will be staff being paid to wait for nothing. Just imagine yourself using a laptop on the road where sometimes you have internet and sometimes you don't. As it stands now it seems like a connection failure takes you offline for 5 hours. You're at a trade show. It will all be over in 5 hours.

I would have expected that if nDaysBetweenChecks = 0 and nGraceDaysOnInetErr = 0, LimeLM would indeed ping the server when asked to do so.

Note that I tried changing 'GraceDaysonInErr' from 0 to 1 without any change in the results above.

I tried running TurboActivate.exe manually and was simply told "Activation was successful" but IsGenuineEx() from my app produces the same results.

If I shift from licensed to trial mode when a networking connection fails, then I need to shift back to being licensed the next time the software is run / IsGenuineEx() is called [because the paid users won't tolerate running in trial for 5 hours]. But I'm just getting TA_FAIL when I try to activate.

On the flip side, I noticed the suggested defaults of 90 days between checks and 14 days grace. That's not going to work for my business - that's an eternity - if I kill a license it needs to stop working now, if a trial ends or the network connection isn't available it again needs to stop working now, and if I restore the license it needs to start working now.

Any suggestions?

---Mike.

Right now, for example, I need to run my own software for sales demos... but because I'm getting TA_FAIL in spite of a valid serial number, I'm in trial mode and output is watermarked [my response to being in trial mode]. So I go into code and disable the licensing checks. End users won't be able to do this - they'll be really and truly stuck.

Your bug, a policy choice, or something in my code?

---Mike.

// How often to verify with the LimeLM servers (90 days)opts.nDaysBetweenChecks = 0;

Don't do that. The whole point of using IsGenuineEx() is that you don't hammer the activation servers every single time an instance of your app starts.

1. If the user goes offline and runs the software, they will continue to get an error from IsGenuineEx() even after the network connection is re-established (TA_FAIL).

Because you set nDaysBetweenChecks and nGraceDaysOnInetErr to 0.

Again, don't do that. Set a reasonable number of days. We recommend 90 and 14, but a good minimum might be 7 and 14 (so, check once a week and have a 2 week grace period if the customer has internet problems).

2. With a working internet connection: If I revoke the user's license, I still get TA_FAIL. Expected: get TA_E_REVOKED.

Hmm... it sounds like you were still in the 5 hour mandatory grace period that IsGenuineEx() goes into after a failed connection.

3. If I restore a user's revoked license, I still get TA_FAIL. Expected: get TA_OK.

No, that's not how it works. If you revoke a license the customer is deactivated and the key cannot be re-used unless you un-revoked the license. If you do unrevoked the license then the customer can enter their product key again and activate again.

Just imagine yourself using a laptop on the road where sometimes you have internet and sometimes you don't. As it stands now it seems like a connection failure takes you offline for 5 hours. You're at a trade show. It will all be over in 5 hours.

Again, don't use nDaysBetweenChecks and nGraceDaysOnInetErr to 0. That's your first mistake.

Also, use IsActivated() to see if the customer is activated (but not necessarily genuine), and if so give the customer a prompt that says they're activated and need to reverify with the servers. In that prompt have a button that says "recheck now" and in that button call IsGenuine() which rechecks immediately.

I'll try with IsGenuine(). It sounds like a better fit.

---Mike.

Right, but don't use it at every run of your app.

Im going to try using IsGenuineEx() and falling back on IsGenuine() as suggested, but I have misgivings.

A delay of a few minutes might be a reasonable compromise on NOW if load balancing is truly an intractable problem, But potentially only learning that a users license expired only 7 to 14 days after the fact isnt reasonable.And I dont see how it will be possible to within-reasonable-delay detect a revoked license, or an unrevoked license, or a restored network connection, without actually interacting with your servers [e.g. using IsGenuine()] at each run.

Sam wrote:> don't use it at every run of your app.

This is troubling for two reasons:

1. "handling the back end" is your main value proposition.

Checking the license status and getting correct, current answers is a basic use case. So solving load balancing for servers is a basic requirement. It's what I'm buying from you!

2. Your advice on other matters would increase the server load 100-fold.

I'm running a SAAS platform. You advised me to ping the server once per billable action: https://wyday.com/forum/t/2628/tracking-feature-usage-count/#post-13177 This might happen 100 times per hour, as opposed to once per day. (Which I consider a completely reasonable requirement)

---Mike.

1. "handling the back end" is your main value proposition.

Checking the license status and getting correct, current answers is a basic use case.So solving load balancing for servers is a basic requirement.It's what I'm buying from you!

Right, and we do. But hammering the servers doesn't gain you (or your customers) anything. Even only contacting the servers once a day is a much better use case.

Not only that, but if you do contact our servers at every run of your app (note: not once a day, but on every single instance that is started X times a day) you're forcing your customers to:

1. ... always be connected to a network.2. ... have the network always be 100% functional (which may or may not be true)

In other words, if the customer isn't connected to the internet, and you call IsGenuine() instead of IsGenuineEx(), then they'll either not be able to use your app or always be able to use your app regardless of whether they ever let your app re-contact the servers. (Of course this depends on which way you go with handling TA_E_INET).

Short answer: use IsGenuineEx() for the main use-case and only use IsGenuine() if you want to show a pop-up that let's the user manually re-try immediately.

I'm running a SAAS platform.You advised me to ping the server once per billable action:https://wyday.com/forum/t/2628/tracking-feature-usage-count/#post-13177 This might happen 100 times per hour,as opposed to once per day.(Which I consider a completely reasonable requirement)

Whichever is easier or makes better business senses is the best way to go.

2. Your advice on other matters would increase the server load 100-fold.

It wouldn't. Re-verifying activations require an order of magnitude more processing power than updating custom license fields.

Thanks for the reply, appreciated.

In my particular case I'm selling a high-value software package to a few tens of professional customers whose businesses will suffer if they go offline... so I can be hard-core about access and it's okay.

A thought,I'd be happy to have a grace period measured in hours, if it makes a difference to your server bill... And this thread was triggered by my assuming a zero-day delay made sense...why not unify IsGenuineEx() and IsGenuine() by having the delay params become floats [so 0.1 days is an acceptable delay], and have a delay of 0 simply mean "actually ping the server"] ..?

> field value is light to retrieve

cool, got it

--Mike.