private List <WebhooksData> GetData(GeminiContext context, bool create, bool update) { var data = context.GlobalConfigurationWidgetStore.Get <List <WebhooksData> >(AppConstants.AppId); if (data == null || data.Value == null) { data = new Countersoft.Gemini.Commons.Entity.GlobalConfigurationWidgetData <List <WebhooksData> >(); data.Value = new List <WebhooksData>(); } if (create && update) { data.Value.RemoveAll(a => !a.Create && !a.Update); } else if (create) { data.Value.RemoveAll(a => !a.Create); } else if (update) { data.Value.RemoveAll(a => !a.Update); } else { data.Value.RemoveAll(a => a.Create || a.Update); } return(data.Value); }
/// <summary> /// Add user with the same domain (superuser) as watcher. /// </summary> /// <param name="context"></param> /// <param name="issueParam"></param> /// <param name="user"></param> /// <param name="createAudit"></param> private void AddSuperuser(GeminiContext context, IssueDto issueParam, User user, bool createAudit) { try { IssueDto issue = issueParam; Helper helper = new Helper(); if ((issue.CustomFields.Count > 0) && (!issue.CustomFields.Find(field => field.Name.Equals(helper.GetAppConfigValue("customFieldNameDomain"))).ToString().Equals(null))) { // Alternatively .Entity.Data could be chosen. string domain = helper.GetFormattedDataErstellerOE(issue); // If there is something to consider if (helper.GetAppConfigValue("blacklist") != null) { // It has to be considered that we already are the superusers of erz.be.ch (and potentially other domains) string forbiddenDomains = helper.GetAppConfigValue("blacklist"); string[] domains = forbiddenDomains.Split(','); if (!Array.Exists(domains, element => element == domain)) { AddWatcherFromDomain(context, domain, issue, user.Id, user.Fullname, createAudit); } } else { AddWatcherFromDomain(context, domain, issue, user.Id, user.Fullname, createAudit); } } } catch (Exception exception) { GeminiApp.LogException(exception, false, exception.Message); } }
/// <summary> /// Adds a watcher if it has the same domain as the email address. Only if user is not watcher as on this task. /// </summary> /// <param name="context"></param> /// <param name="domain"></param> /// <param name="issueParam"></param> /// <param name="userId"></param> /// <param name="username"></param> /// <param name="createAudit"></param> private void AddWatcherFromDomain(GeminiContext context, string domain, IssueDto issueParam, int userId, string username, bool createAudit) { try { IssueDto issue = issueParam; Helper helper = new Helper(); UserManager usermanager = new UserManager(GeminiApp.Cache(), GeminiApp.UserContext(), context); List <UserDto> users = usermanager.GetActiveUsers(); foreach (UserDto user in users) { // Only if not already watcher on this task if (!issue.Entity.Watchers.Contains(user.Entity.Id.ToString())) { string activeUserDomain = helper.FindDomain(user.Entity.Email); if (domain == activeUserDomain) { issue.Entity.AddWatcher(user.Entity.Id); if (createAudit) { string watcher = user.Entity.Fullname; helper.CreateAuditlog(context, issue.Id, issue.Project.Id, null, "", watcher, userId, username); } } } } } catch (Exception exception) { GeminiApp.LogException(exception, false, exception.Message); } }
public bool AuthenticateUser(UserDto user, string repositoryUrl, GeminiContext gemini) { //UserWidgetData<List<UserWidgetDataDetails>> userDataRaw = gemini.UserWidgetStore.Get<List<UserWidgetDataDetails>>(user.Entity.Id, Constants.AppId, Constants.ControlId); var allUserDataRaw = gemini.UserWidgetStore.GetAll().Where(f => f.AppId == Constants.AppId && f.ControlId == Constants.ControlId); if (allUserDataRaw == null || allUserDataRaw.Count() == 0) { return(false); } var data = allUserDataRaw.Select(f => f.Value.FromJson <List <UserWidgetDataDetails> >()).First().Find(s => s.Provider == SourceControlProvider.GitHub && s.RepositoryUrl == repositoryUrl); if (data == null) { return(false); } if (data.AccessToken.IsEmpty()) { return(false); } Username = data.Username; Password = SecretsHelper.Decrypt(data.Password, SecretsHelper.EncryptionKey); AccessToken = data.AccessToken; return(true); }
/// <summary> /// This creates an auditlog (history) for the watcher and custom field manipulations /// </summary> /// <param name="context"></param> /// <param name="issueId"></param> /// <param name="issueProjectId"></param> /// <param name="customField"></param> /// <param name="beforeValue"></param> /// <param name="afterValue"></param> /// <param name="userId"></param> /// <param name="username"></param> public void CreateAuditlog(GeminiContext context, int issueId, int issueProjectId, CustomFieldDataDto customField, string beforeValue, string afterValue, int userId, string username) { try { IssueAuditManager issueAuditManager = new IssueAuditManager(GeminiApp.Cache(), GeminiApp.UserContext(), context); UserManager userManager = new UserManager(GeminiApp.Cache(), GeminiApp.UserContext(), context); IssueAudit audit = issueAuditManager.GetIssueAuditObject(issueId, issueProjectId); audit.UserId = userId; audit.Fullname = username; if (customField == null) { issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedWatchers, string.Empty, string.Empty, beforeValue, afterValue); } else { issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedCustomFields, customField.Entity.CustomFieldId.ToString(), string.Empty, string.Empty, beforeValue, afterValue); } } catch (Exception exception) { GeminiApp.LogException(exception, false, exception.Message); } }
public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini) { UserWidgetData <UserWidgetDataDetails> userDataRaw = gemini.UserWidgetStore.Get <UserWidgetDataDetails>(user.Entity.Id, Constants.AppId, Constants.ControlId); if (userDataRaw == null) { var data = new UserWidgetData <UserWidgetDataDetails>(); data.Value = new UserWidgetDataDetails(); data.Value = userData; gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value); } else { userDataRaw.Value.Password = userData.Password; userDataRaw.Value.Username = userData.Username; userDataRaw.Value.RepositoryUrl = userData.RepositoryUrl; gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value); } }
/// <summary> /// This creates an auditlog for the custom field manipulations /// </summary> /// <param name="context"></param> /// <param name="issueId"></param> /// <param name="issueProjectId"></param> /// <param name="customField"></param> /// <param name="beforeValue"></param> /// <param name="afterValue"></param> public void CreateAuditlog(GeminiContext context, int issueId, int issueProjectId, CustomFieldDataDto customField, string beforeValue, string afterValue) { IssueAuditManager issueAuditManager = new IssueAuditManager(GeminiApp.Cache(), GeminiApp.UserContext(), context); IssueAudit audit = issueAuditManager.GetIssueAuditObject(issueId, issueProjectId); issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedCustomFields, customField.Entity.CustomFieldId.ToString(), string.Empty, string.Empty, beforeValue, afterValue); }
public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string filename, string revisionId, bool getPreviousRevision = false) { if (filename.IsEmpty()) { return(string.Empty); } if (getPreviousRevision) { var allIssueCommits = gemini.CodeCommits.GetAll(issueid); if (allIssueCommits == null || allIssueCommits.Count() == 0) { return(string.Empty); } var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.SVN && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":", revisionId))); if (fileCommits == null || fileCommits.Count() != 1) { return(string.Empty); } var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>(); revisionId = fileCommitsJson.Files.Where(f => f.Filename == filename).First().PreviousFileRevisionId; if (revisionId.IsEmpty()) { return(string.Empty); } } RestSharp.IRestResponse response; try { response = GetResponse(string.Format("{0}{1}?p={2}", repositoryUrl, filename, revisionId), RestSharp.Method.GET); } catch (FileNotFoundException ex) { GeminiApp.LogException(ex, false); return(string.Empty); } catch (UnauthorizedAccessException) { throw; } catch (Exception ex) { GeminiApp.LogException(ex, false); return(string.Empty); } return(response.Content); }
public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string revisionId, string filename, string fileId, bool getPreviousRevision = false) { if (filename.IsEmpty() || repositoryUrl.IsEmpty()) { return(string.Empty); } var result = string.Empty; if (getPreviousRevision) { var allIssueCommits = gemini.CodeCommits.GetAll(issueid); if (allIssueCommits == null || allIssueCommits.Count() == 0) { return(string.Empty); } var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.GitHub && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\""))); if (fileCommits == null || fileCommits.Count() != 1) { return(string.Empty); } var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>(); fileId = fileCommitsJson.Files.Where(f => f.Filename == filename).First().PreviousFileRevisionId; } if (fileId.IsEmpty()) { return(string.Empty); } RestSharp.IRestResponse response; repositoryUrl = repositoryUrl.Replace("https://api.github.com", "https://api.github.com/repos"); try { response = GetResponse(string.Format("{0}/git/blobs/{1}", repositoryUrl, fileId), RestSharp.Method.GET); result = Encoding.Default.GetString(Convert.FromBase64String(response.Content.FromJson <GitHubFileContent>().content)); } catch (Exception ex) { GeminiApp.LogException(ex, false); return(string.Empty); } return(result); }
private static GlobalConfigurationWidgetData <SlackConfigData> GetConfig(GeminiContext ctx) { try { return(ctx.GlobalConfigurationWidgetStore.Get <SlackConfigData>(AppConstants.AppId)); } catch { return(null); } }
public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini) { UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId); if (userDataRaw == null) { var data = new UserWidgetData <List <UserWidgetDataDetails> >(); data.Value = new List <UserWidgetDataDetails>(); data.Value.Add(userData); gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value); } else { /** * We need to make sure there are NO github Authentication records with an empty access token otherwise when we receive the access_token back from them we will not be able to associate that request to the right * Repository with an empty access token * check if there is already an entry for github with empty access token, if yes then delete it */ var incompleteAuthentication = userDataRaw.Value.Find(f => f.Provider == userData.Provider && f.AccessToken.IsEmpty()); if (incompleteAuthentication != null) { //var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider && f.AccessToken.IsEmpty()); DeleteLoginDetails(user, incompleteAuthentication, gemini); userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId); } var tmpUser = userDataRaw.Value.Find(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); // If a password for this rep already exist, update the details only if (tmpUser != null) { var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); userDataRaw.Value[index].Username = userData.Username; userDataRaw.Value[index].Password = userData.Password; userDataRaw.Value[index].AccessToken = userData.AccessToken; } else { // Add a new user authentication for this user userDataRaw.Value.Add(userData); } gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value); } }
public void DeleteLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini) { UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId); if (userDataRaw != null) { var tmpUser = userDataRaw.Value.FindAll(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); // If a password for this rep already exist, update the details only if (tmpUser != null) { var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); userDataRaw.Value.RemoveAt(index); } gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value); } }
public bool AuthenticateUser(UserDto user, string repositoryUrl, GeminiContext gemini) { UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId); if (userDataRaw == null) { return(false); } var data = userDataRaw.Value.Find(f => f.RepositoryUrl == repositoryUrl && f.Provider == SourceControlProvider.Git); if (data == null) { return(false); } Username = data.Username; Password = SecretsHelper.Decrypt(data.Password, SecretsHelper.EncryptionKey); return(true); }
public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini) { UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId); if (userDataRaw == null) { var data = new UserWidgetData <List <UserWidgetDataDetails> >(); data.Value = new List <UserWidgetDataDetails>(); data.Value.Add(userData); gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value); } else { var tmpUser = userDataRaw.Value.Find(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); // If a password for this rep already exist, update the details only if (tmpUser != null) { var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider); userDataRaw.Value[index].Password = userData.Password; userDataRaw.Value[index].Username = userData.Username; } else { // Add a new user authentication for this user userDataRaw.Value.Add(userData); } gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value); } }
public string GetFileContent(GeminiContext gemini, int issueid, string filename, string fullfilename, string workspace, string changesetid, string fileid, string repositoryUrl, bool getPreviousRevision = false) { ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider(); ICredentials iCred = new NetworkCredential(Username, Password); connect.setLoginDetails(Username, Password, workspace); connect.GetCredentials(new Uri(Uri), iCred); TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(Uri)); configurationServer.Credentials = iCred; if (TFS2012.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); foreach (CatalogNode tpcNode in tpcNodes) { Guid tpcId = new Guid(tpcNode.Resource.Properties["InstanceId"]); TfsTeamProjectCollection tpc = configurationServer.GetTeamProjectCollection(tpcId); if (TFS2012.IsBasicAuth) { tpc.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred)); } VersionControlServer versionControl = (VersionControlServer)tpc.GetService(typeof(VersionControlServer)); Item file = null; try { //IF file was just added in tfs if (fileid.ToInt() == 0) { Item tmpFile = null; //Need to catch error if file was deleted, we'll get an error and call the file with parameters as below. //This would only happen to newly added file, which will not have a itemid as we wouldn't know what it is on first commit of a file try { tmpFile = versionControl.GetItem(string.Concat(fullfilename, "/", filename)); } catch (VersionControlException ex) { tmpFile = versionControl.GetItem(fullfilename + "/" + filename, VersionSpec.Latest, DeletedState.Deleted); } if (tmpFile != null) { fileid = tmpFile.ItemId.ToString(); } } if (fileid.ToInt() > 0) { if (getPreviousRevision) { if (changesetid.ToInt() > 1) { file = versionControl.GetItem(fileid.ToInt(), changesetid.ToInt() - 1, true); } } else { file = versionControl.GetItem(fileid.ToInt(), changesetid.ToInt()); } if (file != null) { if (file.DeletionId > 0) { return(string.Empty); } else { using (Stream stream = file.DownloadFile()) { StreamReader rdr = new StreamReader(stream); return(rdr.ReadToEnd()); } } } } } catch (VersionControlException ex) { GeminiApp.LogException(ex, false); return(string.Empty); } catch (Exception ex) { GeminiApp.LogException(ex, false); return(string.Empty); } } return(string.Empty); }
public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string filename, string revisionId, bool getPreviousRevision = false) { if (filename.IsEmpty()) { return(string.Empty); } var allIssueCommits = gemini.CodeCommits.GetAll(issueid); if (allIssueCommits == null || allIssueCommits.Count() == 0) { return(string.Empty); } var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.Git && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\""))); if (fileCommits == null || fileCommits.Count() != 1) { return(string.Empty); } var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>(); var currentFile = fileCommitsJson.Files.Where(s => s.FullFilename == filename); if (getPreviousRevision) { if (currentFile.Count() > 0 && currentFile.First().PreviousFileRevisionId.Equals("deleted", StringComparison.InvariantCultureIgnoreCase)) { return(string.Empty); } revisionId = fileCommitsJson.PreviousRevisionId; } else if (currentFile.Count() > 0 && currentFile.First().FileId.IsEmpty()) { //If fileId is empty means the file was deleted return(string.Empty); } if (revisionId.IsEmpty()) { return(string.Empty); } RestSharp.IRestResponse response; try { response = GetResponse(string.Format("{0}/Raw/{1}/{2}?display=True", repositoryUrl, revisionId, Uri.EscapeDataString(filename)), RestSharp.Method.GET); } catch (FileNotFoundException ex) { GeminiApp.LogException(ex, false); return(string.Empty); } catch (UnauthorizedAccessException) { throw; } catch (Exception ex) { GeminiApp.LogException(ex, false); return(string.Empty); } return(response.Content); }
public ReportManager(ICacheContainer cache, UserContext userContext, GeminiContext geminiContext) : base(cache, userContext, geminiContext) { }
public string updateFileIds(GeminiContext gemini, string repositoryUrl, string revisionId, string filename, int issueId) { var allCommits = gemini.CodeCommits.GetAll(issueId); string result = string.Empty; if (allCommits != null) { var sourceCommits = allCommits.Where(f => f.Provider == SourceControlProvider.GitHub); if (sourceCommits != null) { var commit = sourceCommits.Where(f => f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\"")) && f.Data.Contains(filename)); if (commit != null && commit.Count() > 0) { var data = commit.First().Data.FromJson <SourceControlCommit>(); var emptyFileIds = data.Files.Where(f => f.FileId.IsEmpty()); // If there are empty fielid's go and get them if (emptyFileIds.Count() > 0) { var githubCommit = GetResponse(string.Concat(data.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://api.github.com/repos"), "/git/commits/", revisionId), RestSharp.Method.GET); var githubCommitJson = githubCommit.Content.FromJson <TreeUrl>(); var githubPreviousCommit = GetResponse(string.Concat(data.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://api.github.com/repos"), "/git/commits/", githubCommitJson.parents.First().sha), RestSharp.Method.GET); var githubPreviousCommitJson = githubPreviousCommit.Content.FromJson <TreeUrl>(); var githubCommitTree = GetResponse(string.Concat(githubCommitJson.tree.url, "?recursive=1"), RestSharp.Method.GET); var githubPreviousCommitTree = GetResponse(string.Concat(githubPreviousCommitJson.tree.url, "?recursive=1"), RestSharp.Method.GET); var gitCommitTreeJson = githubCommitTree.Content.FromJson <TreeFiles>(); var gitPreviousCommitTreeJson = githubPreviousCommitTree.Content.FromJson <TreeFiles>(); if (gitCommitTreeJson != null || gitPreviousCommitTreeJson != null) { foreach (var blob in data.Files) { if (gitCommitTreeJson != null) { var fileExist = gitCommitTreeJson.tree.Where(f => f.path == blob.Filename); if (fileExist != null && fileExist.Count() == 1) { blob.FileId = fileExist.Select(f => f.sha).First(); if (filename == blob.Filename) { result = blob.FileId; } } } if (gitPreviousCommitTreeJson != null) { var fileExist = gitPreviousCommitTreeJson.tree.Where(f => f.path == blob.Filename); if (fileExist != null && fileExist.Count() == 1) { blob.PreviousFileRevisionId = fileExist.Select(f => f.sha).First(); } } } if (data.PreviousRevisionId.IsEmpty()) { data.PreviousRevisionId = githubCommitJson.parents.First().sha; } commit.First().Data = data.ToJson(); } gemini.CodeCommits.Update(commit.First()); } else { result = data.Files.Where(f => f.Filename == filename).Select(f => f.FileId).First(); } } } } return(result); }