/* Called by: */ size_t zxid_curl_write_data(void *buffer, size_t size, size_t nmemb, void *userp) { int len = size * nmemb; #if 1 struct zxid_curl_ctx* rc = (struct zxid_curl_ctx*)userp; int old_len, new_len, in_buf = rc->p - rc->buf; if (rc->p + len > rc->lim) { old_len = rc->lim-rc->buf; new_len = MIN(MAX(old_len + old_len, in_buf + len), ZXID_MAX_CURL_BUF); if (new_len == ZXID_MAX_CURL_BUF) { ERR("Too large HTTP response. Response length at least %d. Maximum allowed length (ZXID_MAX_CURL_BUF): %d", in_buf + len, ZXID_MAX_CURL_BUF); return -1; /* Signal error */ } D("Reallocating curl buffer from %d to %d in_buf=%d len=%d", old_len, new_len, in_buf, len); REALLOCN(rc->buf, new_len+1); rc->p = rc->buf + in_buf; rc->lim = rc->buf + new_len; } memcpy(rc->p, buffer, len); rc->p += len; if (errmac_debug & CURL_INOUT) { INFO("RECV(%.*s) %d chars", len, (char*)buffer, len); D_XML_BLOB(0, "RECV", len, (char*)buffer); } #else int fd = (int)userp; write_all_fd(fd, buffer, len); #endif return len; }
/* Called by: */ int zxumacall_main(int argc, char** argv, char** env) { int siz, got, n; char* p; struct zx_str* ss; zxid_ses* ses; zxid_entity* idp_meta; zxid_epr* epr; strncpy(errmac_instance, CC_CYNY("\tzxuma"), sizeof(errmac_instance)); cf = zxid_new_conf_to_cf(0); opt(&argc, &argv, &env); if (dynclireg) { zxumacall_dynclireg_client(cf); return 0; } if (rsrc_name) { if (!client_secret) zxumacall_dynclireg_client(cf); zxumacall_rsrcreg_client(cf); return 0; } if (sid) { D("Existing session sesid(%s)", sid); ses = zxid_fetch_ses(cf, sid); if (!ses) { ERR("Session not found or error in session sesid(%s)", sid); return 1; } } else { D("Obtain session from authentication service(%s)", idp); idp_meta = zxid_get_ent(cf, idp); if (!idp_meta) { ERR("IdP metadata not found and could not be fetched. idp(%s)", idp); return 1; } for (p = user; !ONE_OF_2(*p, ':', 0); ++p) ; if (*p) *p++ = 0; ses = zxid_as_call(cf, idp_meta, user, p); if (!ses) { ERR("Login using Authentication Service failed idp(%s)", idp); return 1; } INFO("Logged in. NameID(%s) Session in %s" ZXID_SES_DIR "%s", ses->nid, cf->cpath, ses->sid); } if (listses) return zxid_print_session(cf, ses); if (im_to) { D("ID-WSF Map to identity at eid(%s)", im_to); zxid_map_identity_token(cf, ses, im_to, 0); //printf("%.*s\n", ZX_GET_CONTENT_LEN(nameid), ZX_GET_CONTENT_S(nameid)); return 0; } if (nidmap_to) { D("SAML Map to identity at eid(%s)", nidmap_to); zxid_nidmap_identity_token(cf, ses, nidmap_to, 0); //printf("%.*s\n", ZX_GET_CONTENT_LEN(nameid), ZX_GET_CONTENT_S(nameid)); return 0; } if (di_only) { D("Discover only. svctype(%s), dindex=%d", STRNULLCHK(svc), din); epr = zxid_get_epr(cf, ses, svc, url, di, 0 /*action*/, din); if (!epr) { ERR("Discovery failed to find any epr of service type(%s)", STRNULLCHK(svc)); return 3; } for (din = 1; ;++din) { epr = zxid_get_epr(cf, ses, svc, url, di, 0 /*action*/, din); if (!epr) break; printf("%d. Found epr for service type(%s)\n", din, STRNULLCHK(svc)); ss = zxid_get_epr_desc(cf, epr); printf(" Description: %.*s\n", ss?ss->len:0, ss?ss->s:""); ss = zxid_get_epr_address(cf, epr); printf(" EPURL: %.*s\n", ss?ss->len:0, ss?ss->s:""); ss = zxid_get_epr_entid(cf, epr); printf(" EntityID: %.*s\n", ss?ss->len:0, ss?ss->s:""); } return 0; } if (svc) { D("Call service svctype(%s)", svc); if (!bdy) { if (verbose) fprintf(stderr, "Reading SOAP request body from stdin...\n"); siz = 4096; p = bdy = ZX_ALLOC(cf->ctx, siz); while (1) { n = read_all_fd(fdstdin, p, siz+bdy-p-1, &got); if (n == -1) { perror("reading SOAP req from stdin"); break; } p += got; if (got < siz+bdy-p-1) break; siz += 60*1024; REALLOCN(bdy, siz); } *p = 0; } if (dryrun) { if (verbose) fprintf(stderr, "Dryrun. Call aborted.\n"); return 0; } if (verbose) fprintf(stderr, "Calling...\n"); ss = zxid_call(cf, ses, svc, url, di, az, bdy); if (!ss || !ss->s) { ERR("Call failed %p", ss); return 2; } if (verbose) fprintf(stderr, "Done. Call returned %d bytes.\n", ss->len); if (out_fmt) { p = zxid_extract_body(cf, ss->s); printf("%s", p); } else printf("%.*s", ss->len, ss->s); } else if (az) { D("Call Az(%s)", az); if (dryrun) { if (verbose) fprintf(stderr, "Dryrun. zxid_az() aborted.\n"); return 0; } if (zxid_az_cf_ses(cf, az, ses)) { if (verbose) fprintf(stderr, "Permit.\n"); return 0; } else { if (verbose) fprintf(stderr, "Deny.\n"); return 1; } } else { D("Neither service type (-t) nor -az supplied. Performed only authentication. %d",0); if (verbose) fprintf(stderr, "Authentication only.\n"); } return 0; }