typedef struct OpaqueKLLoginOptions {
krb5_get_init_creds_opt options;
KLTime startTime;
char *serviceName;
krb5_context context;
krb5_address **addresses;
} LoginOptions;
#pragma mark -
KLStatus KLCreateLoginOptions (KLLoginOptions *outOptions)
{
KLStatus err = klNoErr;
KLLoginOptions loginOptions = NULL;
KLSize size;
KLLifetime ticketLifetime;
KLLifetime renewLifetime;
KLBoolean forwardable, proxiable, addressless, renewable;
if (err == klNoErr) {
size = sizeof (ticketLifetime);
err = KLGetDefaultLoginOption (loginOption_DefaultTicketLifetime, &ticketLifetime, &size);
}
if (err == klNoErr) {
size = sizeof (renewLifetime);
err = KLGetDefaultLoginOption (loginOption_DefaultRenewableLifetime, &renewLifetime, &size);
}
if (err == klNoErr) {
size = sizeof (renewable);
err = KLGetDefaultLoginOption (loginOption_DefaultRenewableTicket, &renewable, &size);
}
if (err == klNoErr) {
size = sizeof (forwardable);
err = KLGetDefaultLoginOption (loginOption_DefaultForwardableTicket, &forwardable, &size);
}
if (err == klNoErr) {
size = sizeof (proxiable);
err = KLGetDefaultLoginOption (loginOption_DefaultProxiableTicket, &proxiable, &size);
}
if (err == klNoErr) {
size = sizeof (addressless);
err = KLGetDefaultLoginOption (loginOption_DefaultAddresslessTicket, &addressless, &size);
}
if (err == klNoErr) {
loginOptions = (KLLoginOptions) malloc (sizeof (LoginOptions));
if (loginOptions == NULL) { err = KLError_ (klMemFullErr); }
}
if (err == klNoErr) {
krb5_get_init_creds_opt_init (&loginOptions->options);
loginOptions->startTime = 0;
loginOptions->serviceName = NULL;
loginOptions->context = NULL;
loginOptions->addresses = NULL;
}
if (err == klNoErr) {
KLLoginOptionsSetTicketLifetime (loginOptions, ticketLifetime);
KLLoginOptionsSetForwardable (loginOptions, forwardable);
KLLoginOptionsSetProxiable (loginOptions, proxiable);
KLLoginOptionsSetAddressless (loginOptions, addressless);
if (renewable) {
KLLoginOptionsSetRenewableLifetime (loginOptions, renewLifetime);
}
}
if (err == klNoErr) {
*outOptions = loginOptions;
} else {
if (loginOptions != NULL) { free (loginOptions); }
}
return KLError_ (err);
}
KLStatus KLLoginOptionsSetTicketLifetime (KLLoginOptions ioOptions,
KLLifetime inTicketLifetime)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
krb5_get_init_creds_opt_set_tkt_life (&ioOptions->options, inTicketLifetime);
return klNoErr;
}
KLStatus KLLoginOptionsSetForwardable (KLLoginOptions ioOptions,
KLBoolean inForwardable)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
krb5_get_init_creds_opt_set_forwardable (&ioOptions->options, inForwardable);
return klNoErr;
}
KLStatus KLLoginOptionsSetProxiable (KLLoginOptions ioOptions,
KLBoolean inProxiable)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
krb5_get_init_creds_opt_set_proxiable (&ioOptions->options, inProxiable);
return klNoErr;
}
KLStatus KLLoginOptionsSetRenewableLifetime (KLLoginOptions ioOptions,
KLLifetime inRenewableLifetime)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
krb5_get_init_creds_opt_set_renew_life (&ioOptions->options, inRenewableLifetime);
return klNoErr;
}
KLStatus KLLoginOptionsSetAddressless (KLLoginOptions ioOptions,
KLBoolean inAddressless)
{
KLStatus err = klNoErr;
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
if (ioOptions->context != NULL) {
if (ioOptions->addresses != NULL) {
krb5_free_addresses (ioOptions->context, ioOptions->addresses);
}
krb5_free_context (ioOptions->context);
}
ioOptions->context = NULL;
ioOptions->addresses = NULL;
if (!inAddressless) {
krb5_context context = NULL;
krb5_address **addresses = NULL;
if (err == klNoErr) {
err = krb5_init_context (&context);
}
if (err == klNoErr) {
err = krb5_os_localaddr (context, &addresses);
}
if (err == klNoErr) {
ioOptions->context = context;
ioOptions->addresses = addresses;
} else {
if (addresses != NULL) { krb5_free_addresses (context, addresses); }
if (context != NULL) { krb5_free_context (context); }
}
}
if (err == klNoErr) {
krb5_get_init_creds_opt_set_address_list (&ioOptions->options, ioOptions->addresses);
}
return KLError_ (err);
}
KLStatus KLLoginOptionsSetTicketStartTime (KLLoginOptions ioOptions,
KLTime inStartTime)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
ioOptions->startTime = inStartTime;
return KLError_ (klNoErr);
}
KLStatus KLLoginOptionsSetServiceName (KLLoginOptions ioOptions,
const char *inServiceName)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
if (ioOptions->serviceName != NULL) {
free (ioOptions->serviceName);
ioOptions->serviceName = NULL;
}
if (inServiceName != NULL) {
ioOptions->serviceName = (char *) malloc (sizeof(char) * (strlen (inServiceName) + 1));
if (ioOptions->serviceName == NULL) { return KLError_ (klMemFullErr); }
strcpy (ioOptions->serviceName, inServiceName);
}
return KLError_ (klNoErr);
}
KLStatus KLDisposeLoginOptions (KLLoginOptions ioOptions)
{
if (ioOptions == NULL) { return KLError_ (klBadLoginOptionsErr); }
if (ioOptions->serviceName != NULL) { free (ioOptions->serviceName); }
if (ioOptions->context != NULL) {
if (ioOptions->addresses != NULL) {
krb5_free_addresses (ioOptions->context, ioOptions->addresses);
}
krb5_free_context (ioOptions->context);
}
free (ioOptions);
return KLError_ (klNoErr);
}
#pragma mark -
krb5_get_init_creds_opt *__KLLoginOptionsGetKerberos5Options (KLLoginOptions ioOptions)
{
return &ioOptions->options;
}
KLTime __KLLoginOptionsGetStartTime (KLLoginOptions ioOptions)
{
return ioOptions->startTime;
}
char * __KLLoginOptionsGetServiceName (KLLoginOptions ioOptions)
{
return ioOptions->serviceName;
}