s3-net: modify the current "net ads kerberos pac" command.
authorGünther Deschner <gd@samba.org>
Tue, 11 Mar 2014 17:14:39 +0000 (18:14 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 12 Mar 2014 09:57:27 +0000 (10:57 +0100)
Rename it to "net ads kerberos pac dump" and add a "type=num" option to allow
dumping of individial pac buffer types. Ommitting type= or using type=0 will
dump the whole PAC structure on stdout.

Guenther

Signed-off-by: Günther Deschner <gd@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/utils/net_ads.c

index 19c28b12f7b8cc0a03e0e374ab32b0abfae24e06..f54cf235daa2c0815e16eccada2d9540e71b5d97 100644 (file)
@@ -2597,27 +2597,15 @@ static int net_ads_kerberos_renew(struct net_context *c, int argc, const char **
        return ret;
 }
 
-static int net_ads_kerberos_pac(struct net_context *c, int argc, const char **argv)
+static int net_ads_kerberos_pac_common(struct net_context *c, int argc, const char **argv,
+                                      struct PAC_DATA_CTR **pac_data_ctr)
 {
-       struct PAC_LOGON_INFO *info = NULL;
-       struct PAC_DATA *pac_data = NULL;
-       struct PAC_DATA_CTR *pac_data_ctr = NULL;
-       TALLOC_CTX *mem_ctx = NULL;
        NTSTATUS status;
        int ret = -1;
        const char *impersonate_princ_s = NULL;
        const char *local_service = NULL;
        int i;
 
-       if (c->display_usage) {
-               d_printf(  "%s\n"
-                          "net ads kerberos pac [impersonation_principal]\n"
-                          "    %s\n",
-                        _("Usage:"),
-                        _("Dump the Kerberos PAC"));
-               return 0;
-       }
-
        for (i=0; i<argc; i++) {
                if (strnequal(argv[i], "impersonate", strlen("impersonate"))) {
                        impersonate_princ_s = get_string_param(argv[i]);
@@ -2633,13 +2621,8 @@ static int net_ads_kerberos_pac(struct net_context *c, int argc, const char **ar
                }
        }
 
-       mem_ctx = talloc_init("net_ads_kerberos_pac");
-       if (!mem_ctx) {
-               goto out;
-       }
-
        if (local_service == NULL) {
-               local_service = talloc_asprintf(mem_ctx, "%s$@%s",
+               local_service = talloc_asprintf(c, "%s$@%s",
                                                lp_netbios_name(), lp_realm());
                if (local_service == NULL) {
                        goto out;
@@ -2648,7 +2631,7 @@ static int net_ads_kerberos_pac(struct net_context *c, int argc, const char **ar
 
        c->opt_password = net_prompt_pass(c, c->opt_user_name);
 
-       status = kerberos_return_pac(mem_ctx,
+       status = kerberos_return_pac(c,
                                     c->opt_user_name,
                                     c->opt_password,
                                     0,
@@ -2660,39 +2643,95 @@ static int net_ads_kerberos_pac(struct net_context *c, int argc, const char **ar
                                     2592000, /* one month */
                                     impersonate_princ_s,
                                     local_service,
-                                    &pac_data_ctr);
+                                    pac_data_ctr);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf(_("failed to query kerberos PAC: %s\n"),
                        nt_errstr(status));
                goto out;
        }
 
-       pac_data = pac_data_ctr->pac_data;
+       ret = 0;
+ out:
+       return ret;
+}
 
-       for (i=0; i < pac_data->num_buffers; i++) {
+static int net_ads_kerberos_pac_dump(struct net_context *c, int argc, const char **argv)
+{
+       struct PAC_DATA_CTR *pac_data_ctr = NULL;
+       int i;
+       int ret = -1;
+       enum PAC_TYPE type = 0;
 
-               if (pac_data->buffers[i].type != PAC_TYPE_LOGON_INFO) {
-                       continue;
+       if (c->display_usage) {
+               d_printf(  "%s\n"
+                          "net ads kerberos pac dump [impersonate=string] [local_service=string] [pac_buffer_type=int]\n"
+                          "    %s\n",
+                        _("Usage:"),
+                        _("Dump the Kerberos PAC"));
+               return -1;
+       }
+
+       for (i=0; i<argc; i++) {
+               if (strnequal(argv[i], "pac_buffer_type", strlen("pac_buffer_type"))) {
+                       type = get_int_param(argv[i]);
                }
+       }
 
-               info = pac_data->buffers[i].info->logon_info.info;
-               if (!info) {
-                       goto out;
+       ret = net_ads_kerberos_pac_common(c, argc, argv, &pac_data_ctr);
+       if (ret) {
+               return ret;
+       }
+
+       if (type == 0) {
+
+               char *s = NULL;
+
+               s = NDR_PRINT_STRUCT_STRING(c, PAC_DATA,
+                       pac_data_ctr->pac_data);
+               if (s != NULL) {
+                       d_printf(_("The Pac: %s\n"), s);
+                       talloc_free(s);
                }
 
-               break;
+               return 0;
        }
 
-       if (info) {
-               const char *s;
-               s = NDR_PRINT_STRUCT_STRING(mem_ctx, PAC_LOGON_INFO, info);
-               d_printf(_("The Pac: %s\n"), s);
+       for (i=0; i < pac_data_ctr->pac_data->num_buffers; i++) {
+
+               char *s = NULL;
+
+               if (pac_data_ctr->pac_data->buffers[i].type != type) {
+                       continue;
+               }
+
+               s = NDR_PRINT_UNION_STRING(c, PAC_INFO, type,
+                               pac_data_ctr->pac_data->buffers[i].info);
+               if (s != NULL) {
+                       d_printf(_("The Pac: %s\n"), s);
+                       talloc_free(s);
+               }
+               break;
        }
 
-       ret = 0;
- out:
-       TALLOC_FREE(mem_ctx);
-       return ret;
+       return 0;
+}
+
+static int net_ads_kerberos_pac(struct net_context *c, int argc, const char **argv)
+{
+       struct functable func[] = {
+               {
+                       "dump",
+                       net_ads_kerberos_pac_dump,
+                       NET_TRANSPORT_ADS,
+                       N_("Dump Kerberos PAC"),
+                       N_("net ads kerberos pac dump\n"
+                          "    Dump a Kerberos PAC to stdout")
+               },
+
+               {NULL, NULL, 0, NULL, NULL}
+       };
+
+       return net_run_function(c, argc, argv, "net ads kerberos pac", func);
 }
 
 static int net_ads_kerberos_kinit(struct net_context *c, int argc, const char **argv)