⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kinit.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1997-2007 Kungliga Tekniska H鰃skolan * (Royal Institute of Technology, Stockholm, Sweden).  * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  */#include "kuser_locl.h"RCSID("$Id: kinit.c 22116 2007-12-03 21:22:58Z lha $");#include "krb5-v4compat.h"#include "heimntlm.h"int forwardable_flag	= -1;int proxiable_flag	= -1;int renewable_flag	= -1;int renew_flag		= 0;int pac_flag		= -1;int validate_flag	= 0;int version_flag	= 0;int help_flag		= 0;int addrs_flag		= -1;struct getarg_strings extra_addresses;int anonymous_flag	= 0;char *lifetime 		= NULL;char *renew_life	= NULL;char *server_str	= NULL;char *cred_cache	= NULL;char *start_str		= NULL;struct getarg_strings etype_str;int use_keytab		= 0;char *keytab_str	= NULL;int do_afslog		= -1;int get_v4_tgt		= -1;int convert_524		= 0;int fcache_version;char *password_file	= NULL;char *pk_user_id	= NULL;char *pk_x509_anchors	= NULL;int pk_use_enckey	= 0;static int canonicalize_flag = 0;static char *ntlm_domain;static char *krb4_cc_name;static struct getargs args[] = {    /*      * used by MIT     * a: ~A     * V: verbose     * F: ~f     * P: ~p     * C: v4 cache name?     * 5:      */    { "524init", 	'4', arg_flag, &get_v4_tgt,      "obtain version 4 TGT" },    { "524convert", 	'9', arg_flag, &convert_524,      "only convert ticket to version 4" },    { "afslog", 	0  , arg_flag, &do_afslog,      "obtain afs tokens"  },    { "cache", 		'c', arg_string, &cred_cache,      "credentials cache", "cachename" },    { "forwardable",	'f', arg_flag, &forwardable_flag,      "get forwardable tickets"},    { "keytab",         't', arg_string, &keytab_str,      "keytab to use", "keytabname" },    { "lifetime",	'l', arg_string, &lifetime,      "lifetime of tickets", "time"},    { "proxiable",	'p', arg_flag, &proxiable_flag,      "get proxiable tickets" },    { "renew",          'R', arg_flag, &renew_flag,      "renew TGT" },    { "renewable",	0,   arg_flag, &renewable_flag,      "get renewable tickets" },    { "renewable-life",	'r', arg_string, &renew_life,      "renewable lifetime of tickets", "time" },    { "server", 	'S', arg_string, &server_str,      "server to get ticket for", "principal" },    { "start-time",	's', arg_string, &start_str,      "when ticket gets valid", "time" },    { "use-keytab",     'k', arg_flag, &use_keytab,      "get key from keytab" },    { "validate",	'v', arg_flag, &validate_flag,      "validate TGT" },    { "enctypes",	'e', arg_strings, &etype_str,      "encryption types to use", "enctypes" },    { "fcache-version", 0,   arg_integer, &fcache_version,      "file cache version to create" },    { "addresses",	'A',   arg_negative_flag,	&addrs_flag,      "request a ticket with no addresses" },    { "extra-addresses",'a', arg_strings,	&extra_addresses,      "include these extra addresses", "addresses" },    { "anonymous",	0,   arg_flag,	&anonymous_flag,      "request an anonymous ticket" },    { "request-pac",	0,   arg_flag,	&pac_flag,      "request a Windows PAC" },    { "password-file",	0,   arg_string, &password_file,      "read the password from a file" },    { "canonicalize",0,   arg_flag, &canonicalize_flag,      "canonicalize client principal" },#ifdef PKINIT    { "pk-user",	'C',	arg_string,	&pk_user_id,      "principal's public/private/certificate identifier", "id" },    { "x509-anchors",	'D',  arg_string, &pk_x509_anchors,      "directory with CA certificates", "directory" },    { "pk-use-enckey",	0,  arg_flag, &pk_use_enckey,      "Use RSA encrypted reply (instead of DH)" },#endif    { "ntlm-domain",	0,  arg_string, &ntlm_domain,      "NTLM domain", "domain" },    { "version", 	0,   arg_flag, &version_flag },    { "help",		0,   arg_flag, &help_flag }};static voidusage (int ret){    arg_printusage (args,		    sizeof(args)/sizeof(*args),		    NULL,		    "[principal [command]]");    exit (ret);}static krb5_error_codeget_server(krb5_context context,	   krb5_principal client,	   const char *server,	   krb5_principal *princ){    krb5_realm *client_realm;    if(server)	return krb5_parse_name(context, server, princ);    client_realm = krb5_princ_realm (context, client);    return krb5_make_principal(context, princ, *client_realm,			       KRB5_TGS_NAME, *client_realm, NULL);}static krb5_error_codedo_524init(krb5_context context, krb5_ccache ccache, 	   krb5_creds *creds, const char *server){    krb5_error_code ret;    struct credentials c;    krb5_creds in_creds, *real_creds;    if(creds != NULL)	real_creds = creds;    else {	krb5_principal client;	krb5_cc_get_principal(context, ccache, &client);	memset(&in_creds, 0, sizeof(in_creds));	ret = get_server(context, client, server, &in_creds.server);	if(ret) {	    krb5_free_principal(context, client);	    return ret;	}	in_creds.client = client;	ret = krb5_get_credentials(context, 0, ccache, &in_creds, &real_creds);	krb5_free_principal(context, client);	krb5_free_principal(context, in_creds.server);	if(ret)	    return ret;    }    ret = krb524_convert_creds_kdc_ccache(context, ccache, real_creds, &c);    if(ret)	krb5_warn(context, ret, "converting creds");    else {	krb5_error_code tret = _krb5_krb_tf_setup(context, &c, NULL, 0);	if(tret)	    krb5_warn(context, tret, "saving v4 creds");    }    if(creds == NULL)	krb5_free_creds(context, real_creds);    memset(&c, 0, sizeof(c));    return ret;}static intrenew_validate(krb5_context context, 	       int renew,	       int validate,	       krb5_ccache cache, 	       const char *server,	       krb5_deltat life){    krb5_error_code ret;    krb5_creds in, *out = NULL;    krb5_kdc_flags flags;    memset(&in, 0, sizeof(in));    ret = krb5_cc_get_principal(context, cache, &in.client);    if(ret) {	krb5_warn(context, ret, "krb5_cc_get_principal");	return ret;    }    ret = get_server(context, in.client, server, &in.server);    if(ret) {	krb5_warn(context, ret, "get_server");	goto out;    }    if (renew) {	/* 	 * no need to check the error here, it's only to be 	 * friendly to the user	 */	krb5_get_credentials(context, KRB5_GC_CACHED, cache, &in, &out);    }    flags.i = 0;    flags.b.renewable         = flags.b.renew = renew;    flags.b.validate          = validate;    if (forwardable_flag != -1)	flags.b.forwardable       = forwardable_flag;    else if (out)	flags.b.forwardable 	  = out->flags.b.forwardable;    if (proxiable_flag != -1)	flags.b.proxiable         = proxiable_flag;    else if (out)	flags.b.proxiable 	  = out->flags.b.proxiable;    if (anonymous_flag != -1)	flags.b.request_anonymous = anonymous_flag;    if(life)	in.times.endtime = time(NULL) + life;    if (out) {	krb5_free_creds (context, out);	out = NULL;    }    ret = krb5_get_kdc_cred(context,			    cache,			    flags,			    NULL,			    NULL,			    &in,			    &out);    if(ret) {	krb5_warn(context, ret, "krb5_get_kdc_cred");	goto out;    }    ret = krb5_cc_initialize(context, cache, in.client);    if(ret) {	krb5_free_creds (context, out);	krb5_warn(context, ret, "krb5_cc_initialize");	goto out;    }    ret = krb5_cc_store_cred(context, cache, out);    if(ret == 0 && server == NULL) {	/* only do this if it's a general renew-my-tgt request */	if(get_v4_tgt)	    do_524init(context, cache, out, NULL);	if(do_afslog && k_hasafs())	    krb5_afslog(context, cache, NULL, NULL);    }    krb5_free_creds (context, out);    if(ret) {	krb5_warn(context, ret, "krb5_cc_store_cred");	goto out;    }out:    krb5_free_cred_contents(context, &in);    return ret;}static krb5_error_codestore_ntlmkey(krb5_context context, krb5_ccache id, 	      const char *domain, krb5_const_principal client,	      struct ntlm_buf *buf){    krb5_error_code ret;    krb5_creds cred;        memset(&cred, 0, sizeof(cred));    ret = krb5_make_principal(context, &cred.server,			      krb5_principal_get_realm(context, client),			      "@ntlm-key", domain, NULL);    if (ret)	goto out;    ret = krb5_copy_principal(context, client, &cred.client);    if (ret)	goto out;        cred.times.authtime = time(NULL);    cred.times.endtime = time(NULL) + 3600 * 24 * 30; /* XXX */    cred.session.keytype = ENCTYPE_ARCFOUR_HMAC_MD5;    ret = krb5_data_copy(&cred.session.keyvalue, buf->data, buf->length);    if (ret)	goto out;    ret = krb5_cc_store_cred(context, id, &cred);out:    krb5_free_cred_contents (context, &cred);    return 0;}static krb5_error_codeget_new_tickets(krb5_context context, 		krb5_principal principal,		krb5_ccache ccache,		krb5_deltat ticket_life,		int interactive){    krb5_error_code ret;    krb5_get_init_creds_opt *opt;    krb5_creds cred;    char passwd[256];    krb5_deltat start_time = 0;    krb5_deltat renew = 0;    char *renewstr = NULL;    krb5_enctype *enctype = NULL;    struct ntlm_buf ntlmkey;    krb5_ccache tempccache;    memset(&ntlmkey, 0, sizeof(ntlmkey));    passwd[0] = '\0';    if (password_file) {	FILE *f;	if (strcasecmp("STDIN", password_file) == 0)	    f = stdin;	else	    f = fopen(password_file, "r");	if (f == NULL)	    krb5_errx(context, 1, "Failed to open the password file %s",		      password_file);	if (fgets(passwd, sizeof(passwd), f) == NULL)	    krb5_errx(context, 1, 		      "Failed to read password from file %s", password_file);	if (f != stdin)	    fclose(f);	passwd[strcspn(passwd, "\n")] = '\0';    }    memset(&cred, 0, sizeof(cred));    ret = krb5_get_init_creds_opt_alloc (context, &opt);    if (ret)	krb5_err(context, 1, ret, "krb5_get_init_creds_opt_alloc");        krb5_get_init_creds_opt_set_default_flags(context, "kinit",	krb5_principal_get_realm(context, principal), opt);    if(forwardable_flag != -1)	krb5_get_init_creds_opt_set_forwardable (opt, forwardable_flag);    if(proxiable_flag != -1)	krb5_get_init_creds_opt_set_proxiable (opt, proxiable_flag);    if(anonymous_flag != -1)	krb5_get_init_creds_opt_set_anonymous (opt, anonymous_flag);    if (pac_flag != -1)	krb5_get_init_creds_opt_set_pac_request(context, opt, 						pac_flag ? TRUE : FALSE);    if (canonicalize_flag)	krb5_get_init_creds_opt_set_canonicalize(context, opt, TRUE);    if (pk_user_id) {	ret = krb5_get_init_creds_opt_set_pkinit(context, opt,						 principal,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -