using System;
using System.Xml;
using System.ServiceModel.Channels;
namespace WcfCmisWSTests {
///
/// author: Dmitry Velichkevich
///
public class SecurityMessageHeader: MessageHeader {
private const int MINIMAL_ALLOWED_STRING_LENGTH = 1;
private const int TIME_TOKEN_POSITION = 3;
private const int LAST_DATE_TOKEN_POSITION = 2;
private const int EXPIRE_ODDS = 4167;
private const string DOT = ".";
private const char DOT_SYMBOL = '.';
private const string MINUS = "-";
private const string BREAK = " ";
private const char BREAK_SYMBOL = ' ';
private const string TIME_SPECIFICATOR = "T";
private const string DATE_TIME_ZONE_SPECIFICATOR = "Z";
private const string SECURITY_HEADER_NAME = "Security";
private const string SECURITY_HEADER_NAME_SPACE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-w" +
"ssecurity-secext-1.0.xsd";
private const string SECURITY_HEADER_ENTRY = "\n \n" +
" {1}\n {2}\n" +
" \n \n {4}\n {5}\n IGRKG/ABNywDNZ1/lxxarA==\n {6}\n \n";
private string value;
public static MessageHeader CreateHeader(string userName, string password) {
string formattedSecurityHeader = string.Format(SECURITY_HEADER_ENTRY, new object[] {
DateTime.Now.TimeOfDay.Ticks, formatDate(), formatDate(new DateTime(DateTime.Now.Ticks + EXPIRE_ODDS).
ToLocalTime().ToString()), DateTime.Now.TimeOfDay.Ticks, userName, password, formatDate()});
return new SecurityMessageHeader(formattedSecurityHeader);
}
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) {
writer.WriteRaw(value);
}
public override string Actor {
get {
return string.Empty;
}
}
public override bool IsReferenceParameter {
get {
return true;
}
}
public override bool MustUnderstand {
get {
return true;
}
}
public override bool Relay {
get {
return false;
}
}
public override string ToString() {
return base.ToString();
}
public override string Namespace {
get {
return SECURITY_HEADER_NAME_SPACE;
}
}
public override string Name {
get {
return SECURITY_HEADER_NAME;
}
}
private SecurityMessageHeader(string value) {
this.value = value;
}
private static string formatDate() {
return formatDate(DateTime.Now.ToLocalTime().ToString());
}
private static string formatDate(string sourceDate) {
if (!(sourceDate is string) || (sourceDate.Length < MINIMAL_ALLOWED_STRING_LENGTH)) {
sourceDate = DateTime.Now.ToLocalTime().ToString();
}
return reverseDate(sourceDate) + DOT + DateTime.Now.Millisecond + DATE_TIME_ZONE_SPECIFICATOR;
}
private static string reverseDate(string sample) {
string[] dateFields = sample.Split(new char[] {DOT_SYMBOL, BREAK_SYMBOL});
int i = LAST_DATE_TOKEN_POSITION;
return dateFields[i--] + MINUS + dateFields[i--] + MINUS + dateFields[i] + TIME_SPECIFICATOR +
dateFields[TIME_TOKEN_POSITION];
}
}
}