0

I have a webservice call with below output of xml from the below security class which is from oasisopenorgwssSecurity

<wsse:UsernameToken>
            <wsse:Username>XXXXXXXX</wsse:Username>
            <wsse:Password>xxxxxxxxxxxx</wsse:Password></wsse:UsernameToken>
public class OasisOpenOrgWssSecuritySecext 

{

// UserToken Class
public class UsernameToken 
{
    // Constructor for UsernameToken used to pass in username and password parameters
    public UsernameToken(String username, String password)
    {
        this.Username = username;
        this.Password = password;
        this.Nonce = generateNounce();
        this.Created = generateTimestamp();
    }

    public String Username;
    public String Password;
    public String Nonce;
    public String Created;
    private String[] Username_type_info = new String[]{'Username','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Password_type_info = new String[]{'Password','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Nonce_type_info = new String[]{'Nonce','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Created_type_info = new String[]{'wsu:Created','http://www.w3.org/2001/XMLSchema','string','0','1','false'};        
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'Username','Password','Nonce','Created'};

    // Generate Nounce, random number base64 encoded
    public String generateNounce()
    {
        Long randomLong = Crypto.getRandomLong();
        return EncodingUtil.base64Encode(Blob.valueOf(String.valueOf(randomLong)));
    }

    // Generate timestamp in GMT
    public String generateTimestamp()
    {
        return Datetime.now().formatGmt('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
    }
}

// SecurityHeaderType Class
public class SecurityHeaderType 
{       
    // Constructor for SecurityHeaderType used to pass in username and password parameters and instantiate the UsernameToken object     
    public SecurityHeaderType(String username, String password)
    {
        this.UsernameToken = new OasisOpenOrgWssSecuritySecext.UsernameToken(username, password);
    }

    public String wsuNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';              
    public OasisOpenOrgWssSecuritySecext.UsernameToken UsernameToken;
    private String[] UsernameToken_type_info = new String[]{'UsernameToken','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','UsernameToken','1','1','false'};
    private String[] wsuNamespace_att_info = new String[]{'xmlns:wsu'};               
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'UsernameToken'};
}

}

the above code needed to be converted so that output of the web service call will look like below

<wsse:UsernameToken>
            <wsse:Username>XXXXXXXX</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxxxxxxxxxx</wsse:Password>

I do not know how to add TYPE parameter to password. Please help me!!

Harika
  • 11
  • 5

3 Answers3

0

Try this:

// UserToken Class
public class UsernameToken 
{
    // Constructor for UsernameToken used to pass in username and password parameters
    public UsernameToken(String username, String password)
    {
        this.Username = username;
        this.Password = password;
        this.Nonce = generateNounce();
        this.Created = generateTimestamp();
        this.Type_x = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
    }

    public String Username;
    public String Password;
    public String Nonce;
    public String Created;
    public String Type_x;
    private String[] Username_type_info = new String[]{'Username','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Password_type_info = new String[]{'Password','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Nonce_type_info = new String[]{'Nonce','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Created_type_info = new String[]{'wsu:Created','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Type_x_att_info = new String[]{'Type'};
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'Username','Password','Nonce','Created'};

    // Generate Nounce, random number base64 encoded
    public String generateNounce()
    {
        Long randomLong = Crypto.getRandomLong();
        return EncodingUtil.base64Encode(Blob.valueOf(String.valueOf(randomLong)));
    }

    // Generate timestamp in GMT
    public String generateTimestamp()
    {
        return Datetime.now().formatGmt('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
    }
}
Greg
  • 1
  • it is not working and it will add type to the username token tag. I added the type tag to password but the actual password is going empty. My changes are below. `public class UsernameToken{ public UsernameToken(String username, String password) { this.Username = username; PasswordToken = new Password_element(password); }` – Harika Jul 14 '18 at 02:15
0

public class OasisOpenOrgWssSecuritySecext {

// UserToken Class
public class UsernameToken 
{
    // Constructor for UsernameToken used to pass in username and password parameters
    public UsernameToken(String username, String password)
    {
        this.Username = username;
        PasswordToken = new Password_element(password);
        this.Nonce = generateNounce();
        this.Created = generateTimestamp();
    }

    public String Username;
    public Password_element PasswordToken;
    public String Nonce;
    public String Created;
    private String[] Username_type_info = new String[]{'Username','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] PasswordToken_type_info = new String[]{'Password','http://www.w3.org/2001/XMLSchema','String','0','1','false'};
    private String[] Nonce_type_info = new String[]{'Nonce','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
    private String[] Created_type_info = new String[]{'wsu:Created','http://www.w3.org/2001/XMLSchema','string','0','1','false'};        
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'Username','PasswordToken','Nonce','Created'};

    // Generate Nounce, random number base64 encoded
    public String generateNounce()
    {
        Long randomLong = Crypto.getRandomLong();
        return EncodingUtil.base64Encode(Blob.valueOf(String.valueOf(randomLong)));
    }

    // Generate timestamp in GMT
    public String generateTimestamp()
    {
        return Datetime.now().formatGmt('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
    }
}

public class Password_element {
    public Password_element(String passwords){
        this.password = passwords;
     }

    public String password;
    public String Type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
    private String[] password_type_info = new String[]{'password','http://www.w3.org/2001/XMLSchema','String','0','1','false'};
    private String[] Type_att_info = new String[]{'Type'};
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{};
}

// SecurityHeaderType Class
public class SecurityHeaderType 
{       
    // Constructor for SecurityHeaderType used to pass in username and password parameters and instantiate the UsernameToken object     
    public SecurityHeaderType(String username, String password)
    {
        this.UsernameToken = new OasisOpenOrgWssSecuritySecext.UsernameToken(username, password);
    }

    public String wsuNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';              
    public OasisOpenOrgWssSecuritySecext.UsernameToken UsernameToken;
    private String[] UsernameToken_type_info = new String[]{'UsernameToken','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','UsernameToken','1','1','false'};
    private String[] wsuNamespace_att_info = new String[]{'xmlns:wsu'};               
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'UsernameToken'};
}

}

the output is it has TYPE but it does not take the password I have added

<Password Type=""/>

If I changes the password_token class as below then it appears the output as

<Password Type=""><Password>xxxxx</Password></Password>

public class Password_element {
    public Password_element(String passwords){
        this.password = passwords;
     }

    public String password;
    public String Type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
    public String Type_x = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';  
    private String[] password_type_info = new String[]{'password','http://www.w3.org/2001/XMLSchema','String','0','1','false'};
    private String[] Type_att_info = new String[]{'Type'};
    private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
    private String[] field_order_type_info = new String[]{'Password'};
}
Harika
  • 11
  • 5
0

I found a similar question posted here: What are the parameters for the Salesforce WebServiceCallout.invoke method?

Apparently it is not possible to create an attribute on a simple element.

Greg
  • 1