/ kuser / ntlm.c
ntlm.c
  1  /*
  2   * Copyright (c) 1997-2008 Kungliga Tekniska H�gskolan
  3   * (Royal Institute of Technology, Stockholm, Sweden).
  4   * All rights reserved.
  5   *
  6   * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
  7   *
  8   * Redistribution and use in source and binary forms, with or without
  9   * modification, are permitted provided that the following conditions
 10   * are met:
 11   *
 12   * 1. Redistributions of source code must retain the above copyright
 13   *    notice, this list of conditions and the following disclaimer.
 14   *
 15   * 2. Redistributions in binary form must reproduce the above copyright
 16   *    notice, this list of conditions and the following disclaimer in the
 17   *    documentation and/or other materials provided with the distribution.
 18   *
 19   * 3. Neither the name of the Institute nor the names of its contributors
 20   *    may be used to endorse or promote products derived from this software
 21   *    without specific prior written permission.
 22   *
 23   * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 25   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 26   * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 27   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 28   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 29   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 30   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 31   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 32   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 33   * SUCH DAMAGE.
 34   */
 35  
 36  #include <stdio.h>
 37  #include <krb5.h>
 38  #include <kcm.h>
 39  
 40  
 41  static void
 42  add_cred(krb5_context context)
 43  {
 44      krb5_error_code ret;
 45      krb5_storage *request, *response;
 46      krb5_data response_data;
 47      krb5_data data;
 48  
 49  #if 0
 50      char password[512];
 51  
 52      if (UI_UTIL_read_pw_string(password, sizeof(password),
 53  			       "Password:", 0) != 1)
 54         errx(1, "failed reading password");
 55  #endif
 56         
 57      ret = krb5_kcm_storage_request(context, KCM_OP_ADD_NTLM_CRED, &request);
 58      if (ret)
 59  	krb5_err(context, 1, ret, "krb5_kcm_storage_request");
 60  
 61      krb5_store_stringz(request, "lha");
 62      krb5_store_stringz(request, "BUILTIN");
 63      data.data = "\xac\x8e\x65\x7f\x83\xdf\x82\xbe\xea\x5d\x43\xbd\xaf\x78\x0\xcc"; /* foo */
 64      data.length = 16;
 65      krb5_store_data(request, data);
 66  
 67      ret = krb5_kcm_call(context, request, &response, &response_data);
 68      if (ret)
 69  	krb5_err(context, 1, ret, "krb5_kcm_call");
 70  
 71      krb5_storage_free(request);
 72      krb5_storage_free(response);
 73      krb5_data_free(&response_data);
 74  }
 75  
 76  
 77  static void
 78  list_cred(krb5_context context)
 79  {
 80      krb5_error_code ret;
 81      krb5_storage *request, *response;
 82      krb5_data response_data;
 83      
 84      ret = krb5_kcm_storage_request(context, KCM_OP_GET_NTLM_USER_LIST, &request);
 85      if (ret)
 86  	krb5_err(context, 1, ret, "krb5_kcm_storage_request");
 87  
 88      ret = krb5_kcm_call(context, request, &response, &response_data);
 89      if (ret)
 90  	krb5_err(context, 1, ret, "krb5_kcm_call");
 91  
 92      while (1) {
 93  	uint32_t morep;
 94  	char *user = NULL, *domain = NULL;
 95  
 96  	ret = krb5_ret_uint32(response, &morep);
 97  	if (ret)
 98  	    krb5_err(context, ret, 1, "ret: morep");
 99  
100  	if (morep == 0)
101  	    break;
102  
103  	ret = krb5_ret_stringz(response, &user);
104  	if (ret)
105  	    krb5_err(context, ret, 1, "ret: user");
106  	ret = krb5_ret_stringz(response, &domain);
107  	if (ret)
108  	    krb5_err(context, ret, 1, "ret: domain");
109  
110  
111  	printf("user: %s domain: %s\n", user, domain);
112      }
113  
114      krb5_storage_free(request);
115      krb5_storage_free(response);
116      krb5_data_free(&response_data);
117  }
118  
119  
120  
121  int
122  main(int argc, char **argv)
123  {
124      krb5_error_code ret;
125      krb5_context context;
126      
127      ret = krb5_init_context(&context);
128      if (ret)
129  	errx(1, "krb5_init_context");
130  
131      list_cred(context);
132  
133      add_cred(context);
134  
135      krb5_free_context(context);
136  
137      return 0;
138  }