Imports System.Security.Principal
Imports System.Configuration
Imports CSLA.Security
'''
'''
'''
Namespace Server
'''
''' This is the entry point for all queue requests from
''' the client via Remoting.
'''
Public Class BatchQueue
Inherits MarshalByRefObject
#Region " Public methods "
'''
''' Submits a batch entry to the queue.
'''
''' A reference to the batch entry.
Public Sub Submit(ByVal Entry As BatchEntry)
BatchQueueService.Enqueue(Entry)
End Sub
'''
''' Removes a holding or pending entry from the queue.
'''
''' A reference to the info object for the batch entry.
Public Sub Remove(ByVal Entry As BatchEntryInfo)
BatchQueueService.Dequeue(Entry)
End Sub
'''
''' Gets a list of the entries currently in the
''' batch queue.
'''
''' The requesting user's security credentials.
Public Function GetEntries(ByVal Principal As IPrincipal) As BatchEntries
SetPrincipal(Principal)
Dim entries As New BatchEntries()
BatchQueueService.LoadEntries(entries)
Return entries
End Function
#End Region
#Region " Security "
Private Function AUTHENTICATION() As String
Return ConfigurationSettings.AppSettings("Authentication")
End Function
Private Sub SetPrincipal(ByVal Principal As Object)
If AUTHENTICATION() = "Windows" Then
' when using integrated security, Principal must be Nothing
' and we need to set our policy to use the Windows principal
If Principal Is Nothing Then
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Exit Sub
Else
Throw New System.Security.SecurityException("No principal object should be passed to DataPortal when using Windows integrated security")
End If
End If
' we expect Principal to be of type BusinessPrincipal, but
' we can't enforce that since it causes a circular reference
' with the business library so instead we must use type Object
' for the parameter, so here we do a check on the type of the
' parameter
If Principal.ToString = "CSLA.Security.BusinessPrincipal" Then
' see if our current principal is
' different from the caller's principal
If Not ReferenceEquals(Principal, System.Threading.Thread.CurrentPrincipal) Then
' the caller had a different principal, so change ours to
' match the caller's so all our objects use the caller's
' security
System.Threading.Thread.CurrentPrincipal = CType(Principal, IPrincipal)
End If
Else
Throw New System.Security.SecurityException("Principal must be of type BusinessPrincipal, not " & Principal.ToString)
End If
End Sub
#End Region
End Class
End Namespace