]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Handle concat OTP responder case
authorNathaniel McCallum <npmccallum@redhat.com>
Tue, 16 Oct 2012 16:40:15 +0000 (12:40 -0400)
committerGreg Hudson <ghudson@mit.edu>
Tue, 16 Oct 2012 16:54:21 +0000 (12:54 -0400)
src/include/krb5/krb5.hin
src/lib/krb5/krb/preauth_otp.c

index f338689f6df28d481a8f9d0cbad0765b6ce7ab09..13ada8f7897e8b90a5b6d4008ce53d1446596208 100644 (file)
@@ -6427,6 +6427,15 @@ krb5_prompter_posix(krb5_context context, void *data, const char *name,
  */
 #define KRB5_RESPONDER_OTP_FLAGS_NEXTOTP       (1 << 2)
 
+/**
+ * This flag indicates that the PIN MUST be returned as a separate item. This
+ * flag only takes effect if KRB5_RESPONDER_OTP_FLAGS_COLLECT_PIN is set. If
+ * this flag is not set, the responder may either concatenate PIN + token value
+ * and store it as "value" in the answer or it may return them separately. If
+ * they are returned separately, they will be concatenated internally.
+ */
+#define KRB5_RESPONDER_OTP_FLAGS_SEPARATE_PIN  (1 << 3)
+
 typedef struct krb5_responder_context_st *krb5_responder_context;
 
 /**
index 9a550e8e381b4b3d1ef5d75022696e154ac627d0..83c30c7ab17cf36368880556e43ad234da4d35c8 100644 (file)
@@ -157,8 +157,11 @@ codec_encode_tokeninfo(krb5_otp_tokeninfo *ti, k5_json_object *out)
         goto error;
 
     flags = KRB5_RESPONDER_OTP_FLAGS_COLLECT_TOKEN;
-    if (ti->flags & KRB5_OTP_FLAG_COLLECT_PIN)
+    if (ti->flags & KRB5_OTP_FLAG_COLLECT_PIN) {
         flags |= KRB5_RESPONDER_OTP_FLAGS_COLLECT_PIN;
+        if (ti->flags & KRB5_OTP_FLAG_SEPARATE_PIN)
+            flags |= KRB5_RESPONDER_OTP_FLAGS_NEXTOTP;
+    }
     if (ti->flags & KRB5_OTP_FLAG_NEXTOTP)
         flags |= KRB5_RESPONDER_OTP_FLAGS_NEXTOTP;
 
@@ -642,16 +645,16 @@ make_request(krb5_context ctx, krb5_otp_tokeninfo *ti, const krb5_data *value,
         goto error;
 
     if (ti->flags & KRB5_OTP_FLAG_COLLECT_PIN) {
-        if (pin == NULL || pin->data == NULL) {
-            retval = EINVAL; /* No pin found! */
-            goto error;
-        }
-
         if (ti->flags & KRB5_OTP_FLAG_SEPARATE_PIN) {
+            if (pin == NULL || pin->data == NULL) {
+                retval = EINVAL; /* No pin found! */
+                goto error;
+            }
+
             retval = krb5int_copy_data_contents(ctx, pin, &req->pin);
             if (retval != 0)
                 goto error;
-        } else {
+        } else if (pin != NULL && pin->data != NULL) {
             krb5_free_data_contents(ctx, &req->otp_value);
             retval = asprintf(&req->otp_value.data, "%.*s%.*s",
                               pin->length, pin->data,
@@ -662,7 +665,7 @@ make_request(krb5_context ctx, krb5_otp_tokeninfo *ti, const krb5_data *value,
                 goto error;
             }
             req->otp_value.length = req->pin.length + req->otp_value.length;
-        }
+        } /* Otherwise, the responder has already combined them. */
     }
 
     *out_req = req;