Skip to content

Commit 23c5280

Browse files
authored
Merge pull request #11 from nbeguier/1_5_0
[CASSH] Major security upgrade in 1.5.0
2 parents 7c89ebe + 280d74a commit 23c5280

5 files changed

Lines changed: 209 additions & 161 deletions

File tree

.travis.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
language: python
22
python:
33
- '2.7'
4-
- '3.3'
54
- '3.4'
6-
- '3.5'
7-
- '3.5-dev' # 3.5 development branch
8-
- '3.6-dev' # 3.6 development branch
5+
- "3.5"
6+
- "3.5-dev" # 3.5 development branch
7+
- "3.6"
8+
- "3.6-dev" # 3.6 development branch
9+
- "3.7-dev" # 3.7 development branch
910
# command to install dependencies
1011
install:
1112
- if [[ $TRAVIS_PYTHON_VERSION == 2.* ]]; then pip install -r requirements.txt; fi
1213
- if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then pip3 install -r requirements.txt; fi
1314
# command to run tests
14-
script: pylint cassh -d redefined-builtin
15+
script: pylint cassh -d redefined-builtin -d useless-object-inheritance

CHANGELOG_cassh_client.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ CHANGELOG
44
CASSH Client
55
-----
66

7+
1.5.0
8+
-----
9+
10+
2018/08/09
11+
12+
### Changes
13+
14+
- Every GET routes are DEPRECATED.
15+
- Authentication is in the payload now
16+
- Update tests
17+
18+
719
1.4.5
820
-----
921

cassh

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ from os import chmod, chown, getenv
1313
from os.path import isfile
1414
from shutil import copyfile
1515
import sys
16-
try:
17-
# Python 3
18-
from urllib.parse import urlencode
19-
except ImportError:
20-
# Python 2
21-
from urllib import urlencode
2216

2317
# Third party library imports
2418
from configparser import ConfigParser, NoOptionError, NoSectionError
@@ -37,7 +31,7 @@ if sys.version_info < (3, 0):
3731
# Debug
3832
# from pdb import set_trace as st
3933

40-
VERSION = '%(prog)s 1.4.5'
34+
VERSION = '%(prog)s 1.5.0'
4135

4236
def read_conf(conf_path):
4337
"""
@@ -79,7 +73,6 @@ def read_conf(conf_path):
7973

8074
return user_metadata
8175

82-
8376
def print_result(result):
8477
""" Display result """
8578
date_formatted = datetime.strptime(result['expiration'], '%Y-%m-%d %H:%M:%S')
@@ -110,44 +103,49 @@ class CASSH(object):
110103
self.auth = user_metadata['auth']
111104
self.realname = user_metadata['realname']
112105

113-
114-
def auth_url(self, prefix=None):
106+
def get_data(self, prefix=None):
115107
"""
116-
Return a xxx=xxx to put at the end of a GET request.
108+
Return data for a POST request.
117109
"""
110+
data = {}
118111
passwd_message = 'Please type your LDAP password (user=%s): ' % self.realname
119112
if self.auth == 'ldap':
120-
auth = {'realname': self.realname, 'password': getpass(passwd_message)}
121-
if prefix is not None:
122-
auth.update(prefix)
123-
return '?%s' % urlencode(auth)
124-
else:
125-
if prefix is None:
126-
return ''
127-
return '?%s' % urlencode(prefix)
113+
data.update({'realname': self.realname, 'password': getpass(passwd_message)})
114+
if prefix is not None:
115+
data.update(prefix)
116+
return data
128117

129118
def admin(self, username, action, set_value=None):
130119
"""
131120
Admin CLI
132121
"""
122+
payload = self.get_data()
133123
try:
134124
if action == 'revoke':
135-
req = self.session.get(self.url + '/admin/' + username +\
136-
self.auth_url(prefix={'revoke': True}), verify=False)
125+
payload.update({'revoke': True})
126+
req = self.session.post(self.url + '/admin/' + username, \
127+
data=payload, \
128+
verify=False)
137129
elif action == 'active':
138-
req = self.session.get(self.url + '/admin/' + username +\
139-
self.auth_url(), verify=False)
130+
req = self.session.post(self.url + '/admin/' + username, \
131+
data=payload, \
132+
verify=False)
140133
elif action == 'delete':
141-
req = self.session.delete(self.url + '/admin/' + username +\
142-
self.auth_url(), verify=False)
134+
req = self.session.delete(self.url + '/admin/' + username, \
135+
data=payload, \
136+
verify=False)
143137
elif action == 'set':
144138
set_value_dict = {}
145139
set_value_dict[set_value.split('=')[0]] = set_value.split('=')[1]
146-
req = self.session.post(self.url + '/admin/' + username +\
147-
self.auth_url(prefix=set_value_dict), verify=False)
140+
payload.update(set_value_dict)
141+
req = self.session.patch(self.url + '/admin/' + username, \
142+
data=payload, \
143+
verify=False)
148144
elif action == 'status':
149-
req = self.session.get(self.url + '/admin/' + username +\
150-
self.auth_url(prefix={'status': True}), verify=False)
145+
payload.update({'status': True})
146+
req = self.session.post(self.url + '/admin/' + username, \
147+
data=payload, \
148+
verify=False)
151149
try:
152150
result = loads(req.text)
153151
except ValueError:
@@ -174,10 +172,15 @@ class CASSH(object):
174172
"""
175173
Add a public key.
176174
"""
175+
payload = self.get_data()
177176
pubkey = open('%s.pub' % self.key_path, 'rb')
177+
payload.update({'pubkey': pubkey.read().replace(' ', '%20')})
178+
pubkey.close()
178179
try:
179-
req = self.session.put(self.url + '/client' +\
180-
self.auth_url(prefix={'username': self.name}), data=pubkey, verify=False)
180+
payload.update({'username': self.name})
181+
req = self.session.put(self.url + '/client', \
182+
data=payload, \
183+
verify=False)
181184
except ConnectionError:
182185
print('Connection error : %s' % self.url)
183186
exit(1)
@@ -187,15 +190,17 @@ class CASSH(object):
187190
"""
188191
Sign a public key.
189192
"""
193+
payload = self.get_data()
190194
pubkey = open('%s.pub' % self.key_path, 'rb')
195+
payload.update({'pubkey': pubkey.read().replace(' ', '%20')})
196+
pubkey.close()
197+
payload.update({'username': self.name})
191198
try:
192199
if force:
193-
req = self.session.post(self.url + '/client' + \
194-
self.auth_url(prefix={'username': self.name, 'admin_force': True}), \
195-
data=pubkey, verify=False)
196-
else:
197-
req = self.session.post(self.url + '/client' + \
198-
self.auth_url(prefix={'username': self.name}), data=pubkey, verify=False)
200+
payload.update({'admin_force': True})
201+
req = self.session.post(self.url + '/client', \
202+
data=payload, \
203+
verify=False)
199204
except ConnectionError:
200205
print('Connection error : %s' % self.url)
201206
exit(1)
@@ -222,8 +227,10 @@ class CASSH(object):
222227
"""
223228
Get status of public key.
224229
"""
230+
payload = self.get_data()
225231
try:
226-
req = self.session.get(self.url + '/client' + self.auth_url(),\
232+
req = self.session.post(self.url + '/client/status', \
233+
data=payload, \
227234
verify=False)
228235
except ConnectionError:
229236
print('Connection error : %s' % self.url)
@@ -243,7 +250,8 @@ class CASSH(object):
243250
Get CA public key.
244251
"""
245252
try:
246-
req = self.session.get(self.url + '/ca', verify=False)
253+
req = self.session.get(self.url + '/ca', \
254+
verify=False)
247255
except ConnectionError:
248256
print('Connection error : %s' % self.url)
249257
exit(1)
@@ -254,7 +262,8 @@ class CASSH(object):
254262
Get CA KRL.
255263
"""
256264
try:
257-
req = self.session.get(self.url + '/krl', verify=False)
265+
req = self.session.get(self.url + '/krl', \
266+
verify=False)
258267
except ConnectionError:
259268
print('Connection error : %s' % self.url)
260269
exit(1)

0 commit comments

Comments
 (0)