/* * call-seq: * cache([cache_name]) * * Call krb5_cc_store_cred to store credentials in a cachefile. With no parameters, it stores the credentials in the default cachefile. With one parameter, it stores the credentials in the named cachefile. This requires that the credentials have already been fetched via Krb5.get_init_creds_password or Krb5.get_init_creds_keytab. Returns true on success, raises Krb5Auth::Krb5::Exception on failure. */ static VALUE Krb5_cache_creds(int argc, VALUE *argv, VALUE self) { struct ruby_krb5 *kerb; krb5_error_code krbret; char *cache_name; krb5_ccache cc; if (argc == 0) { cache_name = NULL; } else if (argc == 1) { Check_Type(argv[0], T_STRING); cache_name = STR2CSTR(argv[0]); } else { rb_raise(rb_eRuntimeError, "Invalid arguments"); } Data_Get_Struct(self, struct ruby_krb5, kerb); if (!kerb) { NOSTRUCT_EXCEPT(); return Qfalse; } if (!kerb->princ) { // OK, it looks like they are trying to cache credentials that they don't // yet have; just throw an exception so we don't segfault later rb_raise(cKrb5_Exception, "%s", "Attempting to cache before obtaining credentials"); return Qfalse; } if (cache_name == NULL) { krbret = krb5_cc_default(kerb->ctx, &cc); } else { krbret = krb5_cc_resolve(kerb->ctx, cache_name, &cc); } if (krbret) { goto fail_cache; } krbret = krb5_cc_initialize(kerb->ctx, cc, kerb->princ); if (krbret) { goto fail_free_cc; } krbret = krb5_cc_store_cred(kerb->ctx, cc, &kerb->creds); if (krbret) { goto fail_free_cc; } krb5_cc_close(kerb->ctx, cc); return Qtrue; fail_free_cc: krb5_cc_close(kerb->ctx, cc); fail_cache: Krb5_register_error(krbret); // we will never reach here, since Krb5_register_error will rb_raise(). just // leave it to shut the compiler up return Qfalse; }