using System; using System.IO; using System.Web; using System.Data; using System.Data.SqlClient; using System.Collections; using System.Web.Services; using System.Xml.Serialization; using System.Security.Principal; using System.Web.Security; using System.Web.Services.Protocols; using UDDI.API; using UDDI; using UDDI.Diagnostics; using UDDI.API.Authentication; using UDDI.API.Binding; using UDDI.API.Service; using UDDI.API.Business; using UDDI.API.ServiceType; namespace UDDI.API { /// **************************************************************** /// class PublishMessages /// ---------------------------------------------------------------- /// /// This is the web service class that contains the UDDI /// publish methods. /// /// **************************************************************** /// [SoapDocumentService( ParameterStyle=SoapParameterStyle.Bare, RoutingStyle=SoapServiceRoutingStyle.RequestElement )] [WebService( Namespace=UDDI.API.Constants.Namespace )] public class PublishMessages { /// **************************************************************** /// public AddPublisherAssertions /// ---------------------------------------------------------------- /// /// Web method for adding publisher assertions. Users are /// authenticated and the message is processed as part of a /// transaction. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the add_publisherAssertions /// message. /// /// ---------------------------------------------------------------- /// /// Returns a disposition report indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action = "\"\"", RequestElementName = "add_publisherAssertions" )] [UDDIExtension( authenticate = true, transaction = true, https = true, messageType = "add_publisherAssertions" )] public DispositionReport AddPublisherAssertions( AddPublisherAssertions message ) { Debug.Enter(); // // Create a disposition report indicating success // DispositionReport report = new DispositionReport(); try { // // Add the publisher assertions. // message.Save(); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return report; } /// **************************************************************** /// public DeleteBinding /// ---------------------------------------------------------------- /// /// Web method for removing a set of bindingTemplates from the UDDI registry. /// Users are authenticated and the message is processed as part of a /// transaction. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the delete_binding message. /// /// ---------------------------------------------------------------- /// /// Returns a dispositionReport indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="delete_binding")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="delete_binding" )] public DispositionReport DeleteBinding( DeleteBinding dbind ) { Debug.Enter(); // // Create dispositionReport indicating success // DispositionReport dr = new DispositionReport(); try { // // Delete the binding // dbind.Delete(); } catch( Exception e ) { DispositionReport.Throw( e ); } return dr; } /// **************************************************************** /// public DeleteBusiness /// ---------------------------------------------------------------- /// /// Web method for removing a set of businessEntities from the UDDI registry. /// Users are authenticated and the message is processed as part of a /// transaction. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the delete_business message. /// /// ---------------------------------------------------------------- /// /// Returns a dispositionReport indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="delete_business")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="delete_business" )] public DispositionReport DeleteBusiness( DeleteBusiness dbus ) { Debug.Enter(); DispositionReport dr = new DispositionReport(); try { // // Delete the business // dbus.Delete(); } catch( Exception e ) { DispositionReport.Throw( e ); } return dr; } /// **************************************************************** /// public class DeletePublisherAssertions /// ---------------------------------------------------------------- /// /// /// **************************************************************** /// [WebMethod] [SoapDocumentMethod( Action = "\"\"", RequestElementName = "delete_publisherAssertions" )] [UDDIExtension( authenticate = true, transaction = true, https = true, messageType = "delete_publisherAssertions" )] public DispositionReport DeletePublisherAssertions( DeletePublisherAssertions message ) { Debug.Enter(); DispositionReport report = new DispositionReport(); try { message.Delete(); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return report; } /// **************************************************************** /// public DeleteService /// ---------------------------------------------------------------- /// /// Web method for removing a set of businessServices from the UDDI registry. /// Users are authenticated and the message is processed as part of a /// transaction. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the delete_service message. /// /// ---------------------------------------------------------------- /// /// Returns a dispositionReport indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="delete_service")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="delete_service" )] public DispositionReport DeleteService( DeleteService ds ) { Debug.Enter(); DispositionReport dr = new DispositionReport(); try { // // Delete the service // ds.Delete(); } catch( Exception e ) { DispositionReport.Throw( e ); } return dr; } /// **************************************************************** /// public DeleteTModel /// ---------------------------------------------------------------- /// /// Web method for removing a set of tModels from the UDDI registry. /// Users are authenticated and the message is processed as part of a /// transaction. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the delete_tModel message. /// /// ---------------------------------------------------------------- /// /// Returns a dispositionReport indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="delete_tModel")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="delete_tModel" )] public DispositionReport DeleteTModel( DeleteTModel dtm ) { Debug.Enter(); DispositionReport dr = new DispositionReport(); try { // // Delete the tModel // dtm.Delete(); } catch( Exception e ) { DispositionReport.Throw( e ); } return dr; } /// **************************************************************** /// public DiscardAuthToken /// ---------------------------------------------------------------- /// /// This optional message is used to deactivate an authentication token /// that was obtained by a call to get_authToken. /// /// ---------------------------------------------------------------- /// /// A properly formed instance of the discard_authToken message. /// /// ---------------------------------------------------------------- /// /// Returns a dispositionReport indicating success or failure. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="discard_authToken")] [UDDIExtension( https=true, messageType="discard_authToken" )] public DispositionReport DiscardAuthToken( DiscardAuthToken dat ) { Debug.Enter(); DispositionReport dr = new DispositionReport(); try { if( ( Config.GetInt( "Security.AuthenticationMode" ) == (int) AuthenticationMode.Passport ) ) { PassportAuthenticator authenticator = new PassportAuthenticator(); authenticator.Authenticate( dat.AuthInfo, Config.GetInt( "Security.TimeOut" ) ); // // Call to the database to update the user status to logged off. // SqlCommand cmd = new SqlCommand( "ADM_setPublisherStatus", ConnectionManager.GetConnection() ); cmd.Transaction = ConnectionManager.GetTransaction(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add( new SqlParameter( "@PUID", SqlDbType.NVarChar, UDDI.Constants.Lengths.UserID ) ).Direction = ParameterDirection.Input; cmd.Parameters.Add( new SqlParameter( "@publisherStatus", SqlDbType.NVarChar, UDDI.Constants.Lengths.PublisherStatus ) ).Direction = ParameterDirection.Input; SqlParameterAccessor paramacc = new SqlParameterAccessor( cmd.Parameters ); paramacc.SetString( "@PUID", Context.User.ID ); paramacc.SetString( "@publisherStatus", "loggedOut"); cmd.ExecuteNonQuery(); } } catch( Exception e ) { DispositionReport.Throw( e ); } return dr; } [WebMethod] [SoapDocumentMethod( Action = "\"\"", RequestElementName = "get_assertionStatusReport" )] [UDDIExtension( authenticate = true, https = true, messageType = "get_assertionStatusReport" )] public AssertionStatusReport GetAssertionStatusReport( GetAssertionStatusReport message ) { Debug.Enter(); AssertionStatusReport statusReport = new AssertionStatusReport(); try { statusReport.Get( message.CompletionStatus ); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return statusReport; } [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="get_authToken")] [UDDIExtension( https=true, messageType="get_authToken" )] public AuthToken GetAuthToken( GetAuthToken gat ) { Debug.Enter(); AuthToken at = new AuthToken(); try { // // XX-SECURITY: Review the value here in the case where we use // XX-this with a web.config with Authentication set to None or Passport // // // NOW: We now Get a Generic Identity. If the AuthenticationMode is AuthenticationMode.Passport (8), // we make sure the Identity is a PassportIdentity, then we authenticate. If AuthenticationMode // is Not set to AuthenticationMode.Passport, then process it as a WindowsIdentity. // // IIdentity identity = HttpContext.Current.User.Identity; int mode = Config.GetInt( "Security.AuthenticationMode", (int) AuthenticationMode.Both ); if( ( (int) AuthenticationMode.Passport ) == mode ) { if( identity is PassportIdentity ) { Debug.Write( SeverityType.Info, CategoryType.Soap, "Generating credentials for Passport based authentication Identity is " + gat.UserID ); PassportAuthenticator pa = new PassportAuthenticator(); // // Get a Passport ticket for this user. // if( !pa.GetAuthenticationInfo( gat.UserID, gat.Cred, out at.AuthInfo ) ) { // throw new UDDIException( ErrorType.E_unknownUser, "User failed authentication." ) ; throw new UDDIException( ErrorType.E_unknownUser, "USER_FAILED_AUTHENTICATION" ) ; } // // We need to extract the PUID from the ticket and put it into our Context.UserInfo.ID; a // successfull call to Authenticate will do all of this. // if( !pa.Authenticate( at.AuthInfo, UDDI.Constants.Passport.TimeWindow ) ) { throw new UDDIException( ErrorType.E_unknownUser, "UDDI_ERROR_USER_FAILED_AUTHENTICATION" ) ; } // // Make sure this Passport user has registered with our UDDI site as a publisher. // if( !Context.User.IsVerified ) { // throw new UDDIException( ErrorType.E_unknownUser, "Not a valid publisher." ) ; throw new UDDIException( ErrorType.E_unknownUser, "UDDI_ERROR_NOT_A_VALID_PUBLISHER" ) ; } } else { #if never throw new UDDIException( ErrorType.E_fatalError, "CONFIGURATION ERROR: Passport Identity Expected. \r\n"+ "You are currently running in Passport Authentication Mode. \r\n"+ "Check your web.config for the entry and try again." ) ; #endif throw new UDDIException( ErrorType.E_fatalError, "UDDI_ERROR_PASSPORT_CONFIGURATION_ERROR" ); } } // // SECURITY: Check to make sure the password is blank too // else if( !((WindowsIdentity)identity).IsAnonymous && ( ( mode & (int) AuthenticationMode.Windows ) != 0 ) && Utility.StringEmpty( gat.UserID ) ) { Debug.Write( SeverityType.Info, CategoryType.Soap, "Generating credentials for Windows based authentication Identity is " + identity.Name ); WindowsAuthenticator wa = new WindowsAuthenticator(); wa.GetAuthenticationInfo( gat.UserID, gat.Cred, out at.AuthInfo ); } else if( ( mode & (int) AuthenticationMode.Uddi ) != 0 ) { Debug.Write( SeverityType.Info, CategoryType.Soap, "Generating credentials for UDDI based authentication" ); UDDIAuthenticator ua = new UDDIAuthenticator(); ua.GetAuthenticationInfo( gat.UserID, gat.Cred, out at.AuthInfo ); } else { // throw new UDDIException( UDDI.ErrorType.E_unsupported, //"The UDDI server is not configured to support the requested form of authentication." ); throw new UDDIException( UDDI.ErrorType.E_unsupported, "UDDI_ERROR_AUTHENTICATION_CONFIGURATION_ERROR" ); } Debug.Write( SeverityType.Info, CategoryType.Soap, "Windows Identity is " + WindowsIdentity.GetCurrent().Name ); Debug.Write( SeverityType.Info, CategoryType.Soap, "Thread Identity is " + System.Threading.Thread.CurrentPrincipal.Identity.Name ); Debug.Write( SeverityType.Info, CategoryType.Soap, "HttpContext Identity is " + identity.Name ); // // Check to make sure the authenticated user has publisher credentials // #if never Debug.Verify( Context.User.IsPublisher, "The user account " + Context.User.ID + " does not have publisher credentials", UDDI.ErrorType.E_fatalError ); #endif Debug.Verify( Context.User.IsPublisher, "UDDI_ERROR_NO_PUBLISHER_CREDENTIALS", UDDI.ErrorType.E_fatalError, Context.User.ID ); Debug.Write( SeverityType.Info, CategoryType.Authorization, "Authenticated user (userid = " + gat.UserID + " )" ); } catch( Exception e ) { DispositionReport.Throw( e ); } return at; } /// **************************************************************** /// public class GetPublisherAssertions /// ---------------------------------------------------------------- /// /// /// **************************************************************** /// [WebMethod] [SoapDocumentMethod( Action = "\"\"", RequestElementName = "get_publisherAssertions" )] [UDDIExtension( authenticate = true, https = true, messageType = "get_publisherAssertions" )] public PublisherAssertionDetail GetPublisherAssertions( GetPublisherAssertions message ) { Debug.Enter(); PublisherAssertionDetail detail = new PublisherAssertionDetail(); try { detail.Get(); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return detail; } /// **************************************************************** /// public class GetRegisteredInfo /// ---------------------------------------------------------------- /// /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action="\"\"", RequestElementName="get_registeredInfo" )] [UDDIExtension( authenticate=true, https=true, messageType="get_registeredInfo")] public RegisteredInfo GetRegisteredInfo( GetRegisteredInfo gri ) { Debug.Enter(); RegisteredInfo ri = new RegisteredInfo(); try { ri.Get(); } catch( Exception e ) { DispositionReport.Throw( e ); } return ri; } [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="save_binding")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="save_binding")] public BindingDetail SaveBinding( SaveBinding sb ) { Debug.Enter(); BindingDetail bd = new BindingDetail(); try { sb.Save(); bd.BindingTemplates = sb.BindingTemplates; } catch( Exception e ) { DispositionReport.Throw( e ); } return bd; } [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="save_business")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="save_business" )] public BusinessDetail SaveBusiness( SaveBusiness sb ) { Debug.Enter(); BusinessDetail bd = new BusinessDetail(); try { sb.Save(); bd.BusinessEntities = sb.BusinessEntities; } catch( Exception e ) { DispositionReport.Throw( e ); } return bd; } [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="save_service")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="save_service" )] public ServiceDetail SaveService( SaveService ss ) { Debug.Enter(); ServiceDetail sd = new ServiceDetail(); try { ss.Save(); sd.BusinessServices = ss.BusinessServices; } catch( Exception e ) { DispositionReport.Throw( e ); } return sd; } [WebMethod, SoapDocumentMethod(Action="\"\"", RequestElementName="save_tModel")] [UDDIExtension( authenticate=true, transaction=true, https=true, messageType="save_tModel" )] public TModelDetail SaveTModel( UDDI.API.ServiceType.SaveTModel stm ) { Debug.Enter(); TModelDetail tmd = new TModelDetail(); try { stm.Save(); tmd.TModels = stm.TModels; } catch( Exception e ) { DispositionReport.Throw( e ); } return tmd; } [WebMethod()] [SoapDocumentMethod( Action = "\"\"", RequestElementName = "set_publisherAssertions" )] [UDDIExtension( authenticate = true, transaction = true, https = true, messageType = "set_publisherAssertions" )] public PublisherAssertionDetail SetPublisherAssertions( SetPublisherAssertions message ) { Debug.Enter(); PublisherAssertionDetail detail = new PublisherAssertionDetail(); try { detail = message.Set(); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return detail; } } }