Skip to content

Commit 5e68103

Browse files
committed
0.9.9.1
1 parent 3d2b7e0 commit 5e68103

File tree

11 files changed

+80
-17
lines changed

11 files changed

+80
-17
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- affiliations as a list with GRID links
99
- generic 'default_transform' method for extra column not in transformations
1010
* Test suite for magic commands
11+
* New feature: `verify_ssl` option for `login()` method
1112

1213
## v 0.9.8
1314

Diff for: dimcli/VERSION.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# !/usr/bin/env python
22
# -*- coding: UTF-8 -*-
33

4-
__version__ = "0.9.9" # LATEST? => https://pypi.org/project/dimcli/
4+
__version__ = "0.9.9.1" # LATEST? => https://pypi.org/project/dimcli/
55
__copyright__ = "CopyRight (C) 2018-2022 by Digital Science"
66
__license__ = "MIT"
77
__author__ = "Michele Pasin"

Diff for: dimcli/__init__.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def login( username="",
4545
endpoint="",
4646
instance="",
4747
key="",
48+
verify_ssl=True,
4849
verbose=True):
4950
"""Login into the Dimensions API and store the query token in memory.
5051
@@ -68,6 +69,8 @@ def login( username="",
6869
The instance name, from the local dsl.ini credentials file. Default: 'live'
6970
key: str, optional
7071
The API key (available to some users instead of username/password)
72+
verify_ssl: bool, optional
73+
Verify SSL certificates for HTTPS requests. Default: True.
7174
verbose: bool, optional
7275
Verbose mode. Default: True.
7376
@@ -81,6 +84,10 @@ def login( username="",
8184
* `https://app.dimensions.ai/api/dsl/v2`
8285
8386
87+
About SSL verification:
88+
89+
Dimcli internally uses the Requests library, which verifies SSL certificates for HTTPS requests, just like a web browser. For some users, it is necessary to turn off SSL verification in order to connect to the API. This can be achieved by passing `verify_ssl=False` at login time. All subsequent API queries will not use SSL verification. NOTE This setting can also be added to the `dsl.ini` file with the following line: `verify_ssl=false`.
90+
8491
8592
Example
8693
-------
@@ -94,11 +101,11 @@ def login( username="",
94101
95102
You can specify endpoint, which by default is set to "https://app.dimensions.ai"
96103
97-
>>> dimcli.login(key="my-secret-key", ednpoint="https://nannies-research.dimensions.ai")
104+
>>> dimcli.login(key="my-secret-key", endpoint="https://nannies-research.dimensions.ai")
98105
99106
Legacy authentication mechanisms with username/password are also supported
100107
101-
>>> dimcli.login(username="mary.poppins", password="chimneysweeper", ednpoint="https://nannies-research.dimensions.ai")
108+
>>> dimcli.login(username="mary.poppins", password="chimneysweeper", endpoint="https://nannies-research.dimensions.ai")
102109
103110
See Also
104111
---------------
@@ -109,7 +116,7 @@ def login( username="",
109116
from .core.auth import do_global_login, get_global_connection
110117

111118
try:
112-
do_global_login(instance, username, password, key, endpoint)
119+
do_global_login(instance, username, password, key, endpoint, verify_ssl)
113120
except Exception as e:
114121
printDebug("Login failed: please ensure your credentials are correct.")
115122
raise(e)

Diff for: dimcli/core/api.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def __init__(self, show_results=False, verbose=True, auth_session=False):
7979
self._verbose = verbose
8080
self._url = None
8181
self._headers = None
82+
self.verify_ssl = True
8283
if auth_session:
8384
self._CONNECTION = auth_session
8485
else:
@@ -88,6 +89,7 @@ def __init__(self, show_results=False, verbose=True, auth_session=False):
8889
# if already logged in, reuse connection
8990
self._url = self._CONNECTION.url
9091
self._headers = {'Authorization': "JWT " + self._CONNECTION.token}
92+
self.verify_ssl = self._CONNECTION.verify_ssl
9193
else:
9294
self._print_please_login()
9395

@@ -104,6 +106,7 @@ def _refresh_login(self):
104106
self._CONNECTION.refresh_login()
105107
self._url = self._CONNECTION.url
106108
self._headers = {'Authorization': "JWT " + self._CONNECTION.token}
109+
self.verify_ssl = self._CONNECTION.verify_ssl
107110
else:
108111
printDebug("Warning: please login first.")
109112

@@ -143,7 +146,7 @@ def query(self, q, show_results=None, retry=0, verbose=None):
143146

144147
# Execute DSL query.
145148
start = time.time()
146-
response = requests.post(self._url, data=q.encode(), headers=self._headers)
149+
response = requests.post(self._url, data=q.encode(), headers=self._headers, verify=self.verify_ssl)
147150
if response.status_code == 429:
148151
# Too Many Requests
149152
printDebug(

Diff for: dimcli/core/auth.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def __init__(self, verbose=True):
7373
self.username = None
7474
self.password = None
7575
self.key = None
76+
self.verify_ssl = None
7677
self.token = None
7778
# self._verbose = verbose
7879

@@ -83,6 +84,7 @@ def login(self,
8384
password="",
8485
key="",
8586
endpoint="",
87+
verify_ssl=True,
8688
verbose=True):
8789
"""Login into Dimensions API endpoint and get a query token.
8890
@@ -97,7 +99,8 @@ def login(self,
9799
username="{username}",
98100
password="{password}",
99101
key="{key}",
100-
endpoint="{endpoint}")""", fg="red")
102+
endpoint="{endpoint}",
103+
verify_ssl="{verify_ssl}")""", fg="red")
101104

102105
if (username or password) and not (username and password):
103106
raise Exception("Authentication error: you provided only one value for username and password. Both are required.")
@@ -139,14 +142,18 @@ def login(self,
139142
key = config_section['key']
140143
except:
141144
key = ""
145+
try:
146+
verify_ssl = config_section.getboolean('verify_ssl')
147+
except:
148+
verify_ssl = True
142149

143150
URL_AUTH, URL_QUERY = self._get_endpoint_urls(endpoint)
144151
# printDebug(URL_AUTH, URL_QUERY )
145152

146153
login_data = {'username': username, 'password': password, 'key': key}
147154

148155
# POST AUTH REQUEST
149-
response = requests.post(URL_AUTH, json=login_data)
156+
response = requests.post(URL_AUTH, json=login_data, verify=verify_ssl)
150157
response.raise_for_status()
151158

152159
token = response.json()['token']
@@ -156,6 +163,7 @@ def login(self,
156163
self.username = username
157164
self.password = password
158165
self.key = key
166+
self.verify_ssl = verify_ssl
159167
self.token = token
160168

161169

@@ -209,6 +217,7 @@ def refresh_login(self):
209217
password=self.password,
210218
key=self.key,
211219
endpoint=self.url,
220+
verify_ssl=self.verify_ssl,
212221
verbose=False
213222
)
214223

@@ -221,6 +230,7 @@ def reset_login(self):
221230
self.password = None
222231
self.key = None
223232
self.token = None
233+
self.verify_ssl = True
224234

225235

226236
def is_logged_in(self):
@@ -244,10 +254,10 @@ def is_logged_in(self):
244254

245255

246256

247-
def do_global_login(instance="", username="", password="", key="", url=""):
257+
def do_global_login(instance="", username="", password="", key="", url="", verify_ssl=True):
248258
"Login into DSL and set the connection object with token"
249259
global CONNECTION
250-
CONNECTION.login(instance, username, password, key, url)
260+
CONNECTION.login(instance, username, password, key, url, verify_ssl)
251261

252262

253263

Diff for: dimcli/tests/quicktest.py

+17
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,23 @@ def main(test_number=1):
2929
dsl = Dsl()
3030
test_number = int(test_number)
3131

32+
if test_number == 5:
33+
34+
click.secho("\nTEST 005: GLOBAL login/logout using verify_ssl flag.", bg="green")
35+
# ----
36+
logout()
37+
login(instance="key-test", verify_ssl=True, verbose=True)
38+
d = Dsl()
39+
click.secho(""" Dsl(instance="key-test" / verify_ssl=True): ==> url="""+ d._url, fg="magenta")
40+
res = d.query("""search publications where authors="Pasin" return publications""")
41+
print(" ==> res.json.keys(): ", res.json.keys())
42+
logout()
43+
# ----
44+
click.secho("\n--------\nCOMPLETED", fg="green")
45+
46+
47+
48+
3249

3350
if test_number == 4:
3451

Diff for: dimcli/tests/test_login.py

+12
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,18 @@ def test_004(self):
163163
click.secho("\n--------\nCOMPLETED", fg="green")
164164

165165

166+
def test_005(self):
167+
click.secho("\nTEST 005: GLOBAL login/logout using verify_ssl flag.", bg="green")
168+
# ----
169+
logout()
170+
login(instance="key-test", verify_ssl=True, verbose=True)
171+
d = Dsl()
172+
click.secho(""" Dsl(instance="key-test" / verify_ssl=True): ==> url="""+ d._url, fg="magenta")
173+
res = d.query("""search publications where authors="Pasin" return publications""")
174+
print(" ==> res.json.keys(): ", res.json.keys())
175+
logout()
176+
# ----
177+
click.secho("\n--------\nCOMPLETED", fg="green")
166178

167179

168180

Diff for: docs/_modules/dimcli/__init__.html

+10-3
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ <h1>Source code for dimcli.__init__</h1><div class="highlight"><pre>
112112
<span class="n">endpoint</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
113113
<span class="n">instance</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
114114
<span class="n">key</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
115+
<span class="n">verify_ssl</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
115116
<span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
116117
<span class="sd">&quot;&quot;&quot;Login into the Dimensions API and store the query token in memory. </span>
117118

@@ -135,6 +136,8 @@ <h1>Source code for dimcli.__init__</h1><div class="highlight"><pre>
135136
<span class="sd"> The instance name, from the local dsl.ini credentials file. Default: &#39;live&#39;</span>
136137
<span class="sd"> key: str, optional</span>
137138
<span class="sd"> The API key (available to some users instead of username/password)</span>
139+
<span class="sd"> verify_ssl: bool, optional</span>
140+
<span class="sd"> Verify SSL certificates for HTTPS requests. Default: True.</span>
138141
<span class="sd"> verbose: bool, optional</span>
139142
<span class="sd"> Verbose mode. Default: True.</span>
140143

@@ -148,6 +151,10 @@ <h1>Source code for dimcli.__init__</h1><div class="highlight"><pre>
148151
<span class="sd"> * `https://app.dimensions.ai/api/dsl/v2`</span>
149152

150153

154+
<span class="sd"> About SSL verification:</span>
155+
156+
<span class="sd"> Dimcli internally uses the Requests library, which verifies SSL certificates for HTTPS requests, just like a web browser. For some users, it is necessary to turn off SSL verification in order to connect to the API. This can be achieved by passing `verify_ssl=False` at login time. All subsequent API queries will not use SSL verification. NOTE This setting can also be added to the `dsl.ini` file with the following line: `verify_ssl=false`.</span>
157+
151158

152159
<span class="sd"> Example</span>
153160
<span class="sd"> -------</span>
@@ -161,11 +168,11 @@ <h1>Source code for dimcli.__init__</h1><div class="highlight"><pre>
161168

162169
<span class="sd"> You can specify endpoint, which by default is set to &quot;https://app.dimensions.ai&quot;</span>
163170
<span class="sd"> </span>
164-
<span class="sd"> &gt;&gt;&gt; dimcli.login(key=&quot;my-secret-key&quot;, ednpoint=&quot;https://nannies-research.dimensions.ai&quot;)</span>
171+
<span class="sd"> &gt;&gt;&gt; dimcli.login(key=&quot;my-secret-key&quot;, endpoint=&quot;https://nannies-research.dimensions.ai&quot;)</span>
165172

166173
<span class="sd"> Legacy authentication mechanisms with username/password are also supported</span>
167174

168-
<span class="sd"> &gt;&gt;&gt; dimcli.login(username=&quot;mary.poppins&quot;, password=&quot;chimneysweeper&quot;, ednpoint=&quot;https://nannies-research.dimensions.ai&quot;)</span>
175+
<span class="sd"> &gt;&gt;&gt; dimcli.login(username=&quot;mary.poppins&quot;, password=&quot;chimneysweeper&quot;, endpoint=&quot;https://nannies-research.dimensions.ai&quot;)</span>
169176

170177
<span class="sd"> See Also</span>
171178
<span class="sd"> ---------------</span>
@@ -176,7 +183,7 @@ <h1>Source code for dimcli.__init__</h1><div class="highlight"><pre>
176183
<span class="kn">from</span> <span class="nn">.core.auth</span> <span class="kn">import</span> <span class="n">do_global_login</span><span class="p">,</span> <span class="n">get_global_connection</span>
177184

178185
<span class="k">try</span><span class="p">:</span>
179-
<span class="n">do_global_login</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">)</span>
186+
<span class="n">do_global_login</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">verify_ssl</span><span class="p">)</span>
180187
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
181188
<span class="n">printDebug</span><span class="p">(</span><span class="s2">&quot;Login failed: please ensure your credentials are correct.&quot;</span><span class="p">)</span>
182189
<span class="k">raise</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>

Diff for: docs/_modules/dimcli/core/api.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ <h1>Source code for dimcli.core.api</h1><div class="highlight"><pre>
146146
<span class="bp">self</span><span class="o">.</span><span class="n">_verbose</span> <span class="o">=</span> <span class="n">verbose</span>
147147
<span class="bp">self</span><span class="o">.</span><span class="n">_url</span> <span class="o">=</span> <span class="kc">None</span>
148148
<span class="bp">self</span><span class="o">.</span><span class="n">_headers</span> <span class="o">=</span> <span class="kc">None</span>
149+
<span class="bp">self</span><span class="o">.</span><span class="n">verify_ssl</span> <span class="o">=</span> <span class="kc">True</span>
149150
<span class="k">if</span> <span class="n">auth_session</span><span class="p">:</span>
150151
<span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span> <span class="o">=</span> <span class="n">auth_session</span>
151152
<span class="k">else</span><span class="p">:</span>
@@ -155,6 +156,7 @@ <h1>Source code for dimcli.core.api</h1><div class="highlight"><pre>
155156
<span class="c1"># if already logged in, reuse connection </span>
156157
<span class="bp">self</span><span class="o">.</span><span class="n">_url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">url</span>
157158
<span class="bp">self</span><span class="o">.</span><span class="n">_headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Authorization&#39;</span><span class="p">:</span> <span class="s2">&quot;JWT &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">token</span><span class="p">}</span>
159+
<span class="bp">self</span><span class="o">.</span><span class="n">verify_ssl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">verify_ssl</span>
158160
<span class="k">else</span><span class="p">:</span>
159161
<span class="bp">self</span><span class="o">.</span><span class="n">_print_please_login</span><span class="p">()</span>
160162

@@ -171,6 +173,7 @@ <h1>Source code for dimcli.core.api</h1><div class="highlight"><pre>
171173
<span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">refresh_login</span><span class="p">()</span>
172174
<span class="bp">self</span><span class="o">.</span><span class="n">_url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">url</span>
173175
<span class="bp">self</span><span class="o">.</span><span class="n">_headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Authorization&#39;</span><span class="p">:</span> <span class="s2">&quot;JWT &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">token</span><span class="p">}</span>
176+
<span class="bp">self</span><span class="o">.</span><span class="n">verify_ssl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_CONNECTION</span><span class="o">.</span><span class="n">verify_ssl</span>
174177
<span class="k">else</span><span class="p">:</span>
175178
<span class="n">printDebug</span><span class="p">(</span><span class="s2">&quot;Warning: please login first.&quot;</span><span class="p">)</span>
176179

@@ -210,7 +213,7 @@ <h1>Source code for dimcli.core.api</h1><div class="highlight"><pre>
210213

211214
<span class="c1"># Execute DSL query.</span>
212215
<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
213-
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">q</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">)</span>
216+
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">q</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">,</span> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify_ssl</span><span class="p">)</span>
214217
<span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
215218
<span class="c1"># Too Many Requests</span>
216219
<span class="n">printDebug</span><span class="p">(</span>

0 commit comments

Comments
 (0)