//-----------------------------------------------------------------------
//
// Copyright (c) Andrew Arnott. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenIdOfflineProvider {
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.Provider;
using log4net;
using log4net.Appender;
using log4net.Core;
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window, IDisposable {
///
/// The OpenID Provider host object.
///
private HostedProvider hostedProvider = new HostedProvider();
///
/// The logger the application may use.
///
private ILog logger = log4net.LogManager.GetLogger(typeof(MainWindow));
///
/// Initializes a new instance of the class.
///
public MainWindow() {
this.InitializeComponent();
this.hostedProvider.ProcessRequest = this.ProcessRequest;
TextWriterAppender boxLogger = log4net.LogManager.GetRepository().GetAppenders().OfType().FirstOrDefault(a => a.Name == "TextBoxAppender");
if (boxLogger != null) {
boxLogger.Writer = new TextBoxTextWriter(logBox);
}
this.startProvider();
}
#region IDisposable Members
///
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
///
public void Dispose() {
this.Dispose(true);
}
///
/// Releases unmanaged and - optionally - managed resources
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
protected virtual void Dispose(bool disposing) {
if (disposing) {
var host = this.hostedProvider as IDisposable;
if (host != null) {
host.Dispose();
}
this.hostedProvider = null;
}
}
#endregion
///
/// Raises the event.
///
/// The instance containing the event data.
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) {
this.stopProvider();
base.OnClosing(e);
}
///
/// Processes an incoming request at the OpenID Provider endpoint.
///
/// The request info.
/// The response.
private void ProcessRequest(HttpRequestInfo requestInfo, HttpListenerResponse response) {
IRequest request = this.hostedProvider.Provider.GetRequest(requestInfo);
if (request == null) {
App.Logger.Error("A request came in that did not carry an OpenID message.");
response.ContentType = "text/html";
response.StatusCode = (int)HttpStatusCode.BadRequest;
using (StreamWriter sw = new StreamWriter(response.OutputStream)) {
sw.WriteLine("This is an OpenID Provider endpoint.");
}
return;
}
this.Dispatcher.Invoke((Action)delegate {
if (!request.IsResponseReady) {
var authRequest = request as IAuthenticationRequest;
if (authRequest != null) {
switch (checkidRequestList.SelectedIndex) {
case 0:
if (authRequest.IsDirectedIdentity) {
authRequest.ClaimedIdentifier = new Uri(this.hostedProvider.UserIdentityPageBase, "directedidentity");
authRequest.LocalIdentifier = authRequest.ClaimedIdentifier;
}
authRequest.IsAuthenticated = true;
break;
case 1:
authRequest.IsAuthenticated = false;
break;
case 2:
IntPtr oldForegroundWindow = NativeMethods.GetForegroundWindow();
bool stoleFocus = NativeMethods.SetForegroundWindow(this);
CheckIdWindow.ProcessAuthentication(this.hostedProvider, authRequest);
if (stoleFocus) {
NativeMethods.SetForegroundWindow(oldForegroundWindow);
}
break;
}
}
}
});
this.hostedProvider.Provider.PrepareResponse(request).Send(response);
}
///
/// Starts the provider.
///
private void startProvider() {
this.hostedProvider.StartProvider();
this.opIdentifierLabel.Content = this.hostedProvider.OPIdentifier;
}
///
/// Stops the provider.
///
private void stopProvider() {
this.hostedProvider.StopProvider();
this.opIdentifierLabel.Content = string.Empty;
}
///
/// Handles the MouseDown event of the opIdentifierLabel control.
///
/// The source of the event.
/// The instance containing the event data.
private void opIdentifierLabel_MouseDown(object sender, MouseButtonEventArgs e) {
Clipboard.SetText(opIdentifierLabel.Content.ToString());
}
}
}