/* Copyright 2009 Fog Creek Software, Inc. */ using System; using System.Collections.Generic; using System.Text; using System.Web; /* FogBugz namespaces-- make sure you add the neccesary assembly references to * the following DLL files contained in C:\Program Files\FogBugz\Website\bin\ * FogBugz.dll, FogCreek.Plugins.dll, FogCreek.Plugins.InterfaceEvents.dll */ using FogCreek.FogBugz.Plugins; using FogCreek.FogBugz.Plugins.Api; using FogCreek.FogBugz.Plugins.Entity; using FogCreek.FogBugz.Plugins.Interfaces; using FogCreek.FogBugz; using FogCreek.FogBugz.UI; using FogCreek.FogBugz.UI.Dialog; namespace FogCreek.Plugins.AssignToMe { public class AssignToMe : Plugin, IPluginBugDisplay, IPluginRawPageDisplay { public AssignToMe(CPluginApi api) : base(api) { } #region IPluginBugDisplay Members public CBugDisplayDialogItem[] BugDisplayEditLeft(CBug[] rgbug, BugEditMode nMode, bool fPublic) { return null; } public CBugDisplayDialogItem[] BugDisplayEditTop(CBug[] rgbug, BugEditMode nMode, bool fPublic) { return null; } public CBugDisplayDialogItem[] BugDisplayViewLeft(CBug[] rgbug, bool fPublic) { return null; } public CBugDisplayDialogItem[] BugDisplayViewTop(CBug[] rgbug, bool fPublic) { /* If there was an error passed in the URL or the redirect from * the raw page, display it using the Notifications API */ if ((api.Request[api.AddPluginPrefix("sError")] != null) && (api.Request[api.AddPluginPrefix("actionToken")] != null) && api.Security.ValidateActionToken(api.Request[api.AddPluginPrefix("actionToken")].ToString())) { api.Notifications.AddError(api.Request[api.AddPluginPrefix("sError")].ToString()); } StringBuilder sb = new StringBuilder(); foreach (CBug bug in rgbug) { /* if any bug in the list is not editable by the current user, * don't show the assign to me button */ if (!bug.IsWritable) return null; sb.Append(bug.ixBug.ToString()); sb.Append(","); } string sBugList = sb.ToString().Substring(0, sb.Length - 1); return new CBugDisplayDialogItem[] { /* include a plugin security API action token to prevent cross-site * request forgery attacks */ new CBugDisplayDialogItem("assigntome", string.Format(@"Assign To Me", api.Url.PluginRawPageUrl(), api.AddPluginPrefix("sBugList"), sBugList, api.AddPluginPrefix("actionToken"), api.Security.GetActionToken() ) ) }; } #endregion #region IPluginRawPageDisplay Members public string RawPageDisplay() { string[] rgSixBug = null; string sResponse = string.Empty; int ixPersonCurrent = api.Person.GetCurrentPerson().ixPerson; int ixBug = 0; string sBugList = ""; string sError = ""; if ((sBugList = api.Request[api.AddPluginPrefix("sBugList")]) != null) { /* If the request did not include a valid action token, do not * edit any cases and redirect with an error message to display */ if ((api.Request[api.AddPluginPrefix("actionToken")] == null) || !api.Security.ValidateActionToken(api.Request[api.AddPluginPrefix("actionToken")].ToString())) { sError = string.Format("{0}={1}", api.AddPluginPrefix("sError"), HttpUtility.UrlEncode("Assign To Me: Cases not assigned because action token was invalid or missing.") ); } else { rgSixBug = api.Request[api.AddPluginPrefix("sBugList")].ToString().Split( new string[] { "," }, StringSplitOptions.None ); foreach (string sixBug in rgSixBug) { if (int.TryParse(sixBug, out ixBug)) { CBug bug = api.Bug.GetBug(ixBug); /* Only edit the case if the current user has * permission to do so */ if (bug.ixPersonAssignedTo != ixPersonCurrent && bug.IsWritable) { bug.ixPersonAssignedTo = ixPersonCurrent; bug.Commit(); } } } } } return sResponse = string.Format(@"
back to case view ", sBugList, api.AddPluginPrefix("actionToken"), api.Security.GetActionToken(), sError); } public PermissionLevel RawPageVisibility() { return PermissionLevel.Normal; } #endregion } }