You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
911 lines
26 KiB
911 lines
26 KiB
using System;
|
|
using System.Data;
|
|
using System.Collections;
|
|
using System.Data.SqlClient;
|
|
using System.IO;
|
|
using System.Security.Principal;
|
|
using System.Xml;
|
|
using System.Text;
|
|
using System.Xml.Serialization;
|
|
using System.Globalization;
|
|
|
|
using UDDI.Diagnostics;
|
|
|
|
namespace UDDI
|
|
{
|
|
//
|
|
// 739955 - Make sure date is parsed in the same format it was written.
|
|
//
|
|
public class UDDILastResetDate
|
|
{
|
|
private const string dateTimeFormat = "MM/dd/yyyy HH:mm:ss";
|
|
private static DateTimeFormatInfo dateTimeFormatInfo;
|
|
|
|
static UDDILastResetDate()
|
|
{
|
|
dateTimeFormatInfo = new DateTimeFormatInfo();
|
|
|
|
//
|
|
// When you specify a '/' in a date/time format string, this tells the DateTime
|
|
// class to use the default Date Separator, not the character '/'. Same goes
|
|
// for ':' and Time Separator.
|
|
//
|
|
// So all we do is change the defaults to '/' and ':'.
|
|
//
|
|
dateTimeFormatInfo.DateSeparator = "/";
|
|
dateTimeFormatInfo.TimeSeparator = ":";
|
|
}
|
|
|
|
public static DateTime Get()
|
|
{
|
|
return DateTime.ParseExact( Config.GetString( "Security.KeyLastResetDate" ), dateTimeFormat, dateTimeFormatInfo );
|
|
}
|
|
|
|
public static void Set( DateTime dateTime )
|
|
{
|
|
Config.SetString( "Security.KeyLastResetDate", dateTime.ToString( dateTimeFormat, dateTimeFormatInfo ) );
|
|
}
|
|
}
|
|
|
|
public class Constants
|
|
{
|
|
public const int ReadLockTimeout = 120000; // milliseconds
|
|
//
|
|
// Subtract this offset from error numbers that come from our DB layer to get an
|
|
// ErrorType value. This offset is added in our DB to keep us away from SQL-defined
|
|
// error numbers.
|
|
//
|
|
public const int ErrorTypeSQLOffset = 50000;
|
|
|
|
public const string OwningBusinessTModelKey = "uuid:4064c064-6d14-4f35-8953-9652106476a9";
|
|
|
|
public const string UDDITypeTaxonomyTModelKey = "uuid:c1acf26d-9672-4404-9d70-39b756e62ab4";
|
|
public const string UDDITypeTaxonomyWSDLSpecKeyValue = "wsdlSpec";
|
|
|
|
public const int Run = 1;
|
|
public class Site
|
|
{
|
|
public const string Version = "";
|
|
}
|
|
public class Passport
|
|
{
|
|
public const int TimeWindow = 14400;
|
|
}
|
|
public class Web
|
|
{
|
|
public const int HttpsPort = 443;
|
|
public const int HttpPort = 80;
|
|
public const int BetaSite = 0;
|
|
public const int TestSite = 0;
|
|
public const string SiteStatus = "open";
|
|
public const string OutageStart = "";
|
|
public const string OutageEnd = "";
|
|
public const int EnableRegistration = 1;
|
|
}
|
|
public class Security
|
|
{
|
|
public const int HTTPS = 1;
|
|
|
|
}
|
|
public class Debug
|
|
{
|
|
public const int StackTrace = 0;
|
|
}
|
|
public class Lengths
|
|
{
|
|
//public const int Behavior = 1;
|
|
//public const int ReplicationBehavior = 2;
|
|
public const int AccessPoint = 255;
|
|
public const int AddressLine = 80;
|
|
public const int AuthInfo = 4096;
|
|
public const int AuthorizedName = 255;
|
|
//public const int BindingKey = 41;
|
|
//public const int BusinessKey = 41;
|
|
//public const int ServiceKey = 41;
|
|
public const int Key = 41;
|
|
public const int TModelKey = 255;
|
|
|
|
public const int Description = 255;
|
|
public const int DiscoveryURL = 255;
|
|
public const int Email = 255;
|
|
public const int HostingRedirector = 41;
|
|
public const int InstanceParms = 255;
|
|
public const int KeyName = 255;
|
|
public const int KeyType = 16;
|
|
public const int KeyValue = 255;
|
|
//public const int MaxRows = 5;
|
|
public const int Name = 255;
|
|
public const int Operator = 48;
|
|
public const int OverviewURL = 255;
|
|
public const int PersonName = 255;
|
|
public const int Phone = 50;
|
|
public const int SortCode = 10;
|
|
public const int UploadRegister = 255;
|
|
public const int URLType = 16;
|
|
public const int UseType = 255;
|
|
public const int UserID = 450;
|
|
|
|
// additional lengths
|
|
public const int ConfigName = 450;
|
|
public const int ConfigValue = 4000;
|
|
public const int Context = 20;
|
|
public const int IsoLangCode = 17;
|
|
public const int generic = 20;
|
|
public const int OperatorName = 450;
|
|
public const int CertSerialNo = 450;
|
|
public const int PublisherStatus = 256;
|
|
public const int SoapReplicationURL = 4000;
|
|
public const int CertIssuer = 225;
|
|
public const int CertSubject = 225;
|
|
public const int Certificate = 225;
|
|
public const int CompanyName = 100;
|
|
public const int City = 100;
|
|
public const int StateProvince = 100;
|
|
public const int PostalCode = 100;
|
|
public const int Country = 100;
|
|
public const int Tier = 256;
|
|
}
|
|
}
|
|
|
|
public enum EntityType
|
|
{
|
|
TModel = 0,
|
|
BusinessEntity = 1,
|
|
BusinessService = 2,
|
|
BindingTemplate = 3,
|
|
Contact = 4,
|
|
TModelInstanceInfo = 5,
|
|
InstanceDetail = 6,
|
|
TModelOverviewDoc = 7,
|
|
InstanceDetailOverviewDoc = 8
|
|
}
|
|
|
|
public enum KeyedReferenceType
|
|
{
|
|
CategoryBag = 1,
|
|
IdentifierBag = 2,
|
|
Assertion = 3
|
|
}
|
|
|
|
public enum ErrorType
|
|
{
|
|
E_success = 0,
|
|
E_nameTooLong = 10020,
|
|
E_tooManyOptions = 10030,
|
|
E_unrecognizedVersion = 10040,
|
|
E_unsupported = 10050,
|
|
E_authTokenExpired = 10110,
|
|
E_authTokenRequired = 10120,
|
|
E_operatorMismatch = 10130, // Deprecated.
|
|
E_userMismatch = 10140,
|
|
E_unknownUser = 10150,
|
|
E_accountLimitExceeded = 10160,
|
|
E_invalidKeyPassed = 10210,
|
|
E_invalidURLPassed = 10220, // Deprecated.
|
|
E_keyRetired = 10310,
|
|
E_busy = 10400, // Deprecated.
|
|
E_fatalError = 10500,
|
|
E_languageError = 10060,
|
|
E_invalidCategory = 20000, // Deprecated. Use E_invalidValue
|
|
E_categorizationNotAllowed = 20100, // Deprecated. Use E_valueNotAllowed
|
|
E_invalidValue = 20200,
|
|
E_valueNotAllowed = 20210,
|
|
E_invalidProjection = 20230,
|
|
E_assertionNotFound = 30000,
|
|
E_messageTooLarge = 30110, // TODO: Error codes duplicated?
|
|
E_invalidCompletionStatus = 30100, // TODO: Error codes duplicated?
|
|
E_transferAborted = 30200,
|
|
E_requestDenied = 30210,
|
|
E_publisherCancelled = 30220,
|
|
E_secretUnknown = 30230
|
|
}
|
|
|
|
public enum QueryType
|
|
{
|
|
Get = 0,
|
|
Find = 1
|
|
}
|
|
|
|
//
|
|
// Use this enumerated type to determine where the UDDIException instance is being
|
|
// used.
|
|
//
|
|
public enum UDDITextContext
|
|
{
|
|
API,
|
|
UI,
|
|
EventLog,
|
|
FileLog
|
|
}
|
|
|
|
//
|
|
// This class should be used for any message that the user would see. Depending on the
|
|
// context, this class will localize it's message as the system locale, or the user's locale.
|
|
//
|
|
public class UDDIText
|
|
{
|
|
private string defaultLocaleText;
|
|
private string textName;
|
|
private object[] textFormatParts;
|
|
|
|
public UDDIText( string textName ) : this( textName, null )
|
|
{
|
|
}
|
|
|
|
public UDDIText( string textName, params object[] textFormatParts )
|
|
{
|
|
this.textName = textName;
|
|
this.textFormatParts = textFormatParts;
|
|
defaultLocaleText = ConstructString( Localization.GetStringLocalMachineCulture( textName ) );
|
|
}
|
|
|
|
public string GetText()
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
|
|
public string GetText( UDDITextContext context )
|
|
{
|
|
switch( context )
|
|
{
|
|
case UDDITextContext.API:
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
case UDDITextContext.UI:
|
|
{
|
|
return ConstructString( Localization.GetString( textName ) );
|
|
}
|
|
case UDDITextContext.EventLog:
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
case UDDITextContext.FileLog:
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
default:
|
|
{
|
|
return defaultLocaleText;
|
|
}
|
|
}
|
|
}
|
|
|
|
private string ConstructString( string stringToConstruct )
|
|
{
|
|
if( null != textFormatParts )
|
|
{
|
|
stringToConstruct = string.Format( stringToConstruct, textFormatParts );
|
|
}
|
|
|
|
return stringToConstruct;
|
|
}
|
|
}
|
|
|
|
public class UDDIException : ApplicationException
|
|
{
|
|
private UDDIText uddiText;
|
|
|
|
public UDDIException() : this( ErrorType.E_fatalError, "", null )
|
|
{
|
|
}
|
|
|
|
public UDDIException( ErrorType number, string errorMsgName ) : this( number, errorMsgName, null )
|
|
{
|
|
}
|
|
|
|
public UDDIException( ErrorType number, string errorMsgName, params object[] errorMsgFormatParts ) : this( number, new UDDIText( errorMsgName, errorMsgFormatParts ) )
|
|
{
|
|
}
|
|
|
|
public UDDIException( ErrorType number, UDDIText uddiText )
|
|
{
|
|
this.uddiText = uddiText;
|
|
this.Number = number;
|
|
}
|
|
|
|
//
|
|
// GetMessage will localize the exception message depending on who is
|
|
// using the exception. Currently, in all cases we localize the message
|
|
// using the server local, except if the exception is coming from the
|
|
// UI.
|
|
//
|
|
public string GetMessage( UDDITextContext context )
|
|
{
|
|
return uddiText.GetText( context );
|
|
}
|
|
|
|
public override string Message
|
|
{
|
|
get
|
|
{
|
|
return uddiText.GetText();
|
|
}
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return uddiText.GetText();
|
|
}
|
|
|
|
public ErrorType Number = 0;
|
|
}
|
|
|
|
public class Conversions
|
|
{
|
|
public static string EntityNameFromID( EntityType entityType )
|
|
{
|
|
switch( entityType )
|
|
{
|
|
case EntityType.BusinessEntity:
|
|
return "businessEntity";
|
|
|
|
case EntityType.BusinessService:
|
|
return "businessService";
|
|
|
|
case EntityType.BindingTemplate:
|
|
return "bindingTemplate";
|
|
|
|
case EntityType.TModel:
|
|
return "tModel";
|
|
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public GuidFromKey [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Converts "uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" keys to
|
|
/// a standard GUID.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="key">
|
|
/// The key to convert.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// The equivalent GUID.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static Guid GuidFromKey( string key )
|
|
{
|
|
Debug.VerifyKey( key );
|
|
|
|
return new Guid( key.Substring(5) );
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public KeyFromGuid [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Converts standard GUIDs to a key of the form
|
|
/// "uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="guid">
|
|
/// The GUID to convert.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// The equivalent key.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static string KeyFromGuid( Guid guid )
|
|
{
|
|
if( null == (object)guid )
|
|
return null;
|
|
|
|
return "uuid:" + Convert.ToString( guid );
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public KeyFromGuid [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Converts standard GUIDs to a key of the form
|
|
/// "uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="guid">
|
|
/// The GUID to convert.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// The equivalent key.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static string KeyFromGuid( string guid )
|
|
{
|
|
if( null == guid )
|
|
return null;
|
|
|
|
return "uuid:" + guid;
|
|
}
|
|
|
|
public static string GuidStringFromKey( string key )
|
|
{
|
|
//
|
|
// Convert uuid:E31A569A-AEFF-4468-BA4D-2BF22FE4ACEE
|
|
// to string type without uuid:
|
|
// Example: E31A569A-AEFF-4468-BA4D-2BF22FE4ACEE
|
|
//
|
|
string NewGuidStr = "";
|
|
|
|
switch ( key )
|
|
{
|
|
case null:
|
|
NewGuidStr = null;
|
|
break;
|
|
|
|
case "":
|
|
NewGuidStr = "";
|
|
break;
|
|
|
|
default:
|
|
Debug.VerifyKey( key );
|
|
|
|
NewGuidStr = new Guid( key.Substring(5) ).ToString();
|
|
break;
|
|
}
|
|
|
|
return( NewGuidStr );
|
|
}
|
|
}
|
|
|
|
/// ********************************************************************
|
|
/// public class Utility
|
|
/// --------------------------------------------------------------------
|
|
/// <summary>
|
|
/// </summary>
|
|
/// ********************************************************************
|
|
///
|
|
public class Utility
|
|
{
|
|
public enum LengthBehavior
|
|
{
|
|
Ignore = 0,
|
|
Truncate = 1,
|
|
ThrowException = 2
|
|
};
|
|
|
|
/// ****************************************************************
|
|
/// public Iff [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Returns a particular value depending on whether the given
|
|
/// expression is true or false. Useful for web page templates
|
|
/// where arbitrary expressions cannot be evaluated, but
|
|
/// functions that take expressions as arguments can be
|
|
/// evaluated.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="expression">
|
|
/// The boolean result of an expression.
|
|
/// </param>
|
|
///
|
|
/// <param name="trueReturnValue">
|
|
/// The object to return if the expression is true.
|
|
/// </param>
|
|
///
|
|
/// <param name="falseReturnValue">
|
|
/// The object to return if the expression is false.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// The value of trueReturnValue if the expression is true,
|
|
/// otherwise falseReturnValue.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static object Iff( bool expression, object trueReturnValue, object falseReturnValue )
|
|
{
|
|
if( expression )
|
|
return trueReturnValue;
|
|
else
|
|
return falseReturnValue;
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public StringEmpty [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Checks if a string is empty.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="str">
|
|
/// The string to check.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// True if the string is empty or null.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static bool StringEmpty( string str )
|
|
{
|
|
if( null == str )
|
|
return true;
|
|
|
|
return String.Empty == str;
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public CollectionEmpty [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Checks if a collection is empty.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="col">
|
|
/// The collection to check.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// True if the collection is empty or null.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static bool CollectionEmpty( ICollection col )
|
|
{
|
|
if( null == col || 0 == col.Count )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public ValidateLength [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Removes leading and trailing whitespace.
|
|
/// The resulting string is then truncated to the specified length.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="str">
|
|
/// The string to check.
|
|
/// </param>
|
|
///
|
|
/// <param name="field">
|
|
/// The attribute or element from which the string came.
|
|
/// </param>
|
|
///
|
|
/// <param name="maxLength">
|
|
/// The maximum length for the string.
|
|
/// </param>
|
|
/// ****************************************************************
|
|
///
|
|
public static void ValidateLength( ref string str, string field, int maxLength )
|
|
{
|
|
if( Utility.StringEmpty( str ) )
|
|
return;
|
|
|
|
//
|
|
// Remove leading and trailing whitespace
|
|
//
|
|
str = str.Trim();
|
|
|
|
// FixCRLF( ref str );
|
|
|
|
if( str.Length > maxLength )
|
|
{
|
|
Debug.Write( SeverityType.Info, CategoryType.Data, "String is too long" );
|
|
Debug.Write( SeverityType.Info, CategoryType.Data, "Trimmed length is " + str.Length.ToString() );
|
|
Debug.Write( SeverityType.Info, CategoryType.Data, "Trimmed String follows:\n" + str );
|
|
Debug.Write( SeverityType.Info, CategoryType.Data, "Trimmed field follows:\n" + field );
|
|
|
|
for( int i=0; i<str.Length; i++ )
|
|
{
|
|
Debug.Write( SeverityType.Info, CategoryType.Data, i.ToString() + ": " + str[i].ToString() + " -- 0x" + Convert.ToInt32( str[i] ).ToString( "x" ) );
|
|
}
|
|
|
|
LengthBehavior mode;
|
|
|
|
if( ContextType.Replication == Context.ContextType )
|
|
mode = (LengthBehavior)Config.GetInt( "Length.ReplicationBehavior", (int)LengthBehavior.ThrowException );
|
|
else
|
|
mode = (LengthBehavior)Config.GetInt( "Length.Behavior", (int)LengthBehavior.Truncate );
|
|
|
|
if( LengthBehavior.Truncate == mode )
|
|
{
|
|
str = str.Substring( 0, maxLength );
|
|
str = str.Trim();
|
|
}
|
|
else if( LengthBehavior.ThrowException == mode )
|
|
{
|
|
#if never
|
|
throw new UDDIException(
|
|
ErrorType.E_nameTooLong,
|
|
"Field " + field + " exceeds maximum length" );
|
|
#endif
|
|
throw new UDDIException( ErrorType.E_nameTooLong, "UDDI_ERROR_FIELD_TOO_LONG", field );
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Strip out the non-printable characters
|
|
//
|
|
public static string XmlEncode( string str )
|
|
{
|
|
StringBuilder newstring = new StringBuilder();
|
|
|
|
foreach( char ch in str )
|
|
{
|
|
//#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] |
|
|
if( 0x09 == ch || 0x0A == ch || 0x0D == ch || ( ch >= 0x20 && ch <= 0xD7FF ) || ( ch >= 0xE000 && ch <= 0xFFFD ) )
|
|
{
|
|
newstring.Append( ch );
|
|
}
|
|
}
|
|
|
|
return newstring.ToString();
|
|
}
|
|
|
|
public static string GetDefaultPublisher()
|
|
{
|
|
//
|
|
// TODO: Need to do the right thing here
|
|
//
|
|
return "System";
|
|
}
|
|
|
|
//
|
|
// TODO: remove once we have verified .NET does this for us
|
|
//
|
|
private static void FixCRLF( ref string str )
|
|
{
|
|
char[] bytes = new char[ str.Length ];
|
|
int n = 0;
|
|
int length = str.Length;
|
|
|
|
for( int i = 0; i < length; i++ )
|
|
{
|
|
//
|
|
// If the char is not a CR write it out
|
|
//
|
|
if( 0x0D != str[ i ] )
|
|
bytes[ n++ ] = str[ i ];
|
|
else
|
|
{
|
|
//
|
|
// If a CRLF combo is found or we are on a CR
|
|
// at the end of the string write out a LF
|
|
//
|
|
if( ( ( i != length - 1 ) && ( 0x0A != str[ i + 1 ] ) ) ||
|
|
( i == length - 1 ) )
|
|
{
|
|
bytes[ n++ ] = (char) 0x0A;
|
|
}
|
|
}
|
|
}
|
|
|
|
str = new string( bytes, 0, n );
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public ValidateLength [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Checks that a string is shorter than a given maximum and longer than the specified
|
|
/// minimum. It also removes any leading or trailing whitespace.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="str">
|
|
/// The string to check.
|
|
/// </param>
|
|
///
|
|
/// <param name="field">
|
|
/// The attribute or element from which the string came.
|
|
/// </param>
|
|
///
|
|
/// <param name="maxLength">
|
|
/// The maximum length for the string.
|
|
/// </param>
|
|
///
|
|
/// <param name="minLength">
|
|
/// The minimum length for the string.
|
|
/// </param>
|
|
/// ****************************************************************
|
|
///
|
|
|
|
//
|
|
// TODO: This function should call the other overload for ValidateLength
|
|
//
|
|
public static void ValidateLength( ref string str, string field, int maxLength, int minLength )
|
|
{
|
|
int length = 0;
|
|
|
|
if( null != str )
|
|
{
|
|
//
|
|
// Remove leading and trailing whitespace
|
|
//
|
|
str = str.Trim();
|
|
// FixCRLF( ref str );
|
|
|
|
length = str.Length;
|
|
}
|
|
|
|
if( length < minLength )
|
|
{
|
|
#if never
|
|
throw new UDDIException(
|
|
ErrorType.E_fatalError,
|
|
"Value for '" + field + "' does not meet minimum length requirement of " + minLength.ToString() );
|
|
#endif
|
|
throw new UDDIException( ErrorType.E_fatalError, "UDDI_ERROR_FIELD_TOO_SHORT", field, minLength.ToString() );
|
|
}
|
|
|
|
if( null != str && length > maxLength )
|
|
{
|
|
LengthBehavior mode;
|
|
|
|
if( ContextType.Replication == Context.ContextType )
|
|
mode = (LengthBehavior)Config.GetInt( "Length.ReplicationBehavior", (int)LengthBehavior.ThrowException );
|
|
else
|
|
mode = (LengthBehavior)Config.GetInt( "Length.Behavior", (int)LengthBehavior.Truncate );
|
|
|
|
if( LengthBehavior.Truncate == mode )
|
|
{
|
|
str = str.Substring( 0, maxLength );
|
|
str = str.Trim();
|
|
}
|
|
else if( LengthBehavior.ThrowException == mode )
|
|
{
|
|
#if never
|
|
throw new UDDIException(
|
|
ErrorType.E_nameTooLong,
|
|
"Field " + field + " exceeds maximum length" );
|
|
#endif
|
|
throw new UDDIException( ErrorType.E_nameTooLong, "UDDI_ERROR_FIELD_TOO_LONG", field );
|
|
}
|
|
}
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public ParseDelimitedToken [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Retrieves a token from a string given the delimiter that
|
|
/// immediately preceeds (and optionally, the delimiter that
|
|
/// follows) the desired token.
|
|
/// </summary>
|
|
/// ----------------------------------------------------------------
|
|
/// <param name="beginDelimiter">
|
|
/// The starting delimiter.
|
|
/// </param>
|
|
///
|
|
/// <param name="endDelimiter">
|
|
/// [Optional] The ending delimiter. This can be null.
|
|
/// </param>
|
|
///
|
|
/// <param name="text">
|
|
/// The string to search.
|
|
/// </param>
|
|
/// ----------------------------------------------------------------
|
|
/// <returns>
|
|
/// The token, if successful. Otherwise, null.
|
|
/// </returns>
|
|
/// ****************************************************************
|
|
///
|
|
public static string ParseDelimitedToken( string beginDelimiter, string endDelimiter, string text )
|
|
{
|
|
Debug.Assert( null != beginDelimiter, "beginDelimiter cannot be null" );
|
|
Debug.Assert( null != text, "text cannot be null" );
|
|
|
|
//
|
|
// Find the beginning of the starting delimiter. Add the length to
|
|
// give the starting position of the token.
|
|
//
|
|
int startPos = text.IndexOf( beginDelimiter );
|
|
|
|
if( -1 == startPos )
|
|
return null;
|
|
|
|
startPos += beginDelimiter.Length;
|
|
|
|
//
|
|
// Find the ending delimiter. If no ending delimiter was specified, then
|
|
// simply return the remaining string after the beginning delimiter.
|
|
//
|
|
if( null == endDelimiter )
|
|
return text.Substring( startPos );
|
|
|
|
int endPos = text.IndexOf( endDelimiter, startPos );
|
|
|
|
if( -1 == endPos )
|
|
return null;
|
|
|
|
return text.Substring( startPos, endPos - startPos );
|
|
}
|
|
|
|
/// ****************************************************************
|
|
/// public IsValidKey [static]
|
|
/// ----------------------------------------------------------------
|
|
/// <summary>
|
|
/// Checks to see if the entity associated with a key actually
|
|
/// exists in the database.
|
|
/// </summary>
|
|
/// ****************************************************************
|
|
///
|
|
|
|
//
|
|
// TODO: This function need to be re-written
|
|
//
|
|
public static void IsValidKey( EntityType entityType, string key )
|
|
{
|
|
SqlCommand cmd = new SqlCommand( "net_key_validate", ConnectionManager.GetConnection() );
|
|
cmd.CommandType = CommandType.StoredProcedure;
|
|
|
|
cmd.Parameters.Add( new SqlParameter( "@entityTypeID", SqlDbType.TinyInt ) ).Direction = ParameterDirection.Input;
|
|
cmd.Parameters.Add( new SqlParameter( "@entityKey", SqlDbType.UniqueIdentifier ) ).Direction = ParameterDirection.Input;
|
|
|
|
SqlParameterAccessor parmacc = new SqlParameterAccessor( cmd.Parameters );
|
|
|
|
parmacc.SetShort( "@entityTypeID", (short)entityType );
|
|
|
|
|
|
//
|
|
// Check for a tModel key vs other
|
|
//
|
|
if( key.ToLower().StartsWith( "uuid:" ) )
|
|
{
|
|
if( entityType != EntityType.TModel )
|
|
{
|
|
//throw new UDDIException( ErrorType.E_invalidKeyPassed, "Only TModel Keys can start with uuid:" );
|
|
throw new UDDIException( ErrorType.E_invalidKeyPassed, "UDDI_ERROR_INVALID_TMODEL_KEY" );
|
|
}
|
|
|
|
parmacc.SetGuidFromKey( "@entityKey", key );
|
|
}
|
|
else
|
|
{
|
|
if( EntityType.TModel == entityType )
|
|
{
|
|
//throw new UDDIException( ErrorType.E_invalidKeyPassed, "Only TModel Keys can start with uuid:" );
|
|
throw new UDDIException( ErrorType.E_invalidKeyPassed, "UDDI_ERROR_INVALID_TMODEL_KEY" );
|
|
}
|
|
try
|
|
{
|
|
parmacc.SetGuidFromString( "@entityKey", key );
|
|
}
|
|
catch( Exception )
|
|
{
|
|
//throw new UDDIException( ErrorType.E_invalidKeyPassed, "Key has invalid format" );
|
|
throw new UDDIException( ErrorType.E_invalidKeyPassed, "UDDI_ERROR_INVALID_KEY_FORMAT" );
|
|
}
|
|
}
|
|
|
|
cmd.ExecuteScalar();
|
|
}
|
|
}
|
|
|
|
public class UTF8EncodedStringWriter : StringWriter
|
|
{
|
|
private System.Text.UTF8Encoding utfEncoding;
|
|
|
|
public UTF8EncodedStringWriter() : base()
|
|
{
|
|
utfEncoding = new UTF8Encoding();
|
|
}
|
|
|
|
public override Encoding Encoding
|
|
{
|
|
get
|
|
{
|
|
return utfEncoding;
|
|
}
|
|
}
|
|
}
|
|
}
|