blob: ee67a27661bcc93df0cc072d6ce38e105dfa809b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <trust_rstr.h>
struct trust_rstr{
axis2_char_t *attr_context; /*Context Attribute of RSTR : same as RST context attribute */
axis2_char_t *token_type;
axis2_char_t *request_type;
axiom_node_t *requested_sec_token;
axis2_char_t *applies_to;
axiom_node_t *requested_attached_ref;
axiom_node_t *requested_unattached_ref;
axiom_node_t *requested_proof_token;
trust_entropy_t *entropy;
trust_life_time_t *life_time;
int key_size;
axis2_char_t *wst_ns_uri;
/*Use state whether response is going inside soap header or soap body*/
axis2_bool_t in_header;
};
AXIS2_EXTERN trust_rstr_t * AXIS2_CALL
trust_rstr_create(
const axutil_env_t *env)
{
trust_rstr_t *rstr = NULL;
rstr = (trust_rstr_t*)AXIS2_MALLOC(env->allocator, sizeof(trust_rstr_t));
rstr->token_type = NULL;
rstr->attr_context = NULL;
rstr->request_type = NULL;
rstr->requested_sec_token = NULL;
rstr->applies_to = NULL;
rstr->requested_attached_ref = NULL;
rstr->requested_unattached_ref = NULL;
rstr->requested_proof_token = NULL;
rstr->entropy = NULL;
rstr->life_time = NULL;
rstr->key_size = -1;
rstr->wst_ns_uri = NULL;
return rstr;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_free(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
AXIS2_FREE(env->allocator, rstr);
return AXIS2_SUCCESS;
}
/*Populating RSTR*/
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_populate_rstr(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *rstr_node)
{
axiom_element_t *rstr_ele = NULL;
axutil_qname_t *attr_ctx_qname = NULL;
axis2_char_t *attr_ctx = NULL;
axiom_node_t *requested_security_token_node = NULL;
axiom_element_t *requested_security_token_ele = NULL;
axutil_qname_t *requested_security_token_qname = NULL;
axiom_node_t *proof_token_node = NULL;
axiom_element_t *proof_token_ele = NULL;
axutil_qname_t *proof_token_qname = NULL;
axiom_node_t *attached_reference_node = NULL;
axiom_element_t *attached_reference_ele = NULL;
axutil_qname_t *attached_reference_qname = NULL;
axiom_node_t *unattached_reference_node = NULL;
axiom_element_t *unattached_reference_ele = NULL;
axutil_qname_t *unattached_reference_qname = NULL;
axiom_node_t *token_type_node = NULL;
axiom_element_t *token_type_ele = NULL;
axutil_qname_t *token_type_qname = NULL;
axis2_char_t *token_type = NULL;
axutil_qname_t *applies_to_qname = NULL;
axiom_node_t *appliesto_node = NULL;
axiom_element_t *appliesto_ele = NULL;
axiom_node_t *first_node = NULL;
axiom_element_t *first_ele = NULL;
trust_entropy_t *entropy = NULL;
axiom_node_t *entropy_node = NULL;
axiom_element_t *entropy_ele = NULL;
axutil_qname_t *entropy_qname = NULL;
axiom_node_t *lifetime_node = NULL;
axiom_element_t *lifetime_ele = NULL;
axutil_qname_t *lifetime_qname = NULL;
axiom_node_t *key_size_node = NULL;
axiom_element_t *key_size_ele = NULL;
axutil_qname_t *key_size_qname = NULL;
axis2_char_t *key_size = NULL;
rstr_ele = (axiom_element_t*)axiom_node_get_data_element(rstr_node, env);
/*@Context RSTR*/
attr_ctx_qname = axutil_qname_create(env, TRUST_RST_CONTEXT, rstr->wst_ns_uri, TRUST_WST);
if (!attr_ctx_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Context Attribute Qname creation failed.");
return AXIS2_FAILURE;
}
attr_ctx = axiom_element_get_attribute_value(rstr_ele, env, attr_ctx_qname);
if (attr_ctx)
{
rstr->attr_context = attr_ctx;
}
axutil_qname_free(attr_ctx_qname, env);
/*TokenType*/
token_type_qname = axutil_qname_create(env, TRUST_TOKEN_TYPE, rstr->wst_ns_uri, TRUST_WST);
if (!token_type_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] TokenType Qname creation failed.");
return AXIS2_FAILURE;
}
token_type_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, token_type_qname, rstr_node, &token_type_node);
if (token_type_ele)
{
token_type = axiom_element_get_text(token_type_ele, env, token_type_node);
if(token_type)
{
rstr->token_type = token_type;
}
}
axutil_qname_free(token_type_qname, env);
/*RequestedSecurityToken*/
requested_security_token_qname = axutil_qname_create(env, TRUST_REQUESTED_SECURITY_TOKEN, rstr->wst_ns_uri, TRUST_WST);
if(!requested_security_token_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RequestedSecurityToken Qname creation failed.");
return AXIS2_FAILURE;
}
requested_security_token_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, requested_security_token_qname,
rstr_node, &requested_security_token_node);
if(requested_security_token_ele)
{
axiom_element_get_first_element(requested_security_token_ele, env, requested_security_token_node, &rstr->requested_sec_token);
}
axutil_qname_free(requested_security_token_qname, env);
/*RequestedProofToken*/
proof_token_qname = axutil_qname_create(env, TRUST_REQUESTED_PROOF_TOKEN, rstr->wst_ns_uri, TRUST_WST);
if(!proof_token_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RequestedProofToken Qname creation failed.");
return AXIS2_FAILURE;
}
proof_token_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, proof_token_qname, rstr_node, &proof_token_node);
if(proof_token_ele)
{
axiom_element_get_first_element(proof_token_ele, env, proof_token_node, &rstr->requested_proof_token);
}
axutil_qname_free(proof_token_qname, env);
/*AppliesTo*/
applies_to_qname = axutil_qname_create(env, TRUST_APPLIES_TO, TRUST_WSP_XMLNS, TRUST_WSP);
if (!applies_to_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Appliesto Qname creation failed.");
return AXIS2_FAILURE;
}
appliesto_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, applies_to_qname, rstr_node, &appliesto_node);
if(appliesto_ele)
{
first_ele = axiom_element_get_first_element(appliesto_ele, env, appliesto_node, &first_node);
if(first_ele)
{
rstr->applies_to = axiom_element_get_text(first_ele, env, first_node);
}
}
axutil_qname_free(applies_to_qname, env);
/*Entropy*/
entropy_qname = axutil_qname_create(env, TRUST_ENTROPY, rstr->wst_ns_uri, TRUST_WST);
if (!entropy_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Entropy Qname creation failed.");
return AXIS2_FAILURE;
}
entropy_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, entropy_qname, rstr_node, &entropy_node);
if(entropy_ele)
{
entropy = trust_entropy_create(env);
trust_entropy_set_ns_uri(entropy, env, rstr->wst_ns_uri);
if(AXIS2_SUCCESS == trust_entropy_deserialize(entropy, env, entropy_node))
{
rstr->entropy = entropy;
}
}
axutil_qname_free(entropy_qname, env);
/*LifeTime*/
lifetime_qname = axutil_qname_create(env, TRUST_LIFE_TIME, rstr->wst_ns_uri, TRUST_WST);
if(!lifetime_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] LifeTime Qname creation failed.");
return AXIS2_FAILURE;
}
lifetime_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, lifetime_qname, rstr_node, &lifetime_node);
if(lifetime_ele)
{
rstr->life_time = trust_life_time_create(env);
if(AXIS2_SUCCESS == trust_life_time_deserialize(rstr->life_time, env, lifetime_node))
{
}
}
axutil_qname_free(lifetime_qname, env);
/* KeySize */
key_size_qname = axutil_qname_create(env, TRUST_KEY_SIZE, rstr->wst_ns_uri, TRUST_WST);
key_size_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, key_size_qname, rstr_node, &key_size_node);
if(key_size_ele)
{
key_size = axiom_element_get_text(key_size_ele, env, key_size_node);
if(key_size)
{
rstr->key_size = atoi(key_size);
}
}
axutil_qname_free(key_size_qname, env);
/*Attached reference*/
attached_reference_qname = axutil_qname_create(env, TRUST_REQUESTED_ATTACHED_REFERENCE, rstr->wst_ns_uri, TRUST_WST);
if(!attached_reference_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RequestedAttachedReference Qname creation failed.");
return AXIS2_FAILURE;
}
attached_reference_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, attached_reference_qname, rstr_node, &attached_reference_node);
if(attached_reference_ele)
{
axiom_element_get_first_element(attached_reference_ele, env, attached_reference_node, &rstr->requested_attached_ref);
}
axutil_qname_free(attached_reference_qname, env);
/*Unattached reference*/
unattached_reference_qname = axutil_qname_create(env, TRUST_REQUESTED_UNATTACHED_REFERENCE, rstr->wst_ns_uri, TRUST_WST);
if(!unattached_reference_qname)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RequestedUnattachedReference Qname creation failed.");
return AXIS2_FAILURE;
}
unattached_reference_ele = axiom_element_get_first_child_with_qname(rstr_ele, env, unattached_reference_qname, rstr_node, &unattached_reference_node);
if(unattached_reference_ele)
{
axiom_element_get_first_element(unattached_reference_ele, env, unattached_reference_node, &rstr->requested_unattached_ref);
}
axutil_qname_free(unattached_reference_qname, env);
return AXIS2_SUCCESS;
}
/*Build RSTR */
AXIS2_EXTERN axiom_node_t * AXIS2_CALL
trust_rstr_build_rstr(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *parent)
{
axiom_node_t *rstr_node = NULL;
axis2_char_t *key_size = NULL;
rstr_node = (axiom_node_t*)trust_util_create_rstr_element(env, rstr->wst_ns_uri, rstr->attr_context);
if(rstr_node)
{
if(rstr->token_type)
{
if(NULL == (axiom_node_t*)trust_util_create_token_type_element(env, rstr->wst_ns_uri, rstr_node, rstr->token_type))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR TokenType element creation failed.");
return NULL;
}
}
if(rstr->requested_sec_token)
{
if(NULL == (axiom_node_t*)trust_util_create_requested_security_token_element(env, rstr->wst_ns_uri, rstr_node, rstr->requested_sec_token))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR ReqSecToken element creation failed.");
return NULL;
}
}
if(rstr->requested_proof_token)
{
/*Appending generic proof token node to RSTR - Here proof token can be just a session key, entropy node with binary secret
* Creating the proof token is completely up to the user. Eventhough, there are some default util methods provided by trust_util to create
* proof tokens.
*/
axiom_node_add_child(rstr_node, env, rstr->requested_proof_token);
}
if(rstr->applies_to)
{
if(NULL == (axiom_node_t*)trust_util_create_applies_to_element(env, rstr_node, rstr->applies_to, TRUST_WSA_XMLNS))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR AppliesTo element creation failed.");
return NULL;
}
}
if(rstr->requested_attached_ref)
{
axiom_node_t* attached_ref = NULL;
attached_ref = trust_util_create_req_attached_reference_element(env, rstr->wst_ns_uri, rstr_node);
if(NULL == attached_ref)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR AttachedReference element creation failed.");
return NULL;
}
axiom_node_add_child(attached_ref, env, rstr->requested_attached_ref);
}
if(rstr->requested_unattached_ref)
{
axiom_node_t* unattached_ref = NULL;
unattached_ref = trust_util_create_req_unattached_reference_element(env, rstr->wst_ns_uri, rstr_node);
if(NULL == unattached_ref)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR UnattachedReference element creation failed.");
return NULL;
}
axiom_node_add_child(unattached_ref, env, rstr->requested_unattached_ref);
}
if(rstr->entropy)
{
if(NULL == trust_entropy_serialize(rstr->entropy, env, rstr_node))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR Entropy element creation failed.");
return NULL;
}
}
if(rstr->life_time)
{
if(NULL == trust_life_time_serialize(rstr->life_time, env, rstr_node))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] RSTR LifeTime element creation failed.");
return NULL;
}
}
if(rstr->key_size > 0)
{
/*INFO -keysize Malloc Size = 128 */
key_size = AXIS2_MALLOC( env->allocator, sizeof(char)*128);
sprintf(key_size, "%d", rstr->key_size);
if(NULL == (axiom_node_t*)trust_util_create_key_size_element(env, rstr->wst_ns_uri, rstr_node, key_size))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] KeySize element creation failed.");
return NULL;
}
}
return rstr_node;
}
return NULL;
}
AXIS2_EXTERN axis2_char_t * AXIS2_CALL
trust_rstr_get_token_type(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->token_type;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_token_type(
trust_rstr_t *rstr,
const axutil_env_t *env,
axis2_char_t *token_type)
{
if(token_type)
{
rstr->token_type = token_type;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axis2_char_t * AXIS2_CALL
trust_rstr_get_request_type(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->request_type;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_request_type(
trust_rstr_t *rstr,
const axutil_env_t *env,
axis2_char_t *request_type)
{
if(request_type)
{
rstr->request_type = request_type;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axiom_node_t * AXIS2_CALL
trust_rstr_get_requested_security_token(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->requested_sec_token;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_requested_security_token(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *security_token)
{
if (security_token)
{
rstr->requested_sec_token = security_token;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axis2_char_t * AXIS2_CALL
trust_rstr_get_applies_to(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->applies_to;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_applies_to(
trust_rstr_t *rstr,
const axutil_env_t *env,
axis2_char_t *applies_to)
{
if (applies_to)
{
rstr->applies_to = applies_to;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axiom_node_t * AXIS2_CALL
trust_rstr_get_requested_attached_reference(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->requested_attached_ref;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_requested_attached_reference(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *ref_node)
{
if (ref_node)
{
rstr->requested_attached_ref = ref_node;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axiom_node_t * AXIS2_CALL
trust_rstr_get_requested_unattached_reference(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->requested_unattached_ref;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_requested_unattached_reference(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *ref_node)
{
if (ref_node)
{
rstr->requested_unattached_ref = ref_node;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axiom_node_t * AXIS2_CALL
trust_rstr_get_requested_proof_token(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->requested_proof_token;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_requested_proof_token(
trust_rstr_t *rstr,
const axutil_env_t *env,
axiom_node_t *proof_token)
{
if (proof_token)
{
rstr->requested_proof_token = proof_token;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN trust_entropy_t * AXIS2_CALL
trust_rstr_get_entropy(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->entropy;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_entropy(
trust_rstr_t *rstr,
const axutil_env_t *env,
trust_entropy_t *entropy)
{
if (entropy)
{
rstr->entropy = entropy;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN trust_life_time_t* AXIS2_CALL
trust_rstr_get_life_time(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->life_time;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_life_time(
trust_rstr_t *rstr,
const axutil_env_t *env,
trust_life_time_t *life_time)
{
if (life_time)
{
rstr->life_time = life_time;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
trust_rstr_get_in_header(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->in_header;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_in_header(
trust_rstr_t *rstr,
const axutil_env_t *env,
axis2_bool_t in_header)
{
rstr->in_header = in_header;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_char_t * AXIS2_CALL
trust_rstr_get_wst_ns_uri(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->wst_ns_uri;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_wst_ns_uri(
trust_rstr_t *rstr,
const axutil_env_t *env,
axis2_char_t *wst_ns_uri)
{
if(wst_ns_uri)
{
rstr->wst_ns_uri = wst_ns_uri;
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
AXIS2_EXTERN int AXIS2_CALL
trust_rstr_get_key_size(
trust_rstr_t *rstr,
const axutil_env_t *env)
{
return rstr->key_size;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
trust_rstr_set_key_size(
trust_rstr_t *rstr,
const axutil_env_t *env,
int key_size)
{
rstr->key_size = key_size;
return AXIS2_SUCCESS;
}