-
Notifications
You must be signed in to change notification settings - Fork 592
/
subscription.py
157 lines (141 loc) · 5.91 KB
/
subscription.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
from pritunl.constants import *
from pritunl.helpers import *
from pritunl.exceptions import *
from pritunl import settings
from pritunl import logger
from pritunl import utils
from pritunl import event
from pritunl import mongo
from pritunl import messenger
import requests
import base64
def x(a):
return base64.b64decode(a).decode()
def update():
license = settings.app.license
collection = mongo.get_collection('settings')
if not settings.app.id:
settings.app.id = utils.random_name()
settings.commit()
if not license:
settings.local.sub_active = False
settings.local.sub_status = None
settings.local.sub_plan = None
settings.local.sub_quantity = None
settings.local.sub_amount = None
settings.local.sub_period_end = None
settings.local.sub_trial_end = None
settings.local.sub_cancel_at_period_end = None
settings.local.sub_balance = None
settings.local.sub_url_key = None
else:
for i in range(2):
try:
url = x(b'aHR0cHM6Ly9hcHAucHJpdHVubC5jb20vc3Vic2NyaXB0aW9u')
response = requests.get(
url,
json={
x(b'aWQ='): settings.app.id,
x(b'bGljZW5zZQ=='): license,
x(b'dmVyc2lvbg=='): settings.local.version_int,
},
timeout=max(settings.app.http_request_timeout, 10),
)
# License key invalid
if response.status_code == 470:
raise ValueError('License key is invalid')
if response.status_code == 473:
raise ValueError(('Version %r not recognized by ' +
'subscription server') % settings.local.version_int)
data = response.json()
settings.local.sub_active = data[x(b'YWN0aXZl')]
settings.local.sub_status = data[x(b'c3RhdHVz')]
settings.local.sub_plan = data[x(b'cGxhbg==')]
settings.local.sub_quantity = data[x(b'cXVhbnRpdHk=')]
settings.local.sub_amount = data[x(b'YW1vdW50')]
settings.local.sub_period_end = data[x(b'cGVyaW9kX2VuZA==')]
settings.local.sub_trial_end = data[x(b'dHJpYWxfZW5k')]
settings.local.sub_cancel_at_period_end = \
data[x(b'Y2FuY2VsX2F0X3BlcmlvZF9lbmQ=')]
settings.local.sub_balance = data.get(x(b'YmFsYW5jZQ=='))
settings.local.sub_url_key = data.get(x(b'dXJsX2tleQ=='))
settings.local.sub_styles[data[x(b'cGxhbg==')]] = \
data[x(b'c3R5bGVz')]
except:
if i < 1:
logger.exception('Failed to check subscription status',
'subscription, retrying...')
time.sleep(1)
continue
logger.exception('Failed to check subscription status',
'subscription')
settings.local.sub_active = False
settings.local.sub_status = None
settings.local.sub_plan = None
settings.local.sub_quantity = None
settings.local.sub_amount = None
settings.local.sub_period_end = None
settings.local.sub_trial_end = None
settings.local.sub_cancel_at_period_end = None
settings.local.sub_balance = None
settings.local.sub_url_key = None
break
if settings.app.license_plan != settings.local.sub_plan and \
settings.local.sub_plan:
settings.app.license_plan = settings.local.sub_plan
settings.commit()
response = collection.update({
'_id': 'subscription',
'$or': [
{'active': {'$ne': settings.local.sub_active}},
{'plan': {'$ne': settings.local.sub_plan}},
],
}, {'$set': {
'active': settings.local.sub_active,
'plan': settings.local.sub_plan,
}})
if response['updatedExisting']:
if settings.local.sub_active:
if settings.local.sub_plan == 'premium':
event.Event(type=SUBSCRIPTION_PREMIUM_ACTIVE)
elif settings.local.sub_plan == 'enterprise':
event.Event(type=SUBSCRIPTION_ENTERPRISE_ACTIVE)
elif settings.local.sub_plan == 'enterprise_plus':
event.Event(type=SUBSCRIPTION_ENTERPRISE_PLUS_ACTIVE)
else:
event.Event(type=SUBSCRIPTION_NONE_INACTIVE)
else:
if settings.local.sub_plan == 'premium':
event.Event(type=SUBSCRIPTION_PREMIUM_INACTIVE)
elif settings.local.sub_plan == 'enterprise':
event.Event(type=SUBSCRIPTION_ENTERPRISE_INACTIVE)
elif settings.local.sub_plan == 'enterprise_plus':
event.Event(type=SUBSCRIPTION_ENTERPRISE_PLUS_INACTIVE)
else:
event.Event(type=SUBSCRIPTION_NONE_INACTIVE)
return True
def dict():
if settings.app.demo_mode:
url_key = 'demo'
else:
url_key = settings.local.sub_url_key
return {
'active': settings.local.sub_active,
'status': settings.local.sub_status,
'plan': settings.local.sub_plan,
'quantity': settings.local.sub_quantity,
'amount': settings.local.sub_amount,
'period_end': settings.local.sub_period_end,
'trial_end': settings.local.sub_trial_end,
'cancel_at_period_end': settings.local.sub_cancel_at_period_end,
'balance': settings.local.sub_balance,
'url_key': url_key,
}
def update_license(license):
settings.app.license = license
settings.app.license_plan = None
settings.commit()
valid = update()
messenger.publish('subscription', 'updated')
if not valid:
raise LicenseInvalid('License key is invalid')