This source file includes following definitions.
- getcbfunc
- PMIx_Get_credential
- valid_cbfunc
- PMIx_Validate_credential
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 #include <src/include/pmix_config.h>
  16 
  17 #include <src/include/pmix_stdint.h>
  18 #include <src/include/pmix_socket_errno.h>
  19 
  20 #include <pmix.h>
  21 #include <pmix_common.h>
  22 #include <pmix_server.h>
  23 #include <pmix_rename.h>
  24 
  25 #include "src/threads/threads.h"
  26 #include "src/util/argv.h"
  27 #include "src/util/error.h"
  28 #include "src/util/output.h"
  29 #include "src/mca/bfrops/bfrops.h"
  30 #include "src/mca/psec/psec.h"
  31 #include "src/mca/ptl/ptl.h"
  32 
  33 #include "src/client/pmix_client_ops.h"
  34 #include "src/server/pmix_server_ops.h"
  35 #include "src/include/pmix_globals.h"
  36 
  37 static void getcbfunc(struct pmix_peer_t *peer,
  38                       pmix_ptl_hdr_t *hdr,
  39                       pmix_buffer_t *buf, void *cbdata)
  40 {
  41     pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
  42     pmix_status_t rc, status;
  43     int cnt;
  44     pmix_byte_object_t cred;
  45     pmix_info_t *info = NULL;
  46     size_t ninfo = 0;
  47 
  48     pmix_output_verbose(2, pmix_globals.debug_output,
  49                         "pmix:security cback from server with %d bytes",
  50                         (int)buf->bytes_used);
  51 
  52     
  53 
  54     if (PMIX_BUFFER_IS_EMPTY(buf)) {
  55         
  56         if (NULL != cd->credcbfunc) {
  57             cd->credcbfunc(PMIX_ERR_COMM_FAILURE, NULL, NULL, 0, cd->cbdata);
  58         }
  59         PMIX_RELEASE(cd);
  60         return;
  61     }
  62 
  63     
  64     cnt = 1;
  65     PMIX_BFROPS_UNPACK(rc, peer, buf, &status, &cnt, PMIX_STATUS);
  66     if (PMIX_SUCCESS != rc) {
  67         PMIX_ERROR_LOG(rc);
  68         goto complete;
  69     }
  70     if (PMIX_SUCCESS != status) {
  71         goto complete;
  72     }
  73 
  74     
  75     cnt = 1;
  76     PMIX_BFROPS_UNPACK(rc, peer, buf, &cred, &cnt, PMIX_BYTE_OBJECT);
  77     if (PMIX_SUCCESS != rc) {
  78         PMIX_ERROR_LOG(rc);
  79         goto complete;
  80     }
  81 
  82     
  83     cnt = 1;
  84     PMIX_BFROPS_UNPACK(rc, peer, buf, &ninfo, &cnt, PMIX_SIZE);
  85     if (PMIX_SUCCESS != rc) {
  86         PMIX_ERROR_LOG(rc);
  87         goto complete;
  88     }
  89     if (0 < ninfo) {
  90         PMIX_INFO_CREATE(info, ninfo);
  91         cnt = ninfo;
  92         PMIX_BFROPS_UNPACK(rc, peer, buf, info, &cnt, PMIX_INFO);
  93         if (PMIX_SUCCESS != rc) {
  94             PMIX_ERROR_LOG(rc);
  95             goto complete;
  96         }
  97     }
  98 
  99   complete:
 100     pmix_output_verbose(2, pmix_globals.debug_output,
 101                         "pmix:security cback from server releasing");
 102     
 103     if (NULL != cd->credcbfunc) {
 104         cd->credcbfunc(status, &cred, info, ninfo, cd->cbdata);
 105     }
 106     PMIX_BYTE_OBJECT_DESTRUCT(&cred);
 107     if (NULL != info) {
 108         PMIX_INFO_FREE(info, ninfo);
 109     }
 110     PMIX_RELEASE(cd);
 111 }
 112 
 113 PMIX_EXPORT pmix_status_t PMIx_Get_credential(const pmix_info_t info[], size_t ninfo,
 114                                               pmix_credential_cbfunc_t cbfunc, void *cbdata)
 115 {
 116     pmix_buffer_t *msg;
 117     pmix_cmd_t cmd = PMIX_GET_CREDENTIAL_CMD;
 118     pmix_status_t rc;
 119     pmix_query_caddy_t *cb;
 120     pmix_byte_object_t cred;
 121     pmix_info_t *results = NULL;
 122     size_t nresults = 0;
 123 
 124     PMIX_ACQUIRE_THREAD(&pmix_global_lock);
 125 
 126     pmix_output_verbose(2, pmix_globals.debug_output,
 127                         "pmix: Get_credential called with %d info", (int)ninfo);
 128 
 129     if (pmix_globals.init_cntr <= 0) {
 130         PMIX_RELEASE_THREAD(&pmix_global_lock);
 131         return PMIX_ERR_INIT;
 132     }
 133 
 134     
 135     if (PMIX_PROC_IS_SERVER(pmix_globals.mypeer) &&
 136         !PMIX_PROC_IS_LAUNCHER(pmix_globals.mypeer)) {
 137         PMIX_RELEASE_THREAD(&pmix_global_lock);
 138         
 139 
 140         if (NULL == pmix_host_server.get_credential) {
 141             PMIX_BYTE_OBJECT_CONSTRUCT(&cred);
 142             PMIX_PSEC_CREATE_CRED(rc, pmix_globals.mypeer, info, ninfo,
 143                                   &results, &nresults, &cred);
 144             if (PMIX_SUCCESS == rc) {
 145                 
 146                 if (NULL != cbfunc) {
 147                     cbfunc(PMIX_SUCCESS, &cred, results, nresults, cbdata);
 148                     if (NULL != results) {
 149                         PMIX_INFO_FREE(results, nresults);
 150                     }
 151                     PMIX_BYTE_OBJECT_DESTRUCT(&cred);
 152                 }
 153             }
 154             return rc;
 155         }
 156         
 157         pmix_output_verbose(2, pmix_globals.debug_output,
 158                             "pmix:get_credential handed to RM");
 159         rc = pmix_host_server.get_credential(&pmix_globals.myid,
 160                                              info, ninfo,
 161                                              cbfunc, cbdata);
 162         return rc;
 163     }
 164 
 165     
 166 
 167     if (!pmix_globals.connected) {
 168         PMIX_RELEASE_THREAD(&pmix_global_lock);
 169         PMIX_BYTE_OBJECT_CONSTRUCT(&cred);
 170         PMIX_PSEC_CREATE_CRED(rc, pmix_globals.mypeer, info, ninfo,
 171                               &results, &nresults, &cred);
 172         if (PMIX_SUCCESS == rc) {
 173             
 174             if (NULL != cbfunc) {
 175                 cbfunc(PMIX_SUCCESS, &cred, results, nresults, cbdata);
 176                 if (NULL != results) {
 177                     PMIX_INFO_FREE(results, nresults);
 178                 }
 179                 PMIX_BYTE_OBJECT_DESTRUCT(&cred);
 180             }
 181         }
 182         return rc;
 183     }
 184     PMIX_RELEASE_THREAD(&pmix_global_lock);
 185 
 186     
 187     msg = PMIX_NEW(pmix_buffer_t);
 188     
 189     PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 190                      msg, &cmd, 1, PMIX_COMMAND);
 191     if (PMIX_SUCCESS != rc) {
 192         PMIX_ERROR_LOG(rc);
 193         PMIX_RELEASE(msg);
 194         return rc;
 195     }
 196 
 197     
 198     PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 199                      msg, &ninfo, 1, PMIX_SIZE);
 200     if (PMIX_SUCCESS != rc) {
 201         PMIX_ERROR_LOG(rc);
 202         PMIX_RELEASE(msg);
 203         return rc;
 204     }
 205     if (0 < ninfo) {
 206         PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 207                          msg, info, ninfo, PMIX_INFO);
 208         if (PMIX_SUCCESS != rc) {
 209             PMIX_ERROR_LOG(rc);
 210             PMIX_RELEASE(msg);
 211             return rc;
 212         }
 213     }
 214 
 215     
 216 
 217 
 218     cb = PMIX_NEW(pmix_query_caddy_t);
 219     cb->credcbfunc = cbfunc;
 220     cb->cbdata = cbdata;
 221 
 222     
 223     PMIX_PTL_SEND_RECV(rc, pmix_client_globals.myserver,
 224                        msg, getcbfunc, (void*)cb);
 225     if (PMIX_SUCCESS != rc) {
 226         PMIX_RELEASE(msg);
 227         PMIX_RELEASE(cb);
 228     }
 229 
 230     return rc;
 231 }
 232 
 233 static void valid_cbfunc(struct pmix_peer_t *peer,
 234                          pmix_ptl_hdr_t *hdr,
 235                          pmix_buffer_t *buf, void *cbdata)
 236 {
 237     pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
 238     pmix_status_t rc, status;
 239     int cnt;
 240     pmix_info_t *info = NULL;
 241     size_t ninfo = 0;
 242 
 243     pmix_output_verbose(2, pmix_globals.debug_output,
 244                         "pmix:security cback from server with %d bytes",
 245                         (int)buf->bytes_used);
 246 
 247     
 248 
 249     if (PMIX_BUFFER_IS_EMPTY(buf)) {
 250         
 251         if (NULL != cd->validcbfunc) {
 252             cd->validcbfunc(PMIX_ERR_COMM_FAILURE, NULL, 0, cd->cbdata);
 253         }
 254         PMIX_RELEASE(cd);
 255         return;
 256     }
 257 
 258     
 259     cnt = 1;
 260     PMIX_BFROPS_UNPACK(rc, peer, buf, &status, &cnt, PMIX_STATUS);
 261     if (PMIX_SUCCESS != rc) {
 262         PMIX_ERROR_LOG(rc);
 263         goto complete;
 264     }
 265     if (PMIX_SUCCESS != status) {
 266         goto complete;
 267     }
 268 
 269     
 270     cnt = 1;
 271     PMIX_BFROPS_UNPACK(rc, peer, buf, &ninfo, &cnt, PMIX_SIZE);
 272     if (PMIX_SUCCESS != rc) {
 273         PMIX_ERROR_LOG(rc);
 274         goto complete;
 275     }
 276     if (0 < ninfo) {
 277         PMIX_INFO_CREATE(info, ninfo);
 278         cnt = ninfo;
 279         PMIX_BFROPS_UNPACK(rc, peer, buf, info, &cnt, PMIX_INFO);
 280         if (PMIX_SUCCESS != rc) {
 281             PMIX_ERROR_LOG(rc);
 282             goto complete;
 283         }
 284     }
 285 
 286   complete:
 287     pmix_output_verbose(2, pmix_globals.debug_output,
 288                         "pmix:security cback from server releasing");
 289     
 290     if (NULL != cd->validcbfunc) {
 291         cd->validcbfunc(status, info, ninfo, cd->cbdata);
 292     }
 293     if (NULL != info) {
 294         PMIX_INFO_FREE(info, ninfo);
 295     }
 296     PMIX_RELEASE(cd);
 297 }
 298 
 299 PMIX_EXPORT pmix_status_t PMIx_Validate_credential(const pmix_byte_object_t *cred,
 300                                                    const pmix_info_t directives[], size_t ndirs,
 301                                                    pmix_validation_cbfunc_t cbfunc, void *cbdata)
 302 {
 303     pmix_buffer_t *msg;
 304     pmix_cmd_t cmd = PMIX_VALIDATE_CRED_CMD;
 305     pmix_status_t rc;
 306     pmix_query_caddy_t *cb;
 307     pmix_info_t *results = NULL;
 308     size_t nresults = 0;
 309 
 310     PMIX_ACQUIRE_THREAD(&pmix_global_lock);
 311 
 312     pmix_output_verbose(2, pmix_globals.debug_output,
 313                         "pmix: monitor called");
 314 
 315     if (pmix_globals.init_cntr <= 0) {
 316         PMIX_RELEASE_THREAD(&pmix_global_lock);
 317         return PMIX_ERR_INIT;
 318     }
 319 
 320     
 321     if (PMIX_PROC_IS_SERVER(pmix_globals.mypeer) &&
 322         !PMIX_PROC_IS_LAUNCHER(pmix_globals.mypeer)) {
 323         PMIX_RELEASE_THREAD(&pmix_global_lock);
 324         
 325 
 326         if (NULL == pmix_host_server.validate_credential) {
 327             PMIX_PSEC_VALIDATE_CRED(rc, pmix_globals.mypeer,
 328                                     directives, ndirs,
 329                                     &results, &nresults, cred);
 330             if (PMIX_SUCCESS == rc) {
 331                 
 332                 if (NULL != cbfunc) {
 333                     cbfunc(PMIX_SUCCESS, results, nresults, cbdata);
 334                     if (NULL != results) {
 335                         PMIX_INFO_FREE(results, nresults);
 336                     }
 337                 }
 338             }
 339             return rc;
 340         }
 341         
 342         pmix_output_verbose(2, pmix_globals.debug_output,
 343                             "pmix:get_credential handed to RM");
 344         rc = pmix_host_server.validate_credential(&pmix_globals.myid, cred,
 345                                                   directives, ndirs, cbfunc, cbdata);
 346         return rc;
 347     }
 348 
 349     
 350 
 351     if (!pmix_globals.connected) {
 352         PMIX_RELEASE_THREAD(&pmix_global_lock);
 353         PMIX_PSEC_VALIDATE_CRED(rc, pmix_globals.mypeer,
 354                                 directives, ndirs,
 355                                 &results, &nresults, cred);
 356         if (PMIX_SUCCESS == rc) {
 357             
 358             if (NULL != cbfunc) {
 359                 cbfunc(PMIX_SUCCESS, results, nresults, cbdata);
 360                 if (NULL != results) {
 361                     PMIX_INFO_FREE(results, nresults);
 362                 }
 363             }
 364         }
 365         return rc;
 366     }
 367     PMIX_RELEASE_THREAD(&pmix_global_lock);
 368 
 369     
 370     msg = PMIX_NEW(pmix_buffer_t);
 371     
 372     PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 373                      msg, &cmd, 1, PMIX_COMMAND);
 374     if (PMIX_SUCCESS != rc) {
 375         PMIX_ERROR_LOG(rc);
 376         PMIX_RELEASE(msg);
 377         return rc;
 378     }
 379 
 380     
 381     PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 382                      msg, cred, 1, PMIX_BYTE_OBJECT);
 383     if (PMIX_SUCCESS != rc) {
 384         PMIX_ERROR_LOG(rc);
 385         PMIX_RELEASE(msg);
 386         return rc;
 387     }
 388 
 389     
 390     PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 391                      msg, &ndirs, 1, PMIX_SIZE);
 392     if (PMIX_SUCCESS != rc) {
 393         PMIX_ERROR_LOG(rc);
 394         PMIX_RELEASE(msg);
 395         return rc;
 396     }
 397     if (0 < ndirs) {
 398         PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
 399                          msg, directives, ndirs, PMIX_INFO);
 400         if (PMIX_SUCCESS != rc) {
 401             PMIX_ERROR_LOG(rc);
 402             PMIX_RELEASE(msg);
 403             return rc;
 404         }
 405     }
 406 
 407     
 408 
 409 
 410     cb = PMIX_NEW(pmix_query_caddy_t);
 411     cb->validcbfunc = cbfunc;
 412     cb->cbdata = cbdata;
 413 
 414     
 415     PMIX_PTL_SEND_RECV(rc, pmix_client_globals.myserver,
 416                        msg, valid_cbfunc, (void*)cb);
 417     if (PMIX_SUCCESS != rc) {
 418         PMIX_RELEASE(msg);
 419         PMIX_RELEASE(cb);
 420     }
 421 
 422     return rc;
 423 }