Skip to content

Commit 59373bb

Browse files
authored
Merge pull request #12 from muflihun/develop
v1.0.3
2 parents 172edd6 + 148f91c commit 59373bb

11 files changed

Lines changed: 81 additions & 40 deletions

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Change Log
22

3+
## [1.0.3] - 10-01-2018
4+
### Fixes
5+
- Fix date format across different timezones
6+
37
## [1.0.2] - 09-01-2018
48
### Updates
59
- Removed unnecessary zlib dependency

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ option (travis "Travis CI" OFF)
88

99
set (LICENSEPP_MAJOR "1")
1010
set (LICENSEPP_MINOR "0")
11-
set (LICENSEPP_PATCH "2")
11+
set (LICENSEPP_PATCH "3")
1212

1313
set (LICENSEPP_SOVERSION "${LICENSEPP_MAJOR}.${LICENSEPP_MINOR}.${LICENSEPP_PATCH}")
1414
set (LICENSEPP_NAME "licensepp")

license++/license.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,16 @@ class License
9696

9797
///
9898
/// \brief Loads itself from base64 input
99+
/// \throws LicenseException if license is invalid
99100
///
100101
bool load(const std::string& licenseBase64);
101102

103+
///
104+
/// \brief Loads itself from license file containing base64 license
105+
/// \throws LicenseException if license is invalid
106+
///
107+
bool loadFromFile(const std::string& licensefile);
108+
102109
protected:
103110

104111
unsigned long m_issueDate;

sample/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
### Sample
2+
3+
After you build using `make` run:
4+
5+
```
6+
./license-manager-sample --license sample.licensepp
7+
```
8+
9+
```
10+
./license-manager-sample --license sample-with-signature.licensepp --signature sample-signature
11+
```

sample/license-manager.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,12 @@ class LicenseKeysRegister
2323

2424
const unsigned char LicenseKeysRegister::LICENSE_MANAGER_SIGNATURE_KEY[] =
2525
{
26-
0x27, 0xD4, 0x91, 0x55, 0xE6, 0x6D, 0xC3, 0x11, 0x8D, 0xC0, 0x52, 0x0B, 0x2C, 0x9F, 0x84, 0xF3,
26+
0x5B, 0x6A, 0xF5, 0x93, 0xED, 0xAB, 0xB3, 0x10, 0xF5, 0xBE, 0x00, 0xE6, 0x4F, 0x1B, 0x70, 0xC8
2727
};
2828

2929
const std::vector<IssuingAuthority> LicenseKeysRegister::LICENSE_ISSUING_AUTHORITIES = {
30-
IssuingAuthority("custom-license-manager-1", "Muflihun Labs 1", "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlDV3dJQkFBS0JnUUMrTU9RbGhUUlhRTXRuK1JpdjNwVWNWdmdZdkpiWG5SeHdSL24xcTFPR1llUWlEdVY4CmlOOVcyQlVDQWVjVE1CVEJMK0xZSndpMnErWEVWclZZZjF6NTVPRWpicmJyK3hRQitJYU5uNTIzWUpRRGdQd1IKU0ROMnp5dzhmSDRBUVVENjk3VnRYamJaVXFaL1ZOZU1iaFJoRnhJV2lkMDVIVkE1THM5bkdFMllNd0lCRVFLQgpnRTVRWGZGVTkyODR6RG5mQ2lwTWw4QmdDODN6VFN1YkM3WERTTTZSMXhrM1hlL29CQ1E0Vy9hVk5kT21ialVUCnpFK01NRHJpNVhoazVpT3JPNXpwSmtnUjJpVGszb2xJK1YvUVNacXBnZ2xBRnJ5aVMzVW1IMTlLVmVKdERaTmgKK2ZtU21WL0Y0T0xhNTFIVTY5eEYzZUdTRmlMVnNiY2ZMUVhtdVpUNDBJNDVBa0VBMWVkMDJOdDd0VUp2VU5vdApoWGUwTk1FTWFUdFZsbVk3WHFxcTNNOG5kRFhoTkxmL1loVFQ1MVNRQkp6U1hYa2pNRnI1NU5NclhQMkxjdnFkClhTeXNwd0pCQU9PZXdyTXN0U2JocWZiNW4xbnFOZGxTbXJJdURPZUJDdUNNYTd0cFRrelFseFhTRjYzYlRETWcKS0pSSEVOU2s5WVB2RVRCYWRaa3VldFNrWC9FbWJaVUNRUUN3S0FYZnc4OUorbm5LSFJadDZodnZOWkhBRXI3MApWRERrakl5MTE4WWpkNnBucHBZVWlaOXpOcFM0Z1NXMlk4S2dTdXZwbnRocXNxOFRaUG9RZnlURkFrQnJIWWpNCnliNm80cXBXR3gzUDliNzgyNVFYblRNL3hFRmFuRzd1eUNUWTJxRnpyaWxDd1kxRlBFOVUxaVlKdHdvZitBZ1cKd1NoSUZkOXpJQzBtTURPUkFrRUFnck92a2F6ZHJkVm0rT3ViUksrcUFyb2I0anJzWS9HQURiVE9rMkZmZndzQwpRd1NGdE9TcnkvZjhDRDRuRkcySDh6ekRrQjFvZUc3Z1ZPdC81R2dscEE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZE1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTEFEQ0Jod0tCZ1FDK01PUWxoVFJYUU10bitSaXYzcFVjVnZnWQp2SmJYblJ4d1IvbjFxMU9HWWVRaUR1VjhpTjlXMkJVQ0FlY1RNQlRCTCtMWUp3aTJxK1hFVnJWWWYxejU1T0VqCmJyYnIreFFCK0lhTm41MjNZSlFEZ1B3UlNETjJ6eXc4Zkg0QVFVRDY5N1Z0WGpiWlVxWi9WTmVNYmhSaEZ4SVcKaWQwNUhWQTVMczluR0UyWU13SUJFUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=", 24U, true), // 1 day - no-secret
31-
IssuingAuthority("custom-license-manager-2", "Muflihun Labs 2", "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlDV2dJQkFBS0JnUUN6amhXNEx4TVVEMzQzT2pyZyt6TEJpWmVsQ1lEMjFReEdKS2liUDVKTnN1d0xlSEUzCmZ1RzV5VjBEbEJ4R3YwazdmNDgvRHhwSDdCcmk2TU4vaUxYYU1wYkFBUVZBYXBBWTFUcys1UndCTXN5OGdvNzEKYWdoektQRFRTenB0V3hsVFFRbkpxakJXamp5V3BwdklqbWJBdnpFZXNMUEwzMHpyeW56Y0xkeG8xd0lCRVFLQgpnQ28vaktQTzExQURwVG9yMFo1Wk9SNTZ1a1R6TFdkQk1CQ0JHSnovNWpCbVZhaFlreHdkMnNKTmYwd2kyWG9PCjVBMy81WGcveWZMT0pIR2dMZi9qN28xTVRpMUlBTUk4czNYSFk3R084TUprVERaTVdSV3hpamE2YllWSFNnTUoKNVlsRmZseTVvSTVOMDQyZUV3OG54YUF0cmxTcnJKSW9KbHRIMHZKalI4TFJBa0VBNlJOMXgwWnk4YXZaMmdUawpMbTZnYlAzQVluUTR1T2hCdHJ4emE5RS9NNDJsSGkzUThqK3Q3M0phMTIzK1dlUXExb0hTOEk5RHFJbXZMT010ClVBT3hQUUpCQU1VM0NjZTdrL2JwaW12T3FCY3VKcHVMRlZ1Z0lINlV5Tm5pNlhCdW9UMThKcnVDN3FNR1M5UUgKSWU5Y3ljdDZyU2FLWSthSEd3d2dPS3haS0xmbnU2TUNRUUNraGpVRklxdDlhajlzdUNpWlB3ZlVkdUluWVJqNgova3lBL1g2bWRaWUdSZDMzTDJaUXBXdTRGSHhiMVN3RE42WEVsK0F4VmhHa0pQUWZyMnRIaWlMQkFrQi9uQlZqCkh3VmppQTVGd2ZSTE8vcmRIY0tHbE1tN1VUYXJHbHJRUjVXQ0l5Z2UrbDR0UUU4dTEzQlBsbVIwbXF4R0hVK3oKU0Z6TG5HRG4vWFN6TzVlSEFrQUtCOEdLODhFSmZmVDBkOWs5eitjT3hnSmdVbVNMa2o3NWxKalpCbXZhaUZ0dgpQanN0L2J2Z0xXQ09Fd1ZJY1l6aHFoK1JNTURGYlpiSy9tbjlTVVV5Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZE1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTEFEQ0Jod0tCZ1FDempoVzRMeE1VRDM0M09qcmcrekxCaVplbApDWUQyMVF4R0pLaWJQNUpOc3V3TGVIRTNmdUc1eVYwRGxCeEd2MGs3ZjQ4L0R4cEg3QnJpNk1OL2lMWGFNcGJBCkFRVkFhcEFZMVRzKzVSd0JNc3k4Z283MWFnaHpLUERUU3pwdFd4bFRRUW5KcWpCV2pqeVdwcHZJam1iQXZ6RWUKc0xQTDMwenJ5bnpjTGR4bzF3SUJFUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=", 25U, true), // 25 hours max - no-secret
32-
IssuingAuthority("custom-license-manager-3", "Muflihun Labs 3", "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpQcm9jLVR5cGU6IDQsRU5DUllQVEVECkRFSy1JbmZvOiBBRVMtMjU2LUNCQyw1RUQ3NkIwQzM0Q0QwMzM5ODY5NzJEMTg1QTRDNzk4QwoKNkp6UENtTUVQbjJJeWxaLzhJYlRmNzlTYVJmT281WXAweTgwVjU5TDNZZXQyekswQ3l6aUpBQWdpMHdJN1pobgpkSFZoNTBVeFBEQmZuem42SWwyOXJncDlFSDNSY1VwMlRpNkN5N21IUE5Pb1lMeXlOVXZCd2VGS1cxTEx4czV5CkRKWnFQVmFkZllpNGx4SUZPdFd3K3V4V3BoOWVzcFh1bk0vK0p3d29qd24wL1FnODBNT0ZDYU5YdG9WMUh5ZUgKUWI0TEZUQmk5Qk04RHZMeGJ4Q0xwTCtjZ0hrcTZ4S29sREtKYk0wN0N1ckU0ZktjaXFPREIvaUxUK1BjazRrawpkcUNuem1GWjd2b1NOZ2tBblNtWWw2d2drWmROc0pqaGpwVGJDd0tVcUdTQ1Y0MnRoZElQeVNvSE5sdkw2ZU1WCmRnQmd3ckhiR3RUOWVqN25qcGVKcjNDSFhKWTlaWUEybUJTcGJST0hYZHRJcGROVE9aRllwS0RPUEc0U2pZNi8KUzNBUlJtN0hZazFhNUFjWndBRTlTelEyODI5dFBMcGhnR0R3K2QzTU5SakpnME44a2tBZ3NSQ29DMEx5WVExdwpxM3hFVnJHcjRwWHd5R1A0ckp1T0VaaTg1Q0loYzY2Mnp1Tml1elBRYW9WNVlyY1hDZE1JUjRQRkZiNkErcUs5CkZtN3ovRFVIOXhGZkt2di9ibFI2RW5UOG8rc3hQWnYrWXpWdTVHV0xONmRDc3ExYWgvNXhyQWF4WlRVSFRWUG4KYy9YMHNJbGhUM0Q0TUNSbnNWRGJsZVdKL2R3V25MNm02TFA5RlpOckZFTXAzamFyanhPWVNkcTA1NmpnUW5EUQpXbFA4SWJLTi9udC9TVU1zZXcrbDFaM01vMW43aE1FL3VPbkxzYWNJZi9ZR1ArbWlJYXVFTDc1cVpwZGpzK1ZQCjRqUWFoTUxFUkZHMWRzK002MWJFbU9SRFRtY3pabWozRmMzQ01tRzVwSG41ZFFmaWNNSmdDZ29ZT3RBLzUwYzAKVjZWUXZyYnhFTXRGRmxjamZKRmpXZjFpaGJXbWdPMmVudDZUUzFqTjd5MD0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZE1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTEFEQ0Jod0tCZ1FEZytydnlLWlRqSGhsWVB2Uy8yeUlWaDRlRQpOZ09Eb2U5YmhFbVFiZ1hHSVJYbjY5azhnejdUWnFRbzNFUzQ3Vy9uR2Q4K2tYWk82azZTd0ZrS2FMTjlMbzJhCk5XbkhMQUxLa3lOVU5wTGs4Z3Excko1cFErS3ZlSGMvcjdOUVM1Y0RzaW95aXp0T281Y3puNTRxdTFzajlLbVEKd0xNS0trVy8wcjFEazk4Z0lRSUJFUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=", 25U, true), // 25 hours - secret: unit-test-issuer-secret
30+
IssuingAuthority("sample-license-authority", "Sample License Authority", "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb1FJQkFBS0NBUUVBdHhnSlBDVklIUGp4VmpnMDVlMnVaNURqNDNIdDF0WFlUK3VkVVRTL3RrSlgyQzltCnFoOGpLUHVPZkF1enFiUCtlenJBdENIQ3ptRE5sZkUwamVOU1VUZlFWbFhxNzd3UGh6ajZWNm1lWTNlcmYxK0oKVGNHUTk1Q0U3QWxRZmlvTm1aMU1OOTBSOXo2QllJMFJpVHh1QVFXckZqdm1rMUsrZ1RRN2dPbVV1WEx1MzJ2RwppNVE0cElKVHBJMExYQkp5QnJVNEs1ZTdWTVhaMHQrb1dRc3djcm05bkJYWVpleVRJcUZ2VmVkbEpxZTArTm9GCk8zeE91VHYxSiticWtWeFFuQlczQ2dyR2tjT0ZWRWtEQ0ROOEZoZ0N5SEpJRDliZkdsNlBJUEp0TE94UlF2M20KSituaktNcnF5a3BPaWp6WXNyUjRSWXlEV0w2dm1hMlpSZGlZS1FJQkVRS0NBUUFKYklnQk5wL3licklSblQ3MQpQdzZmcnZ5cnRPdzk0WmhQYUZ6TmwydS8rQjdmMVVObTM3aGwzOFZ6ajZrL1VxMFpLbzJ1NnlaREY4NVlxS1o0ClBvWWVpSVVUZ0toVDNtS3VmVWtlM1crdWlBcTFuV05OYWZhRk5uOVA2ZVFrbklSMjl5ZXdEVUxPbTdBU0pXRG4KRUVsdE9xVUtqbUNTNEg2QzRyQTlPVEx5OU9NcVpUbU1BZEFTUFZsRGNtNWVkdWVCSGtDeXdrV1lwb2M5N1o2bQpwZG1hOEFOdkcyMUFJOGFZTThTRzgrTmVPZE1pK2tVdmJYT0FlcHUrWHpHRlZxeWRxL0VWdDl2N2xOS0NEY3N3ClJUVC9aSFlDM2xENHd4ejExOXV1eW9zcnhZTUs0QUhTQ1FaM2Zpb3dRY2dMeU44a1hVT1JBa0NrOVBSVEdtUS8KbTlRQkFvR0JBT0drbEZub0hPSlVpeXJ6ZzM4dTY0OW5oUVl4bHpkaTd1bTNIVHhYWU9UbnFYMnkwbmRzSEc1OQpsdS9ySDl5c3Mzck93NFFadDV5alNoclhRUUFKM0dPMERuVUk5Q2F0dE1reGFCYmRYQjVvNGZEL2VzbXowdGJlCk4zaWdHZGVCZ1gvUEF3b3RCVnFXVGNzbSs5QWR4OHpoV0wvMXJocVU4emxLa2dCazBOQlpBb0dCQU0rNkJETW4KNW1jMnZQUzNOYjRtYWVNYnY5dEVacW1Bb1Q3V1RCaUFnY2ZJMlNIRHdNMUFQYVNGcndManN0bFRSNkhMcW1XSQpVYVRvRVhZbkkwejdOUnhlYUdQSTJWdW5uc0pFSGhMS0tRN2Rsa0dSUE1ib292b21EbXBoZVhOOWtnUU9hRzkzCjdBcnVvTWRuZFFhc0VkTlgvcGVYc3FWamZYMjNZLzB4eG94UkFvR0JBS3lNNmVwbU5EU2JBUUs2TjJGQi8yMnAKZzllUFZZUzFFUTBUanRQS1dTZUQraFRVQ2x0U3JGUitLQ0RnK2o5VzQ1b2xwSkl4eUtUMVZzazdNYlM4UHg4UgpPRHRoTXl5aTg2anBpOVUvM1FneUZqRERYZVdKZ3h6SURFMHZJdEg1bjBPZVRaNWVxYjIrTzMwNzdiMUQ4eVF6CjJuU3MwRzZ1STJnTDJROWNKelhwQW9HQVBSaVgwcytBQUQxR29sUUF2M1MxdTBSbG10Zmg5WjVOaXZPOEJ6VGEKNEdnLzNNRWFscmlLbWN6M1BSWExNTnhDUHFWUU8vcnExaVlqUU41VnJUclRZckphOEN3RHNZdW5LaFFJMkZtVAptdlhnNWh1b2RyemtvKzBUVEhjRm1uQTZBVEZxQXFyTTlDZ1JLNWJtTHlPTXhiQjREbmZwUDdQWm5YSXNkNlU2ClpZRUNnWUJzNWlPQlBWaW4waThVWFhHU09xSjIxOHpmUTZUVmdTYk1TaDErZlFyRkY4TlZRR3g1bkxrcUhXZGkKQXRORDhOYWZ2cFdyT2NQNlpNWksxa29JUXJpa1RWNmd4UStJQXVZSXd6R0tTRVNFR3RyM0JMRVdWRnR2OGpHNgp1d2RJejFTdDFpamRhd3J1VldNNFI1eXJaRVJsb1EyWFFXcGZUbVNibUQ4Y1RUNjNrZz09Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklEQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FRMEFNSUlCQ0FLQ0FRRUF0eGdKUENWSUhQanhWamcwNWUydQpaNURqNDNIdDF0WFlUK3VkVVRTL3RrSlgyQzltcWg4aktQdU9mQXV6cWJQK2V6ckF0Q0hDem1ETmxmRTBqZU5TClVUZlFWbFhxNzd3UGh6ajZWNm1lWTNlcmYxK0pUY0dROTVDRTdBbFFmaW9ObVoxTU45MFI5ejZCWUkwUmlUeHUKQVFXckZqdm1rMUsrZ1RRN2dPbVV1WEx1MzJ2R2k1UTRwSUpUcEkwTFhCSnlCclU0SzVlN1ZNWFowdCtvV1Fzdwpjcm05bkJYWVpleVRJcUZ2VmVkbEpxZTArTm9GTzN4T3VUdjFKK2Jxa1Z4UW5CVzNDZ3JHa2NPRlZFa0RDRE44CkZoZ0N5SEpJRDliZkdsNlBJUEp0TE94UlF2M21KK25qS01ycXlrcE9panpZc3JSNFJZeURXTDZ2bWEyWlJkaVkKS1FJQkVRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==", 87600U, true), // 10 years max
3331
};
34-
3532
class LicenseManager : public BaseLicenseManager<LicenseKeysRegister>
3633
{
3734
public:

sample/main.cc

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,21 @@ int main(int argc, char* argv[])
2727
}
2828
}
2929

30-
LicenseManager licenseManager;
3130
if (!licenseFile.empty()) {
32-
std::ifstream stream(licenseFile);
33-
if (!stream.is_open()) {
34-
std::cerr << "Failed to open file " << licenseFile << std::endl;
35-
} else {
36-
37-
std::string licenseKey = std::string((std::istreambuf_iterator<char>(stream)),
38-
(std::istreambuf_iterator<char>()));
39-
stream.close();
40-
License license;
41-
license.load(licenseKey);
42-
if (!licenseManager.validate(&license, true, signature)) {
43-
std::cout << "License is not valid";
44-
} else {
45-
std::cout << "Licensed to " << license.licensee() << std::endl;
46-
std::cout << "Subscription is active until " << license.formattedExpiry() << std::endl << std::endl;
31+
License license;
32+
try {
33+
if (license.loadFromFile(licenseFile)) {
34+
LicenseManager licenseManager;
35+
if (!licenseManager.validate(&license, true, signature)) {
36+
std::cout << "License is not valid";
37+
} else {
38+
std::cout << "Licensed to " << license.licensee() << std::endl;
39+
std::cout << "Subscription is active until " << license.formattedExpiry() << std::endl << std::endl;
40+
}
41+
4742
}
43+
} catch (LicenseException& e) {
44+
std::cerr << "Exception thrown " << e.what() << std::endl;
4845
}
4946
} else {
5047
std::cout << "License file not provided" << std::endl;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
eyJhdXRob3JpdHlfc2lnbmF0dXJlIjoiOEE5MTVGMTAyQzgzQjJDQUY4MEEwNTEyNTJBQjJEODQ0NUVGM0YyRkFEQjBGOERGOUI1MURFMUUwMDg3NUI2NEZBRDNGOTk3Q0EzREQ3QjJCMTFGRjNBMTk5MEU3RkEwMzU1NTczNUY5QTI5MjIyQ0RFNDJBMjQ1OEM3NEM1MkJGRTRDMzA4N0REOUJDQ0U5MEZDQUJGNUY5NzUzMzA0NTcyQTM1NTNGN0VEOTgyOTE0MUQ1QUNGREQ0QzY4MERGRUVEMjk5QjA1ODBFRkQ5MkFDMTA3NDhDOEI0MUM2QTk0NUI2QTBEOTk0RTNBRjQzRDA1RDBBQzJFRTMzOUZEMDMxMDk3NDU4RjdFNzU2MThDMEEyODE3RDBCMzE3NjUyMkNBQjlBRjdENkYzNzA0NjFFRkIxRUNFOTBENEY5NjkyQkE4QkZDRjk3QTg2OENFNkFDRDRDMzcwQUZBQzg4MTVBMEZEMTA5MzBENTBDN0EzNDk2M0M4NzhFMzA1M0UwRTlGOERERjA2OTA3QTc0RjEyREY4RDc0MEM1M0JBQkE4NzQ4MEY3MzIzOEIxMjE0MUVCNzMyRDg5NjQxRjU3QUZEOTI1OEY0RDI3NTIwNDQyQzVBQzZENjFBODE1NzIzOTE2NUVENTg4OTBBNzgwRURBQzk1Q0U5RTg0NDkwNkYiLCJleHBpcnlfZGF0ZSI6MTgzMDg2MDY5MiwiaXNzdWVfZGF0ZSI6MTUxNTUwMDY5MiwiaXNzdWluZ19hdXRob3JpdHkiOiJzYW1wbGUtbGljZW5zZS1hdXRob3JpdHkiLCJsaWNlbnNlZSI6InNhbXBsZS1saWNlbnNlIiwibGljZW5zZWVfc2lnbmF0dXJlIjoiNjY2MjYyMzQ2NDM0MzgzOTYzMzkzNTM2NjQzNTMwNjUzNTYxNjY2MzY2MzQzOTYzMzMzNTMzMzY2MzM5NjQzNTNBMzU3NTRENEE0QzRDNkE0NTQ1NzM0RDM2NDI3QTU5NEY1MTUyNzY1OTYxMzQ2MjM2NkE2NzY0NEUzNjMxNDI3ODMzMzA2QzU1NzQzMDZFNkQ2RjVBNTkzRDBEMEEwRDBBIn0=

sample/sample.licensepp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
eyJhdXRob3JpdHlfc2lnbmF0dXJlIjoiMTY0REM1NzEwMUQzQzM1MUQyOTkxNDU3Q0ZGMkE5N0VBOTAzREMxNjkxQUI2MzYxNDRCQjI1MEE3ODYzMDk1QzM3QUI4NDE1QUQ0QTgxODhCM0U4NDJEREI5QzAzQjlDNUZFMTdGNTc5NzQ4MDJGQUM3QThGMUVDQ0IzQTMxNTczNTQ1QjVBODMyMzJFNzhEQ0E1OTNBQ0IwQjg5RTFGODBEMzE2MEFGQzdEN0ZCMjIwMDE4M0FGRjIyOEY5MTU4NTE0ODAxM0E2MDA0RDJBRTQ0QzlENUQ1NDE2MDFERTBFQjI5ODEyRkJDODk0QkZBRUE2NTlGQjZFNDVDNjJFQjgzQURGMDYwMTAxNUU4OEE0Nzc4M0MxNzNGOTgyRkI5QUREQkRENjlENkU2MzA2NzE3QTg3MjBEMDcyMjAxRTk5QzNCN0U2MTc4NjQ5MURCQ0Y1MUJDQjQwQkJDOEY1OUIyNDhFOUNFQjA4RjI5NURCRjY1MzIzQUQzMzI5MUUzMDZCREE3RDVGNkQ0M0IyNjFBODFDRDUxMDg3NDAxRjE4MkI3ODkwMUUxRjBBNjY3QkI5RjE0NTEzQTMwQzY2RTE4MEM5MzlFMTg4NDY5NkUzOTMwRTREMUM3RjIwQTkzNkUzNzg1REY0RkFEMzdGMUMzMDQzNjFDM0JEMDZGOTQiLCJleHBpcnlfZGF0ZSI6MTgzMDg2MDU4NSwiaXNzdWVfZGF0ZSI6MTUxNTUwMDU4NSwiaXNzdWluZ19hdXRob3JpdHkiOiJzYW1wbGUtbGljZW5zZS1hdXRob3JpdHkiLCJsaWNlbnNlZSI6InNhbXBsZS1saWNlbnNlIn0=

src/license.cc

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
//
77

88
#include <ctime>
9+
#include <fstream>
10+
#include <iterator>
911
#include <license++/license.h>
1012
#include <license++/license-exception.h>
1113
#include "src/crypto/base64.h"
@@ -18,7 +20,6 @@ License::License() :
1820
m_issueDate(0),
1921
m_expiryDate(0)
2022
{
21-
2223
}
2324

2425
License::License(const License& other):
@@ -47,7 +48,6 @@ std::string License::formattedExpiry() const
4748
return Utils::timevalToString(tval, "%d %b, %Y %H:%m UTC");
4849
}
4950

50-
5151
std::string License::toString()
5252
{
5353
JsonObject::Json j;
@@ -95,3 +95,20 @@ bool License::load(const std::string& licenseBase64)
9595
}
9696
return false;
9797
}
98+
99+
bool License::loadFromFile(const std::string& licenseFile)
100+
{
101+
if (!licenseFile.empty()) {
102+
std::ifstream stream(licenseFile);
103+
if (!stream.is_open()) {
104+
std::cerr << "Failed to open file " << licenseFile << std::endl;
105+
return false;
106+
} else {
107+
std::string licenseContents = std::string((std::istreambuf_iterator<char>(stream)),
108+
(std::istreambuf_iterator<char>()));
109+
stream.close();
110+
return load(licenseContents);
111+
}
112+
}
113+
return false;
114+
}

src/utils.cc

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@
1010

1111
using namespace licensepp;
1212

13-
14-
const char* Utils::kDays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
15-
const char* Utils::kDaysAbbrev[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
16-
const char* Utils::kMonths[12] = { "January", "February", "March", "Apri", "May", "June", "July", "August", "September", "October", "November", "December" };
17-
const char* Utils::kMonthsAbbrev[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
13+
const char* Utils::kDays[7] = { "Sunday", "Monday", "Tuesday",
14+
"Wednesday", "Thursday", "Friday",
15+
"Saturday" };
16+
const char* Utils::kDaysAbbrev[7] = { "Sun", "Mon", "Tue",
17+
"Wed", "Thu", "Fri", "Sat" };
18+
const char* Utils::kMonths[12] = { "January", "February", "March",
19+
"Apri", "May", "June", "July",
20+
"August", "September", "October",
21+
"November", "December" };
22+
const char* Utils::kMonthsAbbrev[12] = { "Jan", "Feb", "Mar", "Apr",
23+
"May", "Jun", "Jul", "Aug",
24+
"Sep", "Oct", "Nov", "Dec" };
1825

1926
unsigned long long Utils::nowUtc()
2027
{
@@ -38,7 +45,7 @@ struct ::tm* Utils::buildTimeInfo(struct timeval* currTime, struct ::tm* timeInf
3845
{
3946
#if LICENSEPP_OS_UNIX
4047
time_t rawTime = currTime->tv_sec;
41-
::localtime_r(&rawTime, timeInfo);
48+
::gmtime_r(&rawTime, timeInfo);
4249
return timeInfo;
4350
#else
4451
# ifdef (_MSC_VER)
@@ -49,12 +56,12 @@ struct ::tm* Utils::buildTimeInfo(struct timeval* currTime, struct ::tm* timeInf
4956
# else
5057
_time64(&t);
5158
# endif
52-
localtime_s(timeInfo, &t);
59+
gmtime_s(timeInfo, &t);
5360
return timeInfo;
5461
# else
5562
// For any other compilers that don't have CRT warnings issue e.g, MinGW or TDM GCC- we use different method
5663
time_t rawTime = currTime->tv_sec;
57-
struct tm* tmInf = localtime(&rawTime);
64+
struct tm* tmInf = gmtime(&rawTime);
5865
*timeInfo = *tmInf;
5966
return timeInfo;
6067
# endif // _MSC_VER
@@ -73,10 +80,8 @@ char* Utils::convertAndAddToBuff(std::size_t n, int len, char* buf, const char*
7380
*--p = '0';
7481
--len;
7582
}
76-
if (zeroPadded) {
77-
while (p > localBuff && len-- > 0) {
78-
*--p = static_cast<char>('0');
79-
}
83+
while (zeroPadded && p > localBuff && len-- > 0) {
84+
*--p = static_cast<char>('0');
8085
}
8186
return addToBuff(p, buf, bufLim);
8287
}
@@ -105,19 +110,19 @@ char* Utils::parseFormat(char* buf, std::size_t bufSz, const char* format, const
105110
buf = convertAndAddToBuff(tInfo->tm_mday, 2, buf, bufLim);
106111
continue;
107112
case 'a': // Day of week (short)
108-
buf = addToBuff(Utils::kDaysAbbrev[tInfo->tm_wday], buf, bufLim);
113+
buf = addToBuff(kDaysAbbrev[tInfo->tm_wday], buf, bufLim);
109114
continue;
110115
case 'A': // Day of week (long)
111-
buf = addToBuff(Utils::kDays[tInfo->tm_wday], buf, bufLim);
116+
buf = addToBuff(kDays[tInfo->tm_wday], buf, bufLim);
112117
continue;
113118
case 'M': // month
114119
buf = convertAndAddToBuff(tInfo->tm_mon + 1, 2, buf, bufLim);
115120
continue;
116121
case 'b': // month (short)
117-
buf = addToBuff(Utils::kMonthsAbbrev[tInfo->tm_mon], buf, bufLim);
122+
buf = addToBuff(kMonthsAbbrev[tInfo->tm_mon], buf, bufLim);
118123
continue;
119124
case 'B': // month (long)
120-
buf = addToBuff(Utils::kMonths[tInfo->tm_mon], buf, bufLim);
125+
buf = addToBuff(kMonths[tInfo->tm_mon], buf, bufLim);
121126
continue;
122127
case 'y': // year (two digits)
123128
buf = convertAndAddToBuff(tInfo->tm_year + 1900, 2, buf, bufLim);

0 commit comments

Comments
 (0)