We can search group folder with an empty string.

We'll add a  pluggable authentication utility:


  >>> print http(r"""
  ... POST /++etc++site/default/@@contents.html HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 98
  ... Content-Type: application/x-www-form-urlencoded
  ... Referer: http://localhost/++etc++site/default/@@contents.html?type_name=BrowserAdd__zope.pluggableauth.authentication.PluggableAuthentication
  ... 
  ... type_name=BrowserAdd__zope.pluggableauth.authentication.PluggableAuthentication&new_value=PAU""")
  HTTP/1.1 303 See Other
  ...


And register it:

  >>> print http(r"""
  ... POST /++etc++site/default/PAU/addRegistration.html HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 699
  ... Content-Type: multipart/form-data; boundary=---------------------------191720529414243436931796477300
  ... Referer: http://localhost/++etc++site/default/PAU/addRegistration.html
  ... 
  ... -----------------------------191720529414243436931796477300
  ... Content-Disposition: form-data; name="field.comment"
  ... 
  ... 
  ... -----------------------------191720529414243436931796477300
  ... Content-Disposition: form-data; name="field.actions.register"
  ... 
  ... Register
  ... -----------------------------191720529414243436931796477300--
  ... """)
  HTTP/1.1 303 See Other
  ...


Next, we'll add the group folder:

  >>> print http(r"""
  ... POST /++etc++site/default/PAU/+/AddGroupFolder.html%3D HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 427
  ... Content-Type: multipart/form-data; boundary=---------------------------4150524541658557772058105275
  ... Referer: http://localhost/++etc++site/default/PAU/+/AddGroupFolder.html=
  ... 
  ... -----------------------------4150524541658557772058105275
  ... Content-Disposition: form-data; name="field.prefix"
  ... 
  ... groups
  ... -----------------------------4150524541658557772058105275
  ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
  ... 
  ... Add
  ... -----------------------------4150524541658557772058105275
  ... Content-Disposition: form-data; name="add_input_name"
  ... 
  ... groups
  ... -----------------------------4150524541658557772058105275--
  ... """)
  HTTP/1.1 303 See Other
  ...


And add some groups:


  >>> print http(r"""
  ... POST /++etc++site/default/PAU/groups/+/AddGroupInformation.html%3D HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 550
  ... Content-Type: multipart/form-data; boundary=---------------------------12719796373012316301953477158
  ... Referer: http://localhost/++etc++site/default/PAU/groups/+/AddGroupInformation.html=
  ... 
  ... -----------------------------12719796373012316301953477158
  ... Content-Disposition: form-data; name="field.title"
  ... 
  ... Test1
  ... -----------------------------12719796373012316301953477158
  ... Content-Disposition: form-data; name="field.description"
  ... 
  ... 
  ... -----------------------------12719796373012316301953477158
  ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
  ... 
  ... Add
  ... -----------------------------12719796373012316301953477158
  ... Content-Disposition: form-data; name="add_input_name"
  ... 
  ... Test1
  ... -----------------------------12719796373012316301953477158--
  ... """)
  HTTP/1.1 303 See Other
  ...


  >>> print http(r"""
  ... POST /++etc++site/default/PAU/groups/+/AddGroupInformation.html%3D HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 550
  ... Content-Type: multipart/form-data; boundary=---------------------------10816732208483809451400699513
  ... Referer: http://localhost/++etc++site/default/PAU/groups/+/AddGroupInformation.html=
  ... 
  ... -----------------------------10816732208483809451400699513
  ... Content-Disposition: form-data; name="field.title"
  ... 
  ... Test2
  ... -----------------------------10816732208483809451400699513
  ... Content-Disposition: form-data; name="field.description"
  ... 
  ... 
  ... -----------------------------10816732208483809451400699513
  ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
  ... 
  ... Add
  ... -----------------------------10816732208483809451400699513
  ... Content-Disposition: form-data; name="add_input_name"
  ... 
  ... Test2
  ... -----------------------------10816732208483809451400699513--
  ... """)
  HTTP/1.1 303 See Other
  ...


Now we'll configure our pluggable-authentication utility to use the
group folder:


  >>> print http(r"""
  ... POST /++etc++site/default/PAU/@@configure.html HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 1040
  ... Content-Type: multipart/form-data; boundary=---------------------------1786480431902757372789659730
  ... Referer: http://localhost/++etc++site/default/PAU/@@configure.html
  ... 
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.credentialsPlugins.to"
  ... 
  ... U2Vzc2lvbiBDcmVkZW50aWFscw==
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.credentialsPlugins-empty-marker"
  ... 
  ... 
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.authenticatorPlugins.to"
  ... 
  ... Z3JvdXBz
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.authenticatorPlugins-empty-marker"
  ... 
  ... 
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
  ... 
  ... Change
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.credentialsPlugins"
  ... 
  ... U2Vzc2lvbiBDcmVkZW50aWFscw==
  ... -----------------------------1786480431902757372789659730
  ... Content-Disposition: form-data; name="field.authenticatorPlugins"
  ... 
  ... Z3JvdXBz
  ... -----------------------------1786480431902757372789659730--
  ... """)
  HTTP/1.1 200 OK
  ...


Now, if we search for a group, but don't supply a string:

  >>> print http(r"""
  ... POST /@@grant.html HTTP/1.1
  ... Authorization: Basic bWdyOm1ncnB3
  ... Content-Length: 166
  ... Content-Type: application/x-www-form-urlencoded
  ... Referer: http://localhost/@@grant.html
  ... 
  ... field.principal.displayed=y&"""
  ... "field.principal.MC5ncm91cHM_.field.search=&"
  ... "field.principal.MC5ncm91cHM_.search=Search&"
  ... "field.principal.MQ__.searchstring=")
  HTTP/1.1 200 OK
  ...Test1...Test2...

We get both of our groups in the result.
