Author: rhuijben
Date: Sun Feb  8 01:32:07 2015
New Revision: 1658123

URL: http://svn.apache.org/r1658123
Log:
Expose the Gnome keyring unlock prompt to the JavaHL C++ code.
(Exposing it to JavaHL itself is a different step where brane might
 have better ideas)

* subversion/bindings/javahl/native/OperationContext.cpp
  (OperationContext::getAuthBaton):
     Hook gnome prompt if we have a prompter implementation.

* subversion/bindings/javahl/native/Prompter.cpp
  (Prompter::get_gnome_keyring_unlock,
   Prompter::gnome_keyring_unlock_prompt): New function.

* subversion/bindings/javahl/native/Prompter.h
  (Prompter::get_gnome_keyring_unlock,
   Prompter::gnome_keyring_unlock_prompt): New function.

* subversion/libsvn_auth_gnome_keyring/gnome_keyring.c
  (ensure_gnome_keyring_is_unlocked): Allow prompt func to not provide a
    password, similar to our other credential callbacks. This makes it easier
    for bindings to conditionally handle the prompt.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/OperationContext.cpp
    subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
    subversion/trunk/subversion/bindings/javahl/native/Prompter.h
    subversion/trunk/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c

Modified: 
subversion/trunk/subversion/bindings/javahl/native/OperationContext.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/OperationContext.cpp?rev=1658123&r1=1658122&r2=1658123&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/OperationContext.cpp 
(original)
+++ subversion/trunk/subversion/bindings/javahl/native/OperationContext.cpp Sun 
Feb  8 01:32:07 2015
@@ -218,6 +218,27 @@ OperationContext::getAuthBaton(SVN::Pool
   /* Build an authentication baton to give to libsvn_client. */
   svn_auth_open(&ab, providers, pool);
 
+  if (m_prompter.get())
+    {
+      svn_auth_gnome_keyring_unlock_prompt_func_t unlock_cb;
+      void *unlock_baton;
+
+      m_prompter->get_gnome_keyring_unlock(&unlock_cb, &unlock_baton,
+                                         in_pool);
+
+      if (unlock_cb)
+        {
+          svn_auth_set_parameter(
+                         ab,
+                         SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC,
+                         unlock_cb);
+        svn_auth_set_parameter(
+                         ab,
+                         SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC,
+                         unlock_baton);
+      }
+    }
+
   /* Place any default --username or --password credentials into the
    * auth_baton's run-time parameter hash.  ### Same with --no-auth-cache? */
   if (!m_userName.empty())

Modified: subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp?rev=1658123&r1=1658122&r2=1658123&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp Sun Feb  8 
01:32:07 2015
@@ -138,6 +138,16 @@ Prompter::get_provider_client_ssl_passwo
   return provider;
 }
 
+void
+Prompter::get_gnome_keyring_unlock(
+              svn_auth_gnome_keyring_unlock_prompt_func_t *cb,
+              void **baton,
+              SVN::Pool &in_pool)
+{
+  *cb = gnome_keyring_unlock_prompt;
+  *baton = this;
+}
+
 svn_error_t *Prompter::simple_prompt(
     svn_auth_cred_simple_t **cred_p,
     void *baton,
@@ -221,6 +231,18 @@ svn_error_t *Prompter::ssl_client_cert_p
   return err;
 }
 
+svn_error_t *Prompter::gnome_keyring_unlock_prompt(
+    char **keyring_password,
+    const char *keyring_name,
+    void *baton,
+    apr_pool_t *pool)
+{
+  /* ### TODO: Forward to Java */
+
+  *keyring_password = NULL; /* Don't attempt an unlock */
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *Prompter::plaintext_prompt(
     svn_boolean_t *may_save_plaintext,
     const char *realmstring,

Modified: subversion/trunk/subversion/bindings/javahl/native/Prompter.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Prompter.h?rev=1658123&r1=1658122&r2=1658123&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Prompter.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Prompter.h Sun Feb  8 
01:32:07 2015
@@ -60,6 +60,11 @@ public:
   svn_auth_provider_object_t *get_provider_client_ssl(SVN::Pool &in_pool);
   svn_auth_provider_object_t *get_provider_client_ssl_password(SVN::Pool 
&in_pool);
 
+  void get_gnome_keyring_unlock(
+              svn_auth_gnome_keyring_unlock_prompt_func_t *cb,
+              void **baton,
+              SVN::Pool &in_pool);
+
 protected:
   explicit Prompter(::Java::Env env, jobject jprompter);
 
@@ -144,6 +149,12 @@ protected:
       svn_boolean_t may_save,
       apr_pool_t *pool);
 
+  static svn_error_t *gnome_keyring_unlock_prompt(
+      char **keyring_password,
+      const char *keyring_name,
+      void *baton,
+      apr_pool_t *pool);
+
 protected:
   virtual svn_error_t *dispatch_plaintext_prompt(
       ::Java::Env env,

Modified: subversion/trunk/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c?rev=1658123&r1=1658122&r2=1658123&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c 
(original)
+++ subversion/trunk/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c Sun 
Feb  8 01:32:07 2015
@@ -129,19 +129,22 @@ ensure_gnome_keyring_is_unlocked(svn_boo
         svn_hash_gets(parameters,
                       SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON);
 
-      char *keyring_password;
-
       if (unlock_prompt_func && check_keyring_is_locked(default_keyring))
         {
+          char *keyring_password;
+
           SVN_ERR((*unlock_prompt_func)(&keyring_password,
                                         default_keyring,
                                         unlock_prompt_baton,
                                         scratch_pool));
 
           /* If keyring is locked give up and try the next provider. */
-          if (! unlock_gnome_keyring(default_keyring, keyring_password,
-                                     scratch_pool))
-            return SVN_NO_ERROR;
+          if (keyring_password)
+            {
+              if (! unlock_gnome_keyring(default_keyring, keyring_password,
+                                         scratch_pool))
+                return SVN_NO_ERROR;
+            }
         }
     }
   else


Reply via email to