public ActionResult SaveDocument(string projectCode, int projectId, int issueId, string documentId) { if (NoSettings()) { return(Redirect("~/configure")); } UserWidgetData <LucidChartUser> userData = GeminiContext.UserWidgetStore.Get <LucidChartUser>(CurrentUser.Entity.Id, Constants.AppId, Constants.ControlId); if (userData == null || userData.IsNew) { return(Authenticate(string.Empty, string.Empty, string.Format("apps/lucidchart/editdocument/{0}/{1}/{2}", projectCode, projectId, issueId))); } string name = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentDescription(documentId).Name; byte[] img = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentImage(documentId, 0, 500, false); byte[] thumb = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentImage(documentId, 0, 128, true); IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId); if (data == null || data.IsNew) { data = new IssueWidgetData <List <LucidChartData> >(); data.IssueId = issueId; data.AppId = Constants.AppId; data.ControlId = Constants.ControlId; data.Value = new List <LucidChartData>(); } LucidChartData doc = data.Value.Find(d => string.Compare(d.DocumentId, documentId, true) == 0); if (doc == null) { data.Value.Add(new LucidChartData() { DocumentId = documentId, Image = img, ThumnailImage = thumb, DocumentName = name }); } else { doc.DocumentName = name; doc.Image = img; doc.ThumnailImage = thumb; } GeminiContext.IssueWidgetStore.Save <List <LucidChartData> >(data.IssueId, data.AppId, data.ControlId, data.Value); string redirectURL = Countersoft.Gemini.Infrastructure.Helpers.NavigationHelper.GetIssuePageUrl(projectId, projectCode, issueId, UserContext.Card.Id, UserContext.Url); return(Redirect(redirectURL)); }
public ActionResult Image(string appid, string controlid, int issueid, string documentid) { IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueid, appid, controlid); LucidChartData image = data.Value.Find(d => string.Compare(d.DocumentId, documentid, true) == 0); return(File(image == null ? new byte[0] : image.Image, "image/png")); }
public ContentResult Save(int issueId) { IssueWidgetData <List <ChecklistData> > data = GeminiContext.IssueWidgetStore.Get <List <ChecklistData> >(issueId, AppGuid, AppControlGuid); int checkId = Request["checkId"].ToInt(0); bool checkedStatus = Request["checkedState"].ToBool(); bool isNewItem = false; if (data == null) { data = new IssueWidgetData <List <ChecklistData> >(); } if (data.Value == null) { data.Value = new List <ChecklistData>(); } ChecklistData item = data.Value.Find(i => i.CheckId == checkId); if (item == null) { item = new ChecklistData() { CheckId = checkId }; isNewItem = true; } if (item != null && item.CheckId == checkId) { item.Checked = checkedStatus; item.CheckedBy = CurrentUser.Fullname; item.CheckedDate = DateTime.UtcNow; if (!item.Checked) { item.CheckedBy = string.Empty; } } if (isNewItem) { data.Value.Add(item); } GeminiContext.IssueWidgetStore.Save(issueId, AppGuid, AppControlGuid, data.Value); return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, AppGuid, AppControlGuid), "")); }
public ActionResult DeleteDocument(string projectCode, int projectId, int issueId, string documentId) { if (NoSettings()) { return(Redirect("~/configure")); } IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId); if (data.Value.RemoveAll(c => string.Compare(c.DocumentId, documentId, true) == 0) > 0) { GeminiContext.IssueWidgetStore.Save <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId, data.Value); } return(JsonSuccess()); }
private IssueWidgetData <List <ChecklistData> > GetData(IssueDto issue) { IssueWidgetData <List <ChecklistData> > result = new IssueWidgetData <List <ChecklistData> >() { Value = new List <ChecklistData>(), AppId = AppGuid, IssueId = issue.Id, ControlId = AppControlGuid }; GlobalConfigurationWidgetData <ChecklistConfigDataModel> data = GeminiContext.GlobalConfigurationWidgetStore.Get <ChecklistConfigDataModel>(AppGuid); if (data == null || data.Value == null || data.Value.Data == null) { return(result); } var templateData = data.Value.Data.Find(t => t.TemplateId == issue.Project.TemplateId); if (templateData == null) { return(result); } IssueWidgetData <List <ChecklistData> > issueData = GeminiContext.IssueWidgetStore.Get <List <ChecklistData> >(issue.Id, AppGuid, AppControlGuid); foreach (var item in templateData.Items) { ChecklistData existingItem = issueData != null && issueData.Value != null && issueData.Value.Count > 0 ? issueData.Value.Find(s => s.CheckId == item.Id) : null; if (existingItem == null) { result.Value.Add(new ChecklistData { CheckId = item.Id, CheckTitle = item.Title }); } else { existingItem.CheckedDate = existingItem.CheckedDate.ToLocal(UserContext.User.TimeZone); existingItem.CheckTitle = item.Title; result.Value.Add(existingItem); } } result.Value.Sort((x, y) => x.CheckTitle.HasValue() ? x.CheckTitle.CompareTo(y.CheckTitle) : -1); return(result); }
public WidgetResult GetCommits(IssueDto args) { var commits = GeminiContext.CodeCommits.GetAll(args.Id); var data = new IssueWidgetData <List <SourceControlContainer> >(); data.Value = new List <SourceControlContainer>(); if (commits != null) { foreach (var commit in commits) { var dataHolder = new SourceControlContainer(); dataHolder.commits = commit.Data.FromJson <SourceControlCommit>(); if (commit.Provider == SourceControlProvider.GitHub) { dataHolder.commits.ExtraData = dataHolder.commits.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://github.com"); } dataHolder.Provider = commit.Provider; dataHolder.Fullname = commit.Fullname; dataHolder.Created = commit.Created.ToLocal(UserContext.User.TimeZone); dataHolder.Comment = commit.Comment; dataHolder.CommitBlock = ParseCommentBlock(commit.Comment, args, dataHolder.commits.RevisionId); data.Value.Add(dataHolder); } } data.IssueId = args.Id; WidgetResult result = new WidgetResult(); result.Markup = new WidgetMarkup("views//index.cshtml", data); result.Success = true; return(result); }
public override WidgetResult OnShow(ItemWidgetArguments args) { WidgetResult result = new WidgetResult(); IssueWidgetData <string> data = args.GeminiContext.IssueWidgetStore.Get <string>(args.Item.Id, AppId, ControlId); if (data == null || data.Value == null) { data = new IssueWidgetData <string>(); data.Value = "Default!"; data.IssueId = args.Item.Id; args.GeminiContext.IssueWidgetStore.Save(args.Item.Id, AppId, ControlId, data.Value); } result.Markup = new WidgetMarkup("views\\my-view.cshtml", data); result.Success = true; return(result); }
public override WidgetResult Show(IssueDto issue = null) { WidgetResult result = new WidgetResult(); IssueWidgetData <string> data = GeminiContext.IssueWidgetStore.Get <string>(issue.Id, AppGuid, AppControlGuid); if (data == null || data.Value == null) { data = new IssueWidgetData <string>(); data.Value = "Default!"; data.IssueId = issue.Id; GeminiContext.IssueWidgetStore.Save(issue.Id, AppGuid, AppControlGuid, data.Value); } result.Markup = new WidgetMarkup("views\\my-view.cshtml", data); result.Success = true; return(result); }
public override WidgetResult OnShow(ItemWidgetArguments args) { WidgetResult result = new WidgetResult(); IssueWidgetData<string> data = args.GeminiContext.IssueWidgetStore.Get<string>(args.Item.Id, AppId, ControlId); if (data == null || data.Value == null) { data = new IssueWidgetData<string>(); data.Value = "Default!"; data.IssueId = args.Item.Id; args.GeminiContext.IssueWidgetStore.Save(args.Item.Id, AppId, ControlId, data.Value); } result.Markup = new WidgetMarkup("views\\my-view.cshtml", data); result.Success = true; return result; }
public override WidgetResult Show(IssueDto issue = null) { WidgetResult result = new WidgetResult(); IssueWidgetData<string> data = GeminiContext.IssueWidgetStore.Get<string>(issue.Id, AppGuid, AppControlGuid); if (data == null || data.Value == null) { data = new IssueWidgetData<string>(); data.Value = "Default!"; data.IssueId = issue.Id; GeminiContext.IssueWidgetStore.Save(issue.Id, AppGuid, AppControlGuid, data.Value); } result.Markup = new WidgetMarkup("views\\my-view.cshtml", data); result.Success = true; return result; }
public override WidgetResult Show(IssueDto item) { WidgetResult result = new WidgetResult(); bool hasData = false; IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(item.Id, Constants.AppId, Constants.ControlId); if (data != null && data.Value.Count > 0) { hasData = true; } LucidChartModel model = new LucidChartModel { IssueId = item.Id.ToString(), AppId = Constants.AppId, ControlId = Constants.ControlId, ProjectId = item.Project.Id.ToString(), ProjectCode = item.Project.Code, HasData = hasData, LucidChartData = data, IsGeminiLicenseFree = GeminiApp.GeminiLicense.IsFree, IsGeminiTrial = GeminiApp.LicenseSummary.IsGeminiTrial(), Url = UserContext.Url.Substring(0, UserContext.Url.Length - 1) }; result.Success = true; result.Markup = new WidgetMarkup("views\\LucidChart.cshtml", model); return(result); }
public ActionResult Add(int issueId, string tfsId) { IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId); if (data == null || data.Value == null) { data = new IssueWidgetData <List <string> >(); data.AppId = Constants.AppId; data.ControlId = Constants.ControlId; data.IssueId = issueId; data.Value = new List <string>(); } data.Value.AddRange(tfsId.TrimEnd(',').Split(',')); GeminiContext.IssueWidgetStore.Save(data); return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, Constants.AppId, Constants.ControlId))); }
public ActionResult Delete(int issueId, string tfsRow) { IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId); issueId = data.IssueId; if (data == null || data.Value == null) { return(JsonError()); } var index = data.Value.FindIndex(d => string.Compare(d, tfsRow, StringComparison.InvariantCultureIgnoreCase) == 0); if (index == -1) { return(JsonError()); } data.Value.RemoveAt(index); GeminiContext.IssueWidgetStore.Save(data); return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, Constants.AppId, Constants.ControlId))); }
public ActionResult GetComment(int issueId) { IssueWidgetData <List <Comment> > data = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId); var formLinenumber = Request.Form["linenr"] ?? String.Empty; var formFileName = Request.Form["filename"] ?? String.Empty; var formChangesetId = Request.Form["changesetid"] ?? String.Empty; var formFileId = Request.Form["fileid"] ?? String.Empty; var formProvider = Request.Form["provider"] ?? String.Empty; var formRepositoryUrl = Request.Form["repositoryurl"] ?? String.Empty; SourceControlProvider Provider; try { Provider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), formProvider, true); } catch (ArgumentException) { Provider = SourceControlProvider.GitHub; //TODO maybe change to zero for default ? Check with saar } var comment = new Comment(); if (data != null) { comment = data.Value.Find((f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLinenumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId)); } return(JsonSuccess(new { comment = comment })); }
public override WidgetResult Show(IssueDto issueItem) { WidgetResult result = new WidgetResult(); if (!_validLicense) { _validLicense = !GeminiApp.LicenseSummary.IsFree || GeminiApp.LicenseSummary.IsGeminiTrial(); if (!_validLicense) { result.Markup = new WidgetMarkup(UnlicensedMessage); result.Success = true; return(result); } } List <string> tfsDetails = new List <string>(); IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueItem.Entity.Id, Constants.AppId, Constants.ControlId); if (data != null && data.Value != null && data.Value.Count > 0) { tfsDetails = data.Value; } Dictionary <string, WorkItem> details = new Dictionary <string, WorkItem>(); Pair <int, string> authenticationModel = new Pair <int, string>(issueItem.Entity.Id, string.Concat("apps/tfspicker/authenticate/", issueItem.Entity.Id)); if (tfsDetails.Count > 0) { if (AuthenticateUser(issueItem)) { //IsTfs2012(); foreach (var tfs in tfsDetails) { try { string url; var item = GetItem(tfs, out url); if (item != null) { if (url == null) { url = string.Format("{0}/web/UI/Pages/WorkItems/WorkItemEdit.aspx?id={1}&pguid={2}", RepositoryUrl, item.Id, item.Project.Guid); } /*if (isTfs2012) * { * url = string.Format("{0}/DefaultCollection/Countersoft/_workitems#_a=edit&id={1}", RepositoryUrl, item.Id); * } * else * { * url = string.Format("{0}/web/UI/Pages/WorkItems/WorkItemEdit.aspx?id={1}&pguid={2}", RepositoryUrl, item.Id, item.Project.Guid); * }*/ if (!details.ContainsKey(url)) { details.Add(url, item); } } Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details); result.Markup = new WidgetMarkup("views\\items.cshtml", tfsPickerModel); } catch (Exception ex) { result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel); GeminiApp.LogException(new Exception(ex.Message) { Source = "TFS Picker" }, false); } } } else { result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel); } } else { try { if (AuthenticateUser(issueItem)) { string url; var item = GetItem("", out url); Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details); result.Markup = new WidgetMarkup("views\\items.cshtml", tfsPickerModel); } else { result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel); } } catch (Exception ex) { result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel); GeminiApp.LogException(new Exception(ex.Message) { Source = "TFS Picker" }, false); } } result.Success = true; return(result); }
public ActionResult AddComment(int issueId) { IssueWidgetData <List <Comment> > data = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId); var formComment = Request.Form["comment"] ?? String.Empty; var formLineNumber = Request.Form["linenr"] ?? String.Empty; var formChangesetId = Request.Form["changesetid"] ?? String.Empty; var formFileId = Request.Form["fileid"] ?? String.Empty; var formFileName = Request.Form["filename"] ?? String.Empty; var formProvider = Request.Form["provider"] ?? String.Empty; var formRepositoryUrl = Request.Form["repositoryurl"] ?? String.Empty; bool isDeleted = false; if (!formFileName.IsEmpty() && !formLineNumber.IsEmpty() && !formRepositoryUrl.IsEmpty()) { Comment comment = new Comment(); comment.ChangesetId = formChangesetId; comment.Date = DateTime.Now; comment.Fullname = UserContext.User.Fullname; comment.Message = formComment; comment.LineNumber = formLineNumber; comment.FileName = formFileName; comment.FileId = formFileId; comment.RepositoryUrl = formRepositoryUrl; SourceControlProvider Provider; try { Provider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), formProvider, true); } catch (ArgumentException ex) { Provider = SourceControlProvider.GitHub; //TODO maybe change to zero for default ? Check with saar } comment.Provider = Provider; // If it's the first comment, setup a new comment list if (data == null) { data = new IssueWidgetData <List <Comment> >(); data.Value = new List <Comment>(); data.Value.Add(comment); data.IssueId = issueId; GeminiContext.IssueWidgetStore.Save(data.IssueId, Constants.AppId, Constants.ControlId, data.Value); } else { var tmpComment = data.Value.Find(f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLineNumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId); // IF current code line was already commented on, get comment and update message if (tmpComment != null) { var index = data.Value.FindIndex(f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLineNumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId); // If new message is empty, remove comment from DB if (formComment.IsEmpty()) { data.Value.RemoveAt(index); data.IssueId = issueId; isDeleted = true; } else { data.Value[index].Message = formComment; data.IssueId = issueId; } } else { // Add a new comment data.Value.Add(comment); data.IssueId = issueId; } GeminiContext.IssueWidgetStore.Save(data.IssueId, Constants.AppId, Constants.ControlId, data.Value); } return(JsonSuccess(new { isdeleted = isDeleted })); } else { return(JsonError()); } }
public ActionResult Authenticate(int issueId) { //Authentication string username = Request["username"] ?? string.Empty; string password = Request["password"] ?? string.Empty; string repositoryUrl = Request["repositoryurl"] ?? string.Empty; string message = string.Empty; bool success = true; string dataView = string.Empty; if (username.IsEmpty() || password.IsEmpty() || repositoryUrl.IsEmpty()) { message = "Please make sure Username, Password and Url are not empty"; success = false; } if (success) { UserWidgetDataDetails userData = new UserWidgetDataDetails(); userData.Username = username.Trim(); userData.Password = SecretsHelper.Encrypt(password.Trim(), SecretsHelper.EncryptionKey); userData.RepositoryUrl = repositoryUrl.Trim(); SaveLoginDetails(CurrentUser, userData, GeminiContext); TFSPicker tfsPicker = new TFSPicker(); try { ItemWidgetArguments args = new ItemWidgetArguments(UserContext, GeminiContext, Cache, System.Web.HttpContext.Current.Request, CurrentIssue); tfsPicker.AuthenticateUser(args); UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails(); TFSPicker.ConnectByImplementingCredentialsProvider connect = new TFSPicker.ConnectByImplementingCredentialsProvider(); ICredentials iCred = new NetworkCredential(loginDetails.Username, loginDetails.Password); connect.setLoginDetails(loginDetails.Username, loginDetails.Password, loginDetails.RepositoryUrl); connect.GetCredentials(new Uri(loginDetails.RepositoryUrl), iCred); TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl)); configurationServer.Credentials = iCred; if (TFSPicker.IsBasicAuth) { configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } else { configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred)); } try { configurationServer.EnsureAuthenticated(); } catch { System.Threading.Thread.Sleep(1000); configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl)); configurationServer.Credentials = iCred; if (TFSPicker.IsBasicAuth) { configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } else { configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred)); } configurationServer.EnsureAuthenticated(); } } catch (Exception ex) { var logindetails = GeminiContext.UserWidgetStore.Get <UserWidgetDataDetails>(CurrentUser.Entity.Id, Constants.AppId, Constants.ControlId); if (logindetails != null) { GeminiContext.UserWidgetStore.Delete(logindetails.Id); } success = false; message = ex.Message; GeminiApp.LogException(new Exception(ex.Message) { Source = "TFS Picker" }, false); return(JsonSuccess(new { success = success, message = message })); } tfsPicker.setLoginDetails(userData.Username, password.Trim(), userData.RepositoryUrl); WidgetResult result = new WidgetResult(); List <string> tfsDetails = new List <string>(); IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId); if (data != null && data.Value != null && data.Value.Count > 0) { tfsDetails = data.Value; } List <WorkItem> details = new List <WorkItem>(); foreach (var tfs in tfsDetails) { try { string url; UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails(); if (Username.IsEmpty()) { Username = loginDetails.Username; } if (Password.IsEmpty()) { Password = loginDetails.Password; } if (RepositoryUrl.IsEmpty()) { RepositoryUrl = loginDetails.RepositoryUrl; } var item = GetItem(tfs, out url); if (item != null) { details.Add(item); } } catch (Exception ex) { success = false; message = ex.Message; GeminiApp.LogException(new Exception(ex.Message) { Source = "TFS Picker" }, false); } } } return(JsonSuccess(new { success = success, message = message })); }
public ActionResult GetFileDiff(int issueId) { string newFile = string.Empty; string oldFile = string.Empty; string fileName = Request["filename"] ?? string.Empty; string fullfilename = Request["fullfilename"] ?? string.Empty; string provider = Request["provider"] ?? string.Empty; string revisionid = Request["revisionid"] ?? string.Empty; string fileid = Request["fileid"] ?? string.Empty; string repositoryUrl = Request["repositoryurl"] ?? string.Empty; string workspace = Request["workspace"] ?? string.Empty; fileName = fileName.Trim(); fullfilename = fullfilename.Trim(); provider = provider.Trim(); revisionid = revisionid.Trim(); fileid = fileid.Trim(); repositoryUrl = repositoryUrl.Trim(); workspace = workspace.Trim(); //Authentication details string authenticateForm = string.Empty; bool IsUserAuthorized = false; bool isFileIdMissing = false; string data = string.Empty; string errorMessage = string.Empty; if (!repositoryUrl.IsEmpty()) { if (provider == SourceControlProvider.GitHub.ToString()) { GitHub github = new GitHub(); if (github.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { if (fileid.IsEmpty()) { isFileIdMissing = true; // Need to do this, because when github sends back the committed data there is no fileid(which we need to get the file content) for the files. // This will go and get the fileids once for each commit where fileid's are empty fileid = github.updateFileIds(GeminiContext, repositoryUrl, revisionid, fileName, issueId); } newFile = github.GetFileContent(GeminiContext, issueId, repositoryUrl, revisionid, fileName, fileid); oldFile = github.GetFileContent(GeminiContext, issueId, repositoryUrl, revisionid, fileName, fileid, true); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = github.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else { authenticateForm = github.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else if (provider == SourceControlProvider.TFS2012.ToString()) { TFS2012 tfs2012 = new TFS2012(); if (tfs2012.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { oldFile = tfs2012.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl, true); newFile = tfs2012.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } catch (TeamFoundationServerUnauthorizedException ex) { authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = ex.Message; } } else { authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); } } else if (provider == SourceControlProvider.TFS2010.ToString()) { TFS2010 tfs2010 = new TFS2010(); if (tfs2010.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { oldFile = tfs2010.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl, true); newFile = tfs2010.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } catch (TeamFoundationServerUnauthorizedException ex) { authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = ex.Message; } } else { authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); } } else if (provider == SourceControlProvider.SVN.ToString()) { SVN svn = new SVN(); if (svn.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { oldFile = svn.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true); newFile = svn.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = svn.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else { authenticateForm = svn.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else if (provider == SourceControlProvider.Git.ToString()) { Git git = new Git(); if (git.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { oldFile = git.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true); newFile = git.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = git.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else { authenticateForm = git.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else if (provider == SourceControlProvider.Bitbucket.ToString()) { Bitbucket bitbucket = new Bitbucket(); if (bitbucket.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext)) { try { oldFile = bitbucket.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true); newFile = bitbucket.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid); IsUserAuthorized = true; } catch (UnauthorizedAccessException ex) { authenticateForm = bitbucket.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } else { authenticateForm = bitbucket.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName); errorMessage = "Invalid login details"; } } } else { errorMessage = "ERROR: Repository Url is missing"; } if (IsUserAuthorized) { // Handle BOM markers oldFile = oldFile.Replace("\x00EF\x00BB\x00BF", ""); newFile = newFile.Replace("\x00EF\x00BB\x00BF", ""); // Diff var tmpModel = diffBuilder.BuildDiffModel(oldFile ?? string.Empty, newFile ?? string.Empty); IssueWidgetData <List <Comment> > tmpData = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId); DiffplexComments model = new DiffplexComments(); if (tmpData != null) { SourceControlProvider enumProvider; try { enumProvider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), provider, true); } catch (ArgumentException ex) { enumProvider = 0; GeminiApp.LogException(new Exception(ex.Message) { Source = "Saucery" }, false); } var comments = tmpData.Value.FindAll(f => f.FileName == fileName && f.RepositoryUrl == repositoryUrl && f.Provider == enumProvider && f.ChangesetId == revisionid); if (comments != null) { model.data = tmpModel; model.comments = comments; } } else { model.data = tmpModel; model.comments = new List <Comment>(); } data = RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("F473D13E-19B7-45F3-98ED-6ED77B6BAB0A", "views/diff.cshtml"), model); } else { data = authenticateForm; } return(JsonSuccess(new { authenticationSuccess = IsUserAuthorized, fileid = fileid, data = data, isFileIdMissing = isFileIdMissing, errorMessage = errorMessage })); }
public ActionResult Search(string id, string search) { try { ItemWidgetArguments args = new ItemWidgetArguments(UserContext, GeminiContext, Cache, System.Web.HttpContext.Current.Request, CurrentIssue); TFSPicker tfsPicker = new TFSPicker(); tfsPicker.AuthenticateUser(args); UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails(); TFSPicker.ConnectByImplementingCredentialsProvider connect = new TFSPicker.ConnectByImplementingCredentialsProvider(); ICredentials iCred = new NetworkCredential(loginDetails.Username, loginDetails.Password); connect.setLoginDetails(loginDetails.Username, loginDetails.Password, loginDetails.RepositoryUrl); connect.GetCredentials(new Uri(loginDetails.RepositoryUrl), iCred); TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl)); configurationServer.Credentials = iCred; if (TFSPicker.IsBasicAuth) { configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } else { configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred)); } try { configurationServer.EnsureAuthenticated(); } catch { System.Threading.Thread.Sleep(1000); configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl)); configurationServer.Credentials = iCred; if (TFSPicker.IsBasicAuth) { configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } else { configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred)); } configurationServer.EnsureAuthenticated(); } CatalogNode catalogNode = configurationServer.CatalogNode; ReadOnlyCollection <CatalogNode> tpcNodes = catalogNode.QueryChildren(new Guid[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None); string url = string.Empty; List <WorkItem2> queryResults = new List <WorkItem2>(); TfsTeamProjectCollection tpc = null; string query = "Select [Id], [Work Item Type], [Title], [State] From WorkItems Where [Title] Contains '" + search + "' Order By [Id] Asc"; if (search.Trim().Length == 0) { query = "Select [Id], [Work Item Type], [Title], [Description] From WorkItems Order By [Id] Asc"; } foreach (CatalogNode tpcNode in tpcNodes) { tpc = configurationServer.GetTeamProjectCollection(new Guid(tpcNode.Resource.Properties["InstanceId"])); //tpc = new TfsTeamProjectCollection(new Uri(string.Concat(loginDetails.RepositoryUrl, '/', tpcNode.Resource.DisplayName)), iCred); if (TFSPicker.IsBasicAuth) { tpc.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } WorkItemStore workItemStore = (WorkItemStore)tpc.GetService(typeof(WorkItemStore)); var result = workItemStore.Query(query); if (result != null) { TswaClientHyperlinkService hyperlinkService = null; try { hyperlinkService = ((TswaClientHyperlinkService)tpc.GetService(typeof(TswaClientHyperlinkService))); } catch { } foreach (WorkItem res in result) { WorkItem2 item = new WorkItem2() { Item = res, BaseUrl = string.Concat(tpcNode.Resource.DisplayName, '/', res.AreaPath) }; try { if (hyperlinkService != null) { item.FullUrl = hyperlinkService.GetWorkItemEditorUrl(res.Id); } } catch { } queryResults.Add(item); } } } Dictionary <string, WorkItem> details = new Dictionary <string, WorkItem>(); if (queryResults.Count > 0) { IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(id.ToInt(), Constants.AppId, Constants.ControlId); if (data == null || data.Value == null) { data = new IssueWidgetData <List <string> >(); data.AppId = Constants.AppId; data.ControlId = Constants.ControlId; data.IssueId = id.ToInt(); data.Value = new List <string>(); } foreach (WorkItem2 item in queryResults) { //check if we are not already there! if (data.Value.Contains(item.Item.Id.ToString())) { continue; } /*if (isTfs2012) * {*/ if (item.FullUrl != null && item.FullUrl.ToString().HasValue()) { url = item.FullUrl.ToString(); } else { url = string.Format("{0}/{1}/_workitems#_a=edit&id={2}", loginDetails.RepositoryUrl, item.BaseUrl, item.Item.Id); } details.Add(url, item.Item); } } Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details); dataView = Content(BaseController.RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("782D003D-D9F0-455F-AF09-74417D6DFD2B", "views/search.cshtml"), tfsPickerModel)); } catch (Exception ex) { Pair <int, string> authenticationModel = new Pair <int, string>(CurrentIssue.Entity.Id, string.Concat(UserContext.Url, "/apps/tfspicker/authenticate/", CurrentIssue.Entity.Id)); dataView = Content(BaseController.RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("782D003D-D9F0-455F-AF09-74417D6DFD2B", "views/authenticationForm.cshtml"), authenticationModel)); successView = false; messageView = ex.Message; GeminiApp.LogException(new Exception(ex.Message) { Source = "TFS Picker" }, false); } return(JsonSuccess(new { success = successView, data = dataView, message = messageView })); }