Skip to content

Commit 881fc75

Browse files
committed
Clean up "Not Yet Implemented" tests
This commit adds in tests for places that were previously marked as "Not Yet Implemented". Additionally, a couple of mistypes were discovered and fixed in heretofore untested methods. Close #22
1 parent 9892d4d commit 881fc75

File tree

4 files changed

+150
-38
lines changed

4 files changed

+150
-38
lines changed

gssapi/creds.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ def store(self, store=None, usage='both', mech=None,
170170
raise NotImplementedError("Your GSSAPI implementation does "
171171
"not have support for RFC 5588")
172172

173-
return rcred_cred_store.store_cred(self, usage, mech,
174-
overwrite, set_default)
173+
return rcred_rfc5588.store_cred(self, usage, mech,
174+
overwrite, set_default)
175175
else:
176176
if rcred_cred_store is None:
177177
raise NotImplementedError("Your GSSAPI implementation does "
@@ -332,6 +332,7 @@ def add(self, desired_name, desired_mech, usage='both',
332332
raise NotImplementedError("Your GSSAPI implementation does "
333333
"not have support for manipulating "
334334
"credential stores")
335+
store = _encode_dict(store)
335336

336337
res = rcred_cred_store.add_cred_from(store, self, desired_name,
337338
desired_mech, usage,

gssapi/raw/sec_contexts.pyx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def accept_sec_context(input_token not None, Creds acceptor_cred=None,
310310
free(bdng)
311311

312312
cdef Name on = Name()
313-
cdef Creds oc = Creds()
313+
cdef Creds oc = None
314314
cdef OID py_mech_type
315315
if maj_stat == GSS_S_COMPLETE or maj_stat == GSS_S_CONTINUE_NEEDED:
316316
if output_ttl == GSS_C_INDEFINITE:
@@ -319,7 +319,11 @@ def accept_sec_context(input_token not None, Creds acceptor_cred=None,
319319
output_ttl_py = output_ttl
320320

321321
on.raw_name = initiator_name
322-
oc.raw_creds = delegated_cred
322+
323+
if delegated_cred is not NULL:
324+
oc = Creds()
325+
oc.raw_creds = delegated_cred
326+
323327
if mech_type is not NULL:
324328
py_mech_type = OID()
325329
py_mech_type.raw_oid = mech_type[0]

gssapi/tests/test_high_level.py

Lines changed: 109 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from gssapi import exceptions as excs
1717
from gssapi.tests._utils import _extension_test
1818
from gssapi.tests import k5test as kt
19-
from gssapi._utils import import_gssapi_extension
2019

2120

2221
TARGET_SERVICE_NAME = b'host'
@@ -153,7 +152,34 @@ def test_acquire_by_method(self, str_name, kwargs):
153152

154153
@_extension_test('rfc5588', 'RFC 5588')
155154
def test_store_acquire(self):
156-
self.skipTest("Not Yet Implemented")
155+
# we need to acquire a forwardable ticket
156+
svc_princ = SERVICE_PRINCIPAL.decode("UTF-8")
157+
self.realm.kinit(svc_princ, flags=['-k', '-f'])
158+
159+
target_name = gssnames.Name(TARGET_SERVICE_NAME,
160+
gb.NameType.hostbased_service)
161+
162+
client_creds = gsscreds.Credentials(usage='initiate')
163+
client_ctx = gssctx.SecurityContext(
164+
name=target_name, creds=client_creds,
165+
flags=gb.RequirementFlag.delegate_to_peer)
166+
167+
client_token = client_ctx.step()
168+
169+
server_creds = gsscreds.Credentials(usage='accept')
170+
server_ctx = gssctx.SecurityContext(creds=server_creds)
171+
server_ctx.step(client_token)
172+
173+
deleg_creds = server_ctx.delegated_creds
174+
deleg_creds.shouldnt_be_none()
175+
176+
store_res = deleg_creds.store(usage='initiate', set_default=True)
177+
store_res.usage.should_be('initiate')
178+
store_res.mech_types.should_include(gb.MechType.kerberos)
179+
180+
reacquired_creds = gsscreds.Credentials(desired_name=deleg_creds.name,
181+
usage='initiate')
182+
reacquired_creds.shouldnt_be_none()
157183

158184
@_extension_test('cred_store', 'credentials store')
159185
def test_store_into_acquire_from(self):
@@ -181,7 +207,10 @@ def test_store_into_acquire_from(self):
181207
retrieved_creds.shouldnt_be_none()
182208

183209
def test_create_from_other(self):
184-
self.skipTest("Not Yet Implemented")
210+
raw_creds = gb.acquire_cred(None, cred_usage='accept').creds
211+
212+
high_level_creds = gsscreds.Credentials(raw_creds)
213+
high_level_creds.usage.should_be('accept')
185214

186215
@true_false_perms('name', 'lifetime', 'usage', 'mechs')
187216
def test_inquire(self, str_name, kwargs):
@@ -235,11 +264,41 @@ def test_inquire_by_mech(self, str_name, kwargs):
235264
resp.usage.should_be_none()
236265

237266
def test_add(self):
238-
self.skipTest("Not Yet Implemented")
267+
input_creds = gsscreds.Credentials(gb.Creds())
268+
name = gssnames.Name(SERVICE_PRINCIPAL)
269+
new_creds = input_creds.add(name, gb.MechType.kerberos,
270+
usage='initiate')
271+
272+
new_creds.shouldnt_be_none()
273+
new_creds.should_be_a(gsscreds.Credentials)
274+
275+
@_extension_test('cred_store', 'credentials store')
276+
def test_store_into_add_from(self):
277+
CCACHE = 'FILE:{tmpdir}/other_ccache'.format(tmpdir=self.realm.tmpdir)
278+
KT = '{tmpdir}/other_keytab'.format(tmpdir=self.realm.tmpdir)
279+
store = {'ccache': CCACHE, 'keytab': KT}
280+
281+
princ_name = 'service/cs@' + self.realm.realm
282+
self.realm.addprinc(princ_name)
283+
self.realm.extract_keytab(princ_name, KT)
284+
self.realm.kinit(princ_name, None, ['-k', '-t', KT])
285+
286+
initial_creds = gsscreds.Credentials(desired_name=None,
287+
usage='initiate')
239288

240-
# NB(directxman12): we don't test add_cred_from because it really requires
241-
# multiple mechanism support, which would mean something
242-
# like requiring NTLM libraries
289+
store_res = initial_creds.store(store, overwrite=True)
290+
291+
store_res.mech_types.shouldnt_be_none()
292+
store_res.mech_types.shouldnt_be_empty()
293+
store_res.usage.should_be('initiate')
294+
295+
name = gssnames.Name(princ_name)
296+
input_creds = gsscreds.Credentials(gb.Creds())
297+
retrieved_creds = input_creds.add(name, gb.MechType.kerberos,
298+
store=store)
299+
300+
retrieved_creds.shouldnt_be_none()
301+
retrieved_creds.should_be_a(gsscreds.Credentials)
243302

244303
@_extension_test('cred_imp_ext', 'credentials import-export')
245304
def test_export(self):
@@ -267,37 +326,54 @@ def test_pickle_unpickle(self):
267326

268327
@exist_perms(lifetime=30, desired_mechs=[gb.MechType.kerberos],
269328
usage='initiate')
329+
@_extension_test('s4u', 'S4U')
270330
def test_impersonate(self, str_name, kwargs):
271-
if import_gssapi_extension('s4u') is None:
272-
self.skipTest("The S4U GSSAPI extension is not supported "
273-
"by your GSSAPI implementation")
274-
else:
275-
target_name = gssnames.Name(TARGET_SERVICE_NAME,
276-
gb.NameType.hostbased_service)
277-
# TODO(directxman12): make this use the high-level SecurityContext
278-
client_ctx_resp = gb.init_sec_context(target_name)
279-
client_token = client_ctx_resp[3]
280-
del client_ctx_resp # free everything but the token
331+
target_name = gssnames.Name(TARGET_SERVICE_NAME,
332+
gb.NameType.hostbased_service)
333+
# TODO(directxman12): make this use the high-level SecurityContext
334+
client_ctx_resp = gb.init_sec_context(target_name)
335+
client_token = client_ctx_resp[3]
336+
del client_ctx_resp # free everything but the token
281337

282-
server_name = self.name
283-
server_creds = gsscreds.Credentials(desired_name=server_name,
284-
usage='both')
285-
server_ctx_resp = gb.accept_sec_context(client_token,
286-
acceptor_cred=server_creds)
338+
server_name = self.name
339+
server_creds = gsscreds.Credentials(desired_name=server_name,
340+
usage='both')
341+
server_ctx_resp = gb.accept_sec_context(client_token,
342+
acceptor_cred=server_creds)
287343

288-
imp_creds = server_creds.impersonate(server_ctx_resp[1], **kwargs)
344+
imp_creds = server_creds.impersonate(server_ctx_resp[1], **kwargs)
289345

290-
imp_creds.shouldnt_be_none()
291-
imp_creds.should_be_a(gsscreds.Credentials)
346+
imp_creds.shouldnt_be_none()
347+
imp_creds.should_be_a(gsscreds.Credentials)
292348

293349
@_extension_test('s4u', 'S4U')
294350
def test_add_with_impersonate(self):
295-
self.skipTest("Not Yet Implemented")
351+
target_name = gssnames.Name(TARGET_SERVICE_NAME,
352+
gb.NameType.hostbased_service)
353+
client_ctx = gssctx.SecurityContext(name=target_name)
354+
client_token = client_ctx.step()
355+
356+
server_creds = gsscreds.Credentials(usage='both')
357+
server_ctx = gssctx.SecurityContext(creds=server_creds, usage='accept')
358+
server_ctx.step(client_token)
359+
360+
# use empty creds to test here
361+
input_creds = gsscreds.Credentials(gb.Creds())
362+
new_creds = input_creds.add(server_ctx.initiator_name,
363+
gb.MechType.kerberos,
364+
impersonator=server_creds,
365+
usage='initiate')
366+
367+
new_creds.shouldnt_be(None)
368+
new_creds.should_be_a(gsscreds.Credentials)
296369

297370

298371
class NamesTestCase(_GSSAPIKerberosTestCase):
299372
def test_create_from_other(self):
300-
self.skipTest("Not Yet Implemented")
373+
raw_name = gb.import_name(SERVICE_PRINCIPAL)
374+
high_level_name = gssnames.Name(raw_name)
375+
376+
bytes(high_level_name).should_be(SERVICE_PRINCIPAL)
301377

302378
def test_create_from_name_no_type(self):
303379
name = gssnames.Name(SERVICE_PRINCIPAL)
@@ -398,11 +474,14 @@ def setUp(self):
398474
def _create_client_ctx(self, **kwargs):
399475
return gssctx.SecurityContext(name=self.target_name, **kwargs)
400476

401-
def test_process_token(self):
402-
self.skipTest("Not Yet Implemented")
477+
# NB(directxman12): we skip testing process_context_token, because there is
478+
# no concrete, non-deprecated was to obtain an "async"
479+
# token
403480

404481
def test_create_from_other(self):
405-
self.skipTest("Not Yet Implemented")
482+
raw_client_ctx, raw_server_ctx = self._create_completed_contexts()
483+
high_level_ctx = gssctx.SecurityContext(raw_client_ctx)
484+
high_level_ctx.target_name.should_be(self.target_name)
406485

407486
@exist_perms(desired_lifetime=30, flags=[],
408487
mech_type=gb.MechType.kerberos,

gssapi/tests/test_raw.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,8 @@ def test_inquire_context(self):
227227
is_open.should_be_a(bool)
228228
is_open.should_be_true()
229229

230-
def test_process_context_token(self):
231-
# TODO(directxman12): figure out how to write a test for this
232-
self.skipTest("Not Yet Implemented")
230+
# NB(directxman12): We don't test `process_context_token` because
231+
# there is no clear non-deprecated way to test it
233232

234233
@_extension_test('s4u', 'S4U')
235234
def test_add_cred_impersonate_name(self):
@@ -296,7 +295,36 @@ def test_acquire_creds_impersonate_name(self):
296295

297296
@_extension_test('rfc5588', 'RFC 5588')
298297
def test_store_cred_acquire_cred(self):
299-
self.skipTest("Not Yet Implemented")
298+
# we need to acquire a forwardable ticket
299+
svc_princ = SERVICE_PRINCIPAL.decode("UTF-8")
300+
self.realm.kinit(svc_princ, flags=['-k', '-f'])
301+
302+
target_name = gb.import_name(TARGET_SERVICE_NAME,
303+
gb.NameType.hostbased_service)
304+
305+
client_creds = gb.acquire_cred(None, cred_usage='initiate').creds
306+
client_ctx_resp = gb.init_sec_context(
307+
target_name, cred=client_creds,
308+
flags=gb.RequirementFlag.delegate_to_peer)
309+
310+
client_token = client_ctx_resp[3]
311+
312+
server_creds = gb.acquire_cred(None, cred_usage='accept').creds
313+
server_ctx_resp = gb.accept_sec_context(client_token,
314+
acceptor_cred=server_creds)
315+
316+
deleg_creds = server_ctx_resp.delegated_creds
317+
deleg_creds.shouldnt_be_none()
318+
store_res = gb.store_cred(deleg_creds, cred_usage='initiate',
319+
set_default=True)
320+
321+
store_res.shouldnt_be_none()
322+
store_res.usage.should_be('initiate')
323+
store_res.mech_types.should_include(gb.MechType.kerberos)
324+
325+
deleg_name = gb.inquire_cred(deleg_creds).name
326+
acq_resp = gb.acquire_cred(deleg_name, cred_usage='initiate')
327+
acq_resp.shouldnt_be_none()
300328

301329
@_extension_test('cred_store', 'credentials store')
302330
def test_store_cred_into_acquire_cred(self):

0 commit comments

Comments
 (0)