2323#define  MYSQL_DEFAULT_KEYRINGFILE  MYSQL_KEYRINGDIR" /keyring" 
2424#endif 
2525
26- static  int  check_keyring_file_data (MYSQL_THD thd  __attribute__ ((unused)),
27-                     struct st_mysql_sys_var *var  __attribute__((unused)),
28-                     void *save, st_mysql_value *value)
26+ my_bool create_keyring_dir_if_does_not_exist (const  char  *keyring_file_path)
2927{
30-   Buffered_file_io keyring_io (logger.get ());
28+   if  (!keyring_file_path || strlen (keyring_file_path) == 0 )
29+     return  TRUE ;
30+   char  keyring_dir[FN_REFLEN];
31+   size_t  keyring_dir_length;
32+   dirname_part (keyring_dir, keyring_file_path, &keyring_dir_length);
33+   if  (keyring_dir_length > 1  && (keyring_dir[keyring_dir_length-1 ] == FN_LIBCHAR ||
34+                                  keyring_dir[keyring_dir_length-1 ] == FN_LIBCHAR2) )
35+   {
36+     keyring_dir[keyring_dir_length-1 ]= ' \0 '  ;
37+     --keyring_dir_length;
38+   }
39+   int  flags=
40+ #ifdef  _WIN32
41+     0 
42+ #else 
43+     S_IRWXU | S_IRGRP | S_IXGRP
44+ #endif 
45+     ;
46+   if  (strlen (keyring_dir) == 0 )
47+     return  TRUE ;
48+   my_mkdir (keyring_dir, flags, MYF (0 ));
49+   return  FALSE ;
50+ }
3151
52+ int  check_keyring_file_data (MYSQL_THD thd  __attribute__ ((unused)),
53+                             struct st_mysql_sys_var *var  __attribute__((unused)),
54+                             void *save, st_mysql_value *value)
55+ {
56+   char             buff[FN_REFLEN+1 ];
57+   const  char       *keyring_filename;
58+   int              len = sizeof (buff);
59+   Buffered_file_io keyring_io (logger.get ());
3260  boost::movelib::unique_ptr<IKeys_container> new_keys (new  Keys_container (logger.get ()));
33-   return  check_keyring_file_data (&keyring_io, ::boost::move (new_keys), thd, var, save, value);
61+ 
62+   (*(const  char  **) save)= NULL ;
63+   keyring_filename= value->val_str (value, buff, &len);
64+   mysql_rwlock_wrlock (&LOCK_keyring);
65+   if  (create_keyring_dir_if_does_not_exist (keyring_filename))
66+   {
67+     mysql_rwlock_unlock (&LOCK_keyring);
68+     logger->log (MY_ERROR_LEVEL, " keyring_file_data cannot be set to new value" 
69+       "  as the keyring file cannot be created/accessed in the provided path"  );
70+     return  1 ;
71+   }
72+   try 
73+   {
74+     if  (new_keys->init (&keyring_io, keyring_filename))
75+     {
76+       mysql_rwlock_unlock (&LOCK_keyring);
77+       return  1 ;
78+     }
79+     *reinterpret_cast <IKeys_container **>(save)= new_keys.get ();
80+     new_keys.release ();
81+     mysql_rwlock_unlock (&LOCK_keyring);
82+   }
83+   catch  (...)
84+   {
85+     mysql_rwlock_unlock (&LOCK_keyring);
86+     return  1 ;
87+   }
88+   return (0 );
3489}
3590
3691static  char  *keyring_file_data_value= NULL ;
@@ -44,7 +99,7 @@ static MYSQL_SYSVAR_STR(
4499  MYSQL_DEFAULT_KEYRINGFILE                                    /*  default    */ 
45100);
46101
47- static  struct  st_mysql_sys_var  *keyring_system_variables []= {
102+ static  struct  st_mysql_sys_var  *keyring_file_system_variables []= {
48103  MYSQL_SYSVAR (data),
49104  NULL 
50105};
@@ -85,55 +140,69 @@ static int keyring_init(MYSQL_PLUGIN plugin_info)
85140  }
86141  catch  (...)
87142  {
143+     if  (logger != NULL )
144+       logger->log (MY_ERROR_LEVEL, " keyring_file initialization failure due to internal" 
145+                                   "  exception inside the plugin"  );
88146    return  TRUE ;
89147  }
90148}
91149
150+ int  keyring_deinit (void  *arg __attribute__ ((unused)))
151+ {
152+   // not taking a lock here as the calls to keyring_deinit are serialized by
153+   // the plugin framework
154+   keys.reset ();
155+   logger.reset ();
156+   keyring_file_data.reset ();
157+   mysql_rwlock_destroy (&LOCK_keyring);
158+   return  0 ;
159+ }
160+ 
161+ my_bool mysql_key_fetch (const  char  *key_id, char  **key_type, const  char  *user_id,
162+                         void  **key, size_t  *key_len)
163+ {
164+   return  mysql_key_fetch<Buffered_file_io, Key>(key_id, key_type, user_id, key,
165+                                                 key_len);
166+ }
167+ 
92168my_bool mysql_key_store (const  char  *key_id, const  char  *key_type,
93169                        const  char  *user_id, const  void  *key, size_t  key_len)
94170{
95-   try 
96-   {
97-     Buffered_file_io keyring_io (logger.get ());
98-     return  mysql_key_store (&keyring_io, key_id, key_type, user_id, key,
99-                            key_len);
100-   }
101-   catch  (...)
102-   {
103-     return  TRUE ;
104-   }
171+   return  mysql_key_store<Buffered_file_io, Key>(key_id, key_type, user_id, key,
172+                                                 key_len);
105173}
106174
107175my_bool mysql_key_remove (const  char  *key_id, const  char  *user_id)
108176{
109-   try 
110-   {
111-     Buffered_file_io keyring_io (logger.get ());
112-     return  mysql_key_remove (&keyring_io, key_id, user_id);
113-   }
114-   catch  (...)
115-   {
116-     return  TRUE ;
117-   }
177+   return  mysql_key_remove<Buffered_file_io, Key>(key_id, user_id);
118178}
119179
180+ 
120181my_bool mysql_key_generate (const  char  *key_id, const  char  *key_type,
121182                           const  char  *user_id, size_t  key_len)
122183{
123184  try 
124185  {
125186    Buffered_file_io keyring_io (logger.get ());
126-     return  mysql_key_generate (&keyring_io, key_id, key_type, user_id, key_len);
187+     boost::movelib::unique_ptr<IKey> key_candidate (new  Key (key_id, key_type, user_id, NULL , 0 ));
188+ 
189+     boost::movelib::unique_ptr<uchar[]> key (new  uchar[key_len]);
190+     if  (is_keys_container_initialized == FALSE  || check_key_for_writting (key_candidate.get (), " generating"  ) ||
191+         my_rand_buffer (key.get (), key_len))
192+       return  TRUE ;
193+ 
194+     return  mysql_key_store (key_id, key_type, user_id, key.get (), key_len) == TRUE ;
127195  }
128196  catch  (...)
129197  {
198+     if  (logger != NULL )
199+       logger->log (MY_ERROR_LEVEL, " Failed to generate a key due to internal exception inside keyring_file plugin"  );
130200    return  TRUE ;
131201  }
132- 
133202}
134203
135204/*  Plugin type-specific descriptor */ 
136- static  struct  st_mysql_keyring_file  keyring_descriptor=
205+ static  struct  st_mysql_keyring  keyring_descriptor=
137206{
138207  MYSQL_KEYRING_INTERFACE_VERSION,
139208  mysql_key_store,
@@ -154,7 +223,7 @@ mysql_declare_plugin(keyring_file)
154223  keyring_deinit,                                         /*    deinit function (when unloaded) */ 
155224  0x0100 ,                                                 /*    version                         */ 
156225  NULL ,                                                   /*    status variables                */ 
157-   keyring_system_variables,                                /*    system variables                */ 
226+   keyring_file_system_variables,                           /*    system variables                */ 
158227  NULL ,
159228  0 ,
160229}
0 commit comments