Author: vlendec
Date: 2006-08-18 15:10:46 +0000 (Fri, 18 Aug 2006)
New Revision: 17606

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17606

Log:
Introduce krb5_to_ntstatus.

Thanks to Michael Adam <[EMAIL PROTECTED]>

Volker
Modified:
   branches/SAMBA_3_0/source/libads/ads_status.c
   branches/SAMBA_3_0/source/libsmb/errormap.c


Changeset:
Modified: branches/SAMBA_3_0/source/libads/ads_status.c
===================================================================
--- branches/SAMBA_3_0/source/libads/ads_status.c       2006-08-18 14:05:25 UTC 
(rev 17605)
+++ branches/SAMBA_3_0/source/libads/ads_status.c       2006-08-18 15:10:46 UTC 
(rev 17606)
@@ -69,30 +69,29 @@
 */
 NTSTATUS ads_ntstatus(ADS_STATUS status)
 {
-       if (status.error_type == ENUM_ADS_ERROR_NT){
+       switch (status.error_type) {
+       case ENUM_ADS_ERROR_NT:
                return status.err.nt_status;    
-       }
-       if (status.error_type == ENUM_ADS_ERROR_SYSTEM) {
+       case ENUM_ADS_ERROR_SYSTEM:
                return map_nt_error_from_unix(status.err.rc);
-       }
 #ifdef HAVE_LDAP
-       if ((status.error_type == ENUM_ADS_ERROR_LDAP) 
-           && (status.err.rc == LDAP_NO_MEMORY)) {
-               return NT_STATUS_NO_MEMORY;
-       }
+       case ENUM_ADS_ERROR_LDAP:
+               if (status.err.rc == LDAP_NO_MEMORY) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+               break;
 #endif
 #ifdef HAVE_KRB5
-       if (status.error_type == ENUM_ADS_ERROR_KRB5) { 
-               if (status.err.rc == KRB5KDC_ERR_PREAUTH_FAILED) {
-                       return NT_STATUS_LOGON_FAILURE;
-               } else if (status.err.rc == KRB5_KDC_UNREACH) {
-                       return NT_STATUS_NO_LOGON_SERVERS;
-               } else if (status.err.rc == KRB5KRB_AP_ERR_SKEW) {
-                       return NT_STATUS_TIME_DIFFERENCE_AT_DC;
-               }
-       }
+       case ENUM_ADS_ERROR_KRB5:
+               return krb5_to_ntstatus(status.err.rc);
 #endif
-       if (ADS_ERR_OK(status)) return NT_STATUS_OK;
+       default:
+               break;
+       }
+
+       if (ADS_ERR_OK(status)) {
+               return NT_STATUS_OK;
+       }
        return NT_STATUS_UNSUCCESSFUL;
 }
 

Modified: branches/SAMBA_3_0/source/libsmb/errormap.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/errormap.c 2006-08-18 14:05:25 UTC (rev 
17605)
+++ branches/SAMBA_3_0/source/libsmb/errormap.c 2006-08-18 15:10:46 UTC (rev 
17606)
@@ -1566,3 +1566,40 @@
        /* Default return */
        return NT_STATUS_ACCESS_DENIED;
 }
+
+#ifdef HAVE_KRB5
+/*********************************************************************
+ Map a krb5 error code to an NT error code
+*********************************************************************/
+
+struct krb5_error_map {
+       int krb5_error;
+       NTSTATUS nt_error;
+};
+
+const struct krb5_error_map krb5_nt_errmap[] = {
+       { KRB5KDC_ERR_PREAUTH_FAILED, NT_STATUS_LOGON_FAILURE },
+       { KRB5_KDC_UNREACH, NT_STATUS_NO_LOGON_SERVERS },
+       { KRB5KRB_AP_ERR_SKEW, NT_STATUS_TIME_DIFFERENCE_AT_DC },
+       /* not sure if this mapping is appropriate */
+       { KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN, NT_STATUS_NO_TRUST_SAM_ACCOUNT },
+       { KRB5KDC_ERR_NONE, NT_STATUS_OK },
+       /* end of array flag - not used as error code... */
+       { 0, NT_STATUS_OK }
+};
+
+NTSTATUS krb5_to_ntstatus(int error) 
+{
+       int i = 0;
+
+       while (krb5_nt_errmap[i].krb5_error != 0) {
+               if (krb5_nt_errmap[i].krb5_error == error) {
+                       return krb5_nt_errmap[i].nt_error;
+               }
+               i++;
+       }
+
+       return NT_STATUS_ACCESS_DENIED;
+}
+#endif
+

Reply via email to