Beispiel #1
0
/**
@fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail)
@brief Sets SOAP Fault (sub)code for server response.
@param soap context
@param[in] fault is one of wsse:FaultcodeEnum
@param[in] detail string with optional text message
@return SOAP_FAULT
*/
int
soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail)
{ const char *code = soap_wsse__FaultcodeEnum2s(soap, fault);
  DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:"");
  /* remove incorrect or incomplete Security header */
  soap_wsse_delete_Security(soap);
  /* populate the SOAP Fault as per WS-Security spec */
  /* detail = NULL; */ /* uncomment when detail text not recommended */
  /* use WSA to populate the SOAP Header when WSA is used */
  switch (fault)
  { case wsse__UnsupportedSecurityToken:
      return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail);
    case wsse__UnsupportedAlgorithm:
      return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail);
    case wsse__InvalidSecurity:
      return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the <wsse:Security> header", detail);
    case wsse__InvalidSecurityToken:
      return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail);
    case wsse__FailedAuthentication:
      return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail);
    case wsse__FailedCheck:
      return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail);
    case wsse__SecurityTokenUnavailable:
      return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail);
  }
  return SOAP_FAULT;
}
SOAP_FMAC5 int SOAP_FMAC6 soap_wsa_fault_subcode_action(struct soap *soap,
		int flag, const char *faultsubcode, const char *faultstring,
		const char *faultdetail, const char *action) {
	struct soap_wsa_data *data = (struct soap_wsa_data*) soap_lookup_plugin(
			soap, soap_wsa_id);
	struct SOAP_ENV__Header *oldheader, *newheader;
	DBGFUN2("soap_wsa_fault_subcode", "faultsubcode=%s",
			faultsubcode ? faultsubcode : "(null)", "faultstring=%s",
			faultstring ? faultstring : "(null)");
	if (!data)
		return soap->error = SOAP_PLUGIN_ERROR;
	oldheader = soap->header;
	/* no FaultTo: use ReplyTo */
	if (oldheader && oldheader->SOAP_WSA(ReplyTo)
			&& (!oldheader->SOAP_WSA(FaultTo)
					|| soap_tagsearch(soap_wsa_allAnonymousURI,
							oldheader->SOAP_WSA(FaultTo)->Address))) {
		if (!oldheader->SOAP_WSA(FaultTo)) {
			oldheader->SOAP_WSA(FaultTo) = (SOAP_WSA_(,FaultTo)*) my_soap_malloc(
					soap, sizeof(SOAP_WSA_(,FaultTo)));
			SOAP_WSA_(soap_default,EndpointReferenceType)(soap,
					soap->header->SOAP_WSA(FaultTo));
		}
		oldheader->SOAP_WSA(FaultTo)->Address =
				oldheader->SOAP_WSA(ReplyTo)->Address;
	}
SOAP_FMAC5 int SOAP_FMAC6 soap_wsa_response(struct soap *soap, int status,
		size_t count) {
	struct soap_wsa_data *data = (struct soap_wsa_data*) soap_lookup_plugin(
			soap, soap_wsa_id);
	DBGFUN2("soap_wsa_response", "status=%d", status, "count=%lu",
			(unsigned long) count);
	if (!data)
		return SOAP_PLUGIN_ERROR;
	soap->fresponse = data->fresponse; /* reset (HTTP response) */
	return soap->fpost(soap, soap_strdup(soap, soap->endpoint), soap->host,
			soap->port, soap->path, soap->action, count);
}
Beispiel #4
0
/**
@fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password)
@brief Adds UsernameToken element with optional clear-text password.
@param soap context
@param[in] id string for signature referencing or NULL
@param[in] username string
@param[in] password string or NULL to omit the password
@return SOAP_OK

Passwords are sent in the clear, so transport-level encryption is required.

@note
This release supports the use of at most one UsernameToken in the header.
*/
int
soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password)
{ _wsse__Security *security = soap_wsse_add_Security(soap);
  DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:"");
  /* allocate a UsernameToken if we don't have one already */
  if (!security->UsernameToken)
  { if (!(security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken))))
      return soap->error = SOAP_EOM;
  }
  soap_default__wsse__UsernameToken(soap, security->UsernameToken);
  /* populate the UsernameToken */
  security->UsernameToken->wsu__Id = soap_strdup(soap, id);
  security->UsernameToken->Username = soap_strdup(soap, username);
  /* allocate and populate the Password */
  if (password)
  { if (!(security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password))))
      return soap->error = SOAP_EOM;
    soap_default__wsse__Password(soap, security->UsernameToken->Password);
    security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI;
    security->UsernameToken->Password->__item = soap_strdup(soap, password);
  }
  return SOAP_OK;
}