Webman-Notes: Difference between revisions
(Adding category) |
(Added C# preauth app) |
||
Line 15: | Line 15: | ||
[[Category:Community Sandbox]] | [[Category:Community Sandbox]] | ||
= C# Preauth app = | |||
<pre> | |||
using System; | |||
using System.Text; | |||
using System.Diagnostics; | |||
using System.Collections.Generic; | |||
using System.Windows.Forms; | |||
using System.Security.Principal; | |||
using System.Security.Cryptography; | |||
using System.IO; | |||
using Ini; | |||
namespace Zimbar{ | |||
static class Program{ | |||
// File names of INI files | |||
public static String SETTINGS = @"P:\bbzimbra\bbzimbra.ini"; | |||
public static String ROOMCTL = @"P:\bbzimbra\roomctl.ini"; | |||
static bool CheckPermission() { | |||
string computername = System.Environment.MachineName.ToString().ToLower(); | |||
//computername = "studycentre-010"; | |||
IniFile roomini = new IniFile(ROOMCTL); | |||
// Find out if the computer name is a controller (a key in the 'controllers' section. | |||
string roomFromCtl = roomini.IniReadValue("controllers", computername, ""); | |||
//MessageBox.Show("roomfromctl: " + roomFromCtl); | |||
// Now check if we are a controller machine or not | |||
if (roomFromCtl == "") { | |||
// Computer is not a controller - so we must check if the email for this room is enabled or not | |||
//MessageBox.Show("You are not a controller"); | |||
// So first we need to work out which room we are in (first part of machine name before hyphen) | |||
if (computername.IndexOf("-") == -1) { | |||
// There was no hyphen in the name - what's wrong here? Don't know. | |||
return true; | |||
} else { | |||
// Ok - there's a hyphen. We can find out the room name now! | |||
string roomname = computername.Substring(0, computername.IndexOf("-")); | |||
//MessageBox.Show("Based on machine name, you are in room '" + roomname + "'."); | |||
// Now we got room name we need to find out if there is a key in the INI file | |||
// - if yes, then we return true/false depending on room status | |||
// - if no key for room, then we run anyway (will be admin/ereg ...) | |||
string roomStatus = roomini.IniReadValue("status", roomname, ""); | |||
//MessageBox.Show("The email status for your room is: " + roomStatus); | |||
switch(roomStatus){ | |||
case "": return true; | |||
case "on": return true; | |||
case "off": return false; | |||
default: return true; | |||
} | |||
} | |||
} else { | |||
// Computer is a controller - so we just permit the application to run. | |||
return true; | |||
} | |||
//return true; | |||
} | |||
/// <summary> | |||
/// The main entry point for the application. | |||
/// </summary> | |||
[STAThread] | |||
static void Main(){ | |||
Application.SetCompatibleTextRenderingDefault(false); | |||
Process[] pname = Process.GetProcessesByName("prism"); | |||
if (pname.Length != 0) { | |||
MessageBox.Show("The Email program is already running. If it has not yet loaded, please be patient.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Warning); | |||
System.Environment.Exit(0); | |||
} | |||
// Check command line for custom settings ini | |||
if (Environment.CommandLine.Contains("debug")) { | |||
SETTINGS = @"P:\bbzimbra\bbzimbra.debug.ini"; | |||
} else { | |||
// If no INI file parameter, default settings file is ... | |||
SETTINGS = @"P:\bbzimbra\bbzimbra.ini"; | |||
} | |||
// Check for existance of required files | |||
if(!System.IO.File.Exists(SETTINGS)){ | |||
MessageBox.Show("Settings file '" + SETTINGS + "' not found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
if (!System.IO.File.Exists(ROOMCTL)) { | |||
MessageBox.Show("Control file '" + ROOMCTL + "' not found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
// Check if email is permitted at this time based on the INI file values, quit if not. | |||
if (!CheckPermission()) { | |||
MessageBox.Show("You are not permitted to use Email at this time.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); | |||
System.Environment.Exit(0); | |||
} | |||
// Get settings from INI file | |||
IniFile ini = new IniFile(SETTINGS); | |||
string zimpreauthkey = "MY-PREAUTH-KEY"; | |||
string zimdomain = ini.IniReadValue("zimbra", "domain", ""); | |||
string zimhost = ini.IniReadValue("zimbra", "host", ""); | |||
string prismpath = ini.IniReadValue("prism", "path", ""); | |||
string prismapppath = ini.IniReadValue("prism", "apppath", ""); | |||
//string prismappname = ini.IniReadValue("prism", "appname", ""); | |||
string prismprofile = ini.IniReadValue("prism", "profile", ""); | |||
// Some checks | |||
/* if (zimpreauthkey == ""){ | |||
MessageBox.Show("No authentication key found."); | |||
System.Environment.Exit(0); | |||
} */ | |||
if (zimdomain == ""){ | |||
MessageBox.Show("No domain name key found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
if (zimhost == ""){ | |||
MessageBox.Show("No hostname key found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
if (System.IO.Directory.Exists(prismpath) == false){ | |||
MessageBox.Show("Prism application path does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
if (System.IO.File.Exists(prismpath + @"\prism.exe") == false){ | |||
MessageBox.Show("Prism executable does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
if (System.IO.Directory.Exists(prismprofile) == false) { | |||
MessageBox.Show("Prism profile path does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
System.Environment.Exit(0); | |||
} | |||
// Get username and remove logon domain part | |||
String username = WindowsIdentity.GetCurrent().Name; | |||
username = username.Substring(username.IndexOf('\\')+1); | |||
// Set the email address as the username at the domain | |||
String email = username + "@" + zimdomain; | |||
// Now get date and convert to timestamp | |||
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1); | |||
string timestamp = string.Format( | |||
"{0}", | |||
(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).Ticks / 10000 | |||
); | |||
// Expiration is 0 | |||
string expires = "0"; | |||
// Compose the auth string | |||
string authstr = email + "|name|"+expires+"|" + timestamp; | |||
// HMAC things | |||
// First get the zimbra authkey into the key variable | |||
byte[] key = System.Text.Encoding.UTF8.GetBytes(zimpreauthkey); | |||
// Now put our data string into the data variable | |||
byte[] data = System.Text.Encoding.UTF8.GetBytes(authstr); | |||
HMACSHA1 hmac = new HMACSHA1(key); | |||
byte[] result = hmac.ComputeHash(data); | |||
// Now we got the result in format AA-BB-CC... remove the hyphens and lowercase it | |||
string hex = System.BitConverter.ToString(result); | |||
hex = hex.ToLower(); | |||
hex = hex.Replace("-", ""); | |||
// Format of URL to log in with | |||
string urlformat = "http://{0}/service/preauth?account={1}&by=name×tamp={2}&expires={3}&preauth={4}"; | |||
string url = String.Format(urlformat, zimhost, email, timestamp, expires, hex); | |||
string exec = prismpath + @"\prism.exe"; | |||
string args = @"-webapp ""{0}"" -override ""{0}\override.ini"" -profile ""{1}"" -uri ""{2}"" "; | |||
args = string.Format(args, prismapppath, prismprofile, url); | |||
// Configure the process to launch | |||
ProcessStartInfo ps = new ProcessStartInfo(); | |||
ps.WindowStyle = ProcessWindowStyle.Maximized; | |||
ps.FileName = exec; | |||
ps.WorkingDirectory = prismpath; | |||
ps.Arguments = args; | |||
// Launch process | |||
System.Diagnostics.Process prism = Process.Start(ps); | |||
} | |||
} | |||
} | |||
</pre> |
Revision as of 08:11, 24 April 2009
Sharing
(r)ead - search, view overviews and items
(w)rite - edit drafts/contacts/notes, set flags
action (x) - workflow actions, like accepting appoitnments
(i)nsert - copy/add to directory, create subfolders
(d)elete - delete items and subfolders, set \Deleted flag
(a)dminister - delegate admin and change permissions
C# Preauth app
using System; using System.Text; using System.Diagnostics; using System.Collections.Generic; using System.Windows.Forms; using System.Security.Principal; using System.Security.Cryptography; using System.IO; using Ini; namespace Zimbar{ static class Program{ // File names of INI files public static String SETTINGS = @"P:\bbzimbra\bbzimbra.ini"; public static String ROOMCTL = @"P:\bbzimbra\roomctl.ini"; static bool CheckPermission() { string computername = System.Environment.MachineName.ToString().ToLower(); //computername = "studycentre-010"; IniFile roomini = new IniFile(ROOMCTL); // Find out if the computer name is a controller (a key in the 'controllers' section. string roomFromCtl = roomini.IniReadValue("controllers", computername, ""); //MessageBox.Show("roomfromctl: " + roomFromCtl); // Now check if we are a controller machine or not if (roomFromCtl == "") { // Computer is not a controller - so we must check if the email for this room is enabled or not //MessageBox.Show("You are not a controller"); // So first we need to work out which room we are in (first part of machine name before hyphen) if (computername.IndexOf("-") == -1) { // There was no hyphen in the name - what's wrong here? Don't know. return true; } else { // Ok - there's a hyphen. We can find out the room name now! string roomname = computername.Substring(0, computername.IndexOf("-")); //MessageBox.Show("Based on machine name, you are in room '" + roomname + "'."); // Now we got room name we need to find out if there is a key in the INI file // - if yes, then we return true/false depending on room status // - if no key for room, then we run anyway (will be admin/ereg ...) string roomStatus = roomini.IniReadValue("status", roomname, ""); //MessageBox.Show("The email status for your room is: " + roomStatus); switch(roomStatus){ case "": return true; case "on": return true; case "off": return false; default: return true; } } } else { // Computer is a controller - so we just permit the application to run. return true; } //return true; } /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(){ Application.SetCompatibleTextRenderingDefault(false); Process[] pname = Process.GetProcessesByName("prism"); if (pname.Length != 0) { MessageBox.Show("The Email program is already running. If it has not yet loaded, please be patient.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Warning); System.Environment.Exit(0); } // Check command line for custom settings ini if (Environment.CommandLine.Contains("debug")) { SETTINGS = @"P:\bbzimbra\bbzimbra.debug.ini"; } else { // If no INI file parameter, default settings file is ... SETTINGS = @"P:\bbzimbra\bbzimbra.ini"; } // Check for existance of required files if(!System.IO.File.Exists(SETTINGS)){ MessageBox.Show("Settings file '" + SETTINGS + "' not found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } if (!System.IO.File.Exists(ROOMCTL)) { MessageBox.Show("Control file '" + ROOMCTL + "' not found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } // Check if email is permitted at this time based on the INI file values, quit if not. if (!CheckPermission()) { MessageBox.Show("You are not permitted to use Email at this time.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); System.Environment.Exit(0); } // Get settings from INI file IniFile ini = new IniFile(SETTINGS); string zimpreauthkey = "MY-PREAUTH-KEY"; string zimdomain = ini.IniReadValue("zimbra", "domain", ""); string zimhost = ini.IniReadValue("zimbra", "host", ""); string prismpath = ini.IniReadValue("prism", "path", ""); string prismapppath = ini.IniReadValue("prism", "apppath", ""); //string prismappname = ini.IniReadValue("prism", "appname", ""); string prismprofile = ini.IniReadValue("prism", "profile", ""); // Some checks /* if (zimpreauthkey == ""){ MessageBox.Show("No authentication key found."); System.Environment.Exit(0); } */ if (zimdomain == ""){ MessageBox.Show("No domain name key found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } if (zimhost == ""){ MessageBox.Show("No hostname key found.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } if (System.IO.Directory.Exists(prismpath) == false){ MessageBox.Show("Prism application path does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } if (System.IO.File.Exists(prismpath + @"\prism.exe") == false){ MessageBox.Show("Prism executable does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } if (System.IO.Directory.Exists(prismprofile) == false) { MessageBox.Show("Prism profile path does not exist.", "Email", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Environment.Exit(0); } // Get username and remove logon domain part String username = WindowsIdentity.GetCurrent().Name; username = username.Substring(username.IndexOf('\\')+1); // Set the email address as the username at the domain String email = username + "@" + zimdomain; // Now get date and convert to timestamp TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1); string timestamp = string.Format( "{0}", (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).Ticks / 10000 ); // Expiration is 0 string expires = "0"; // Compose the auth string string authstr = email + "|name|"+expires+"|" + timestamp; // HMAC things // First get the zimbra authkey into the key variable byte[] key = System.Text.Encoding.UTF8.GetBytes(zimpreauthkey); // Now put our data string into the data variable byte[] data = System.Text.Encoding.UTF8.GetBytes(authstr); HMACSHA1 hmac = new HMACSHA1(key); byte[] result = hmac.ComputeHash(data); // Now we got the result in format AA-BB-CC... remove the hyphens and lowercase it string hex = System.BitConverter.ToString(result); hex = hex.ToLower(); hex = hex.Replace("-", ""); // Format of URL to log in with string urlformat = "http://{0}/service/preauth?account={1}&by=name×tamp={2}&expires={3}&preauth={4}"; string url = String.Format(urlformat, zimhost, email, timestamp, expires, hex); string exec = prismpath + @"\prism.exe"; string args = @"-webapp ""{0}"" -override ""{0}\override.ini"" -profile ""{1}"" -uri ""{2}"" "; args = string.Format(args, prismapppath, prismprofile, url); // Configure the process to launch ProcessStartInfo ps = new ProcessStartInfo(); ps.WindowStyle = ProcessWindowStyle.Maximized; ps.FileName = exec; ps.WorkingDirectory = prismpath; ps.Arguments = args; // Launch process System.Diagnostics.Process prism = Process.Start(ps); } } }