-
-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathapi.py
More file actions
88 lines (74 loc) · 3.19 KB
/
api.py
File metadata and controls
88 lines (74 loc) · 3.19 KB
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
#!/usr/bin/env python
# -*- coding: utf8 -*-
# ============================================================================
# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
import json
from requests import get
from urllib.parse import quote
from urllib.parse import urlencode
from urllib.error import HTTPError
from attributecode import ERROR
from attributecode import Error
"""
API call helpers
"""
# FIXME: args should start with license_key
def request_license_data(api_url, api_key, license_key):
"""
Return a tuple of (dictionary of license data, list of errors) given a
`license_key`. Send a request to `api_url` authenticating with `api_key`.
"""
headers = {
"Authorization": "Token %s" % api_key,
}
payload = {"api_key": api_key, "key": license_key, "format": "json"}
api_url = api_url.rstrip("/")
payload = urlencode(payload)
full_url = "%(api_url)s/?%(payload)s" % locals()
# handle special characters in URL such as space etc.
quoted_url = quote(full_url, safe="%/:=&?~#+!$,;'@()*[]")
license_data = {}
errors = []
try:
response = get(quoted_url, headers=headers)
response_content = response.text
# FIXME: this should be an ordered dict
license_data = json.loads(response_content)
if not license_data.get("results", []):
msg = "Invalid 'license': %s" % license_key
errors.append(Error(ERROR, msg))
except HTTPError as http_e:
msg = "Authorization denied. Invalid '--api_key'. License generation is skipped."
errors.append(Error(ERROR, msg))
except Exception as e:
# Already checked the authorization and accessible of the URL.
# The only exception left is URL is accessible, but it's not a valid API URL
msg = "Invalid '--api_url'. License generation is skipped."
errors.append(Error(ERROR, msg))
finally:
if license_data.get("count") == 1:
license_data = license_data.get("results")[0]
else:
license_data = {}
return license_data, errors
# FIXME: args should start with license_key
def get_license_details_from_api(api_url, api_key, license_key):
"""
Return a tuple of license data given a `license_key` using the `api_url`
authenticating with `api_key`.
The details are a tuple of (license_name, license_key, license_text, errors)
where errors is a list of strings.
Missing values are provided as empty strings.
"""
license_data, errors = request_license_data(api_url, api_key, license_key)
return license_data, errors