From 8cf48d0becfb517d157d4b6e7f8935175d8b1616 Mon Sep 17 00:00:00 2001
From: Rafael Monnerat <rafael@nexedi.com>
Date: Tue, 6 Mar 2018 03:16:19 +0000
Subject: [PATCH] erp5_oauth_facebook_login: Search Login avoiding
 security_uids

This makes exponentially faster, if you have way too many security uids.
---
 .../extension.erp5.FacebookLoginUtility.py    | 10 +++++++
 .../ERP5Site_getFacebookLogin.xml             | 28 +++++++++++++++++++
 .../ERP5Site_getPersonFromFacebookLogin.py    | 14 +++++-----
 3 files changed, 45 insertions(+), 7 deletions(-)
 create mode 100644 bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getFacebookLogin.xml

diff --git a/bt5/erp5_oauth_facebook_login/ExtensionTemplateItem/portal_components/extension.erp5.FacebookLoginUtility.py b/bt5/erp5_oauth_facebook_login/ExtensionTemplateItem/portal_components/extension.erp5.FacebookLoginUtility.py
index f3c711a853..165273cd31 100644
--- a/bt5/erp5_oauth_facebook_login/ExtensionTemplateItem/portal_components/extension.erp5.FacebookLoginUtility.py
+++ b/bt5/erp5_oauth_facebook_login/ExtensionTemplateItem/portal_components/extension.erp5.FacebookLoginUtility.py
@@ -2,6 +2,7 @@ import facebook
 from ZTUtils import make_query
 
 from Products.ERP5Security.ERP5ExternalOauth2ExtractionPlugin import getFacebookUserEntry
+from zExceptions import Unauthorized
 
 def _getFacebookClientIdAndSecretKey(portal, reference="default"):
   """Returns facebook client id and secret key.
@@ -44,5 +45,14 @@ def unrestrictedSearchFacebookConnector(self):
             validation_state="validated",
             limit=2)
 
+def unrestrictedSearchFacebookLogin(self, login, REQUEST=None):
+  if REQUEST is not None:
+    raise Unauthorized
+
+  return self.getPortalObject().portal_catalog.unrestrictedSearchResults(
+    portal_type="Facebook Login",
+    reference=login,
+    validation_state="validated", limit=1)
+
 def getUserEntry(token):
   return getFacebookUserEntry(token)
diff --git a/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getFacebookLogin.xml b/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getFacebookLogin.xml
new file mode 100644
index 0000000000..ea0d8cf8ac
--- /dev/null
+++ b/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getFacebookLogin.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_function</string> </key>
+            <value> <string>unrestrictedSearchFacebookLogin</string> </value>
+        </item>
+        <item>
+            <key> <string>_module</string> </key>
+            <value> <string>FacebookLoginUtility</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>ERP5Site_getFacebookLogin</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getPersonFromFacebookLogin.py b/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getPersonFromFacebookLogin.py
index 9377113f98..8d8132b800 100644
--- a/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getPersonFromFacebookLogin.py
+++ b/bt5/erp5_oauth_facebook_login/SkinTemplateItem/portal_skins/erp5_oauth_facebook_login/ERP5Site_getPersonFromFacebookLogin.py
@@ -3,12 +3,12 @@ from zExceptions import Unauthorized
 if REQUEST is not None:
   raise Unauthorized
 
-portal_catalog = context.getPortalObject().portal_catalog
+login = context.ERP5Site_getFacebookLogin(login)
 
-login = portal_catalog.getResultValue(
-  portal_type="Facebook Login",
-  reference=login,
-  validation_state="validated")
+if login is None:
+  return login
 
-if login is not None:
-  return login.getParentValue().getRelativeUrl()
+if len(login) > 1:
+  raise ValueError("Duplicated User")
+
+return login[0].getParentValue().getRelativeUrl()
-- 
2.30.9