Tomas Bzatek 878886
From 0441d0f93788b617a38b75e4a44744406976c822 Mon Sep 17 00:00:00 2001
Tomas Bzatek 878886
From: Tomas Bzatek <tbzatek@redhat.com>
Tomas Bzatek 878886
Date: Mon, 31 Jul 2023 16:48:28 +0200
Tomas Bzatek 878886
Subject: [PATCH] iscsi: Fix login on firmware-discovered nodes
Tomas Bzatek 878886
Tomas Bzatek 878886
There's currently no way to distinguish between force-no-auth and
Tomas Bzatek 878886
use-fw-discovered-auth-info scenarios from the D-Bus API so let's
Tomas Bzatek 878886
assume that the caller wants to retain the firmware-discovered auth
Tomas Bzatek 878886
info unless overriden with specific CHAP credentials.
Tomas Bzatek 878886
---
Tomas Bzatek 878886
 .../data/org.freedesktop.UDisks2.iscsi.xml    |  3 +++
Tomas Bzatek 878886
 modules/iscsi/udisksiscsiutil.c               | 27 ++++++++++++++++++-
Tomas Bzatek 878886
 2 files changed, 29 insertions(+), 1 deletion(-)
Tomas Bzatek 878886
Tomas Bzatek 878886
diff --git a/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml b/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
Tomas Bzatek 878886
index cf262deb68..e8a717ff1d 100644
Tomas Bzatek 878886
--- a/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
Tomas Bzatek 878886
+++ b/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
Tomas Bzatek 878886
@@ -162,6 +162,9 @@
Tomas Bzatek 878886
         <parameter>reverse-password</parameter> will be used for CHAP
Tomas Bzatek 878886
         authentication.
Tomas Bzatek 878886
 
Tomas Bzatek 878886
+        Firmware-discovered nodes retain their authentication info unless
Tomas Bzatek 878886
+        overriden with specified credentials (see above).
Tomas Bzatek 878886
+
Tomas Bzatek 878886
         All the additional options are transformed into the interface
Tomas Bzatek 878886
         parameters.  For example, if an automatic node startup is desired, the
Tomas Bzatek 878886
         <parameter>node.startup</parameter> needs to be set to
Tomas Bzatek 878886
diff --git a/modules/iscsi/udisksiscsiutil.c b/modules/iscsi/udisksiscsiutil.c
Tomas Bzatek 878886
index b279442876..fb4f5ea167 100644
Tomas Bzatek 878886
--- a/modules/iscsi/udisksiscsiutil.c
Tomas Bzatek 878886
+++ b/modules/iscsi/udisksiscsiutil.c
Tomas Bzatek 878886
@@ -264,6 +264,31 @@ iscsi_params_pop_chap_data (GVariant      *params,
Tomas Bzatek 878886
   return g_variant_dict_end (&dict);
Tomas Bzatek 878886
 }
Tomas Bzatek 878886
 
Tomas Bzatek 878886
+static gboolean
Tomas Bzatek 878886
+is_auth_required (struct libiscsi_context   *ctx,
Tomas Bzatek 878886
+                  struct libiscsi_node      *node,
Tomas Bzatek 878886
+                  struct libiscsi_auth_info *auth_info)
Tomas Bzatek 878886
+{
Tomas Bzatek 878886
+  char val[LIBISCSI_VALUE_MAXLEN + 1] = {'\0',};
Tomas Bzatek 878886
+  int ret;
Tomas Bzatek 878886
+
Tomas Bzatek 878886
+  /* TODO: No way to distinguish between the "no auth requested" and
Tomas Bzatek 878886
+   *       "retain discovered auth info" scenarios from the D-Bus API.
Tomas Bzatek 878886
+   */
Tomas Bzatek 878886
+
Tomas Bzatek 878886
+  /* In case CHAP auth is requested, let's use it unconditionally */
Tomas Bzatek 878886
+  if (auth_info->method != libiscsi_auth_none)
Tomas Bzatek 878886
+    return TRUE;
Tomas Bzatek 878886
+
Tomas Bzatek 878886
+  /* Avoid auth override on firmware-discovered nodes */
Tomas Bzatek 878886
+  ret = libiscsi_node_get_parameter (ctx, node, "node.discovery_type", val);
Tomas Bzatek 878886
+  if (ret == 0 && g_strcmp0 (val, "fw") == 0)
Tomas Bzatek 878886
+    return FALSE;
Tomas Bzatek 878886
+
Tomas Bzatek 878886
+  /* Not a firmware-discovered node, maintain legacy rules */
Tomas Bzatek 878886
+  return TRUE;
Tomas Bzatek 878886
+}
Tomas Bzatek 878886
+
Tomas Bzatek 878886
 gint
Tomas Bzatek 878886
 iscsi_login (UDisksLinuxModuleISCSI *module,
Tomas Bzatek 878886
              const gchar            *name,
Tomas Bzatek 878886
@@ -317,7 +342,7 @@ iscsi_login (UDisksLinuxModuleISCSI *module,
Tomas Bzatek 878886
       err = iscsi_perform_login_action (module,
Tomas Bzatek 878886
                                         ACTION_LOGIN,
Tomas Bzatek 878886
                                         &node,
Tomas Bzatek 878886
-                                        &auth_info,
Tomas Bzatek 878886
+                                        is_auth_required (ctx, &node, &auth_info) ? &auth_info : NULL,
Tomas Bzatek 878886
                                         errorstr);
Tomas Bzatek 878886
     }
Tomas Bzatek 878886