From b19d9caba69c5408accdd7de8e061300ddb427e2 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Sun, 13 Mar 2022 01:17:25 +0100
Subject: [PATCH] Sort known UIA flows first

---
 src/ui/UIA.cpp | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/ui/UIA.cpp b/src/ui/UIA.cpp
index 9f28ca6ad..7c6e440cb 100644
--- a/src/ui/UIA.cpp
+++ b/src/ui/UIA.cpp
@@ -60,6 +60,36 @@ UIA::genericHandler(QString context)
                 return;
             }
 
+            // sort flows with known stages first
+            std::sort(
+              flows.begin(),
+              flows.end(),
+              [](const mtx::user_interactive::Flow &a, const mtx::user_interactive::Flow &b) {
+                  auto calcWeight = [](const mtx::user_interactive::Flow &f) {
+                      using namespace mtx::user_interactive::auth_types;
+                      const static std::map<std::string_view, int> weights{
+                        {mtx::user_interactive::auth_types::password, 0},
+                        {mtx::user_interactive::auth_types::email_identity, 0},
+                        {mtx::user_interactive::auth_types::msisdn, 0},
+                        {mtx::user_interactive::auth_types::dummy, 0},
+                        {mtx::user_interactive::auth_types::registration_token, 0},
+                        // recaptcha is known, but we'd like to avoid it, because it calls out to
+                        // the browser
+                        {mtx::user_interactive::auth_types::recaptcha, 1},
+                      };
+                      int weight = 0;
+                      for (const auto &s : f.stages) {
+                          if (!weights.count(s))
+                              weight += 3;
+                          else
+                              weight += weights.at(s);
+                      }
+                      return weight;
+                  };
+
+                  return calcWeight(a) < calcWeight(b);
+              });
+
             auto current_stage = flows.front().stages.at(u.completed.size());
 
             if (current_stage == mtx::user_interactive::auth_types::password) {
-- 
GitLab