Beispiel #1
0
        public static async Task <RemoteSite> AuthorizeApiAsync(string apiKey)
        {
            try
            {
                if (apiKey == null)
                {
                    return(null);
                }

                RemoteSite site = null;
                site = await SiteCache.GetSiteByApiKey(HttpRuntime.Cache, apiKey.ToString());

                if (site == null)
                {
                    return(null);
                }

                //we're authenticated
                return(site);
            }
            catch (Exception ex)
            {
                throw new Exception("Error authorizing access", ex);
            }
        }
Beispiel #2
0
        public static bool AuthAndAddClaims(RemoteSite site, ref IPrincipal principal)
        {
            try
            {
                string       domainList = string.Join(",", site.SiteDomains.ToArray());
                List <Claim> claims     = new List <Claim>
                {
                    new Claim(CustomClaimTypes.SiteId, site.Id),
                    new Claim(CustomClaimTypes.SiteDomain, domainList),
                    new Claim(CustomClaimTypes.OnPremDomainName, site.OnPremDomainName)
                };

                // create an identity with the valid claims.
                ClaimsIdentity identity = new ClaimsIdentity(claims, CustomAuthTypes.Api);

                // set the context principal.
                principal = new ClaimsPrincipal(new[] { identity });
                return(true);
            }
            catch (Exception ex)
            {
                Logging.WriteToAppLog("Auth Error", System.Diagnostics.EventLogEntryType.Error, ex);
                return(false);
            }
        }
 public RemoteSiteRes(RemoteSite site)
 {
     Site      = site;
     SiteTypes = Enum.GetValues(typeof(SiteTypes))
                 .Cast <SiteTypes>()
                 .ToDictionary(t => (int)t, t => t.ToString());
 }
Beispiel #4
0
        public static async Task <IEnumerable <RemoteSite> > AddSite(RemoteSite site)
        {
            site.ApiKey = Utils.GenApiKey();
            var res = await DocDBRepo.DB <RemoteSite> .CreateItemAsync(site);

            return(await GetAllSites());
        }
Beispiel #5
0
        private static string GetConfig(string filePath, RemoteSite site, string apiUrl)
        {
            var apiKey = site.ApiKey;

            var file = new XmlDocument();

            file.Load(filePath);

            var key = file.SelectSingleNode("//add[@key='ApiKey']");

            key.Attributes["value"].Value = apiKey;
            key = file.SelectSingleNode("//add[@key='SiteUrl']");
            key.Attributes["value"].Value = apiUrl;

            if (site.SiteType == SiteTypes.MasterHQ)
            {
                key = file.SelectSingleNode("//add[@key='AADClientID']");
                key.Attributes["value"].Value = Settings.ClientId;
                key = file.SelectSingleNode("//add[@key='AADClientKey']");
                key.Attributes["value"].Value = Settings.ClientSecret;
                key = file.SelectSingleNode("//add[@key='AADTenantID']");
                key.Attributes["value"].Value = Settings.TenantId;
            }

            return(file.OuterXml);
        }
        private static bool AuthAndAddClaims(RemoteSite site, ref IPrincipal principal, IRequest request)
        {
            try
            {
                string domainList = string.Join(",", site.SiteDomains.ToArray());

                List <Claim> claims = new List <Claim>
                {
                    new Claim(ClaimTypes.Name, site.Id),
                    new Claim(CustomClaimTypes.SiteId, site.Id),
                    new Claim(CustomClaimTypes.OnPremDomainName, site.OnPremDomainName),
                    new Claim(CustomClaimTypes.SiteDomain, domainList),
                    new Claim(CustomClaimTypes.IsHQ, (site.SiteType == SiteTypes.MasterHQ).ToString()),
                    new Claim(CustomClaimTypes.IsSTS, (site.ApiKey == Settings.STSApiKey).ToString())
                };

                ClaimsIdentity identity = new ClaimsIdentity(claims, CustomAuthTypes.Api);

                principal = new ClaimsPrincipal(new[] { identity });
                return(true);
            }
            catch (Exception ex)
            {
                Logging.WriteToAppLog("Auth Error", System.Diagnostics.EventLogEntryType.Error, ex);
                return(false);
            }
        }
        public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
        {
            IPrincipal p = null;

            try
            {
                var key = request.Headers.SingleOrDefault(h => h.Key == "apikey").Value;

                if (key == Settings.STSApiKey)
                {
                    //branch just for STS calls
                    if (!AuthAndAddClaims(new RemoteSite
                    {
                        ApiKey = key,
                        Id = key,
                        OnPremDomainName = "CustomSTS",
                        SiteType = SiteTypes.LocalADOnly
                    }, ref p, request))
                    {
                        return(false);
                    }
                    request.Environment["server.User"] = p;
                    request.GetHttpContext().User = p;
                    return(true);
                }

                RemoteSite site = null;
                var        task = Task.Run(async() =>
                {
                    site = await SiteUtils.AuthorizeApiAsync(key);
                });
                task.Wait();

                if (site == null)
                {
                    return(false);
                }

                //we're authenticated
                if (!AuthAndAddClaims(site, ref p, request))
                {
                    return(false);
                }

                request.Environment["server.User"] = p;
                request.GetHttpContext().User = p;
                return(true);
            }
            catch (Exception ex)
            {
                throw new Exception("Error authorizing access", ex);
            }
        }
Beispiel #8
0
        // GET: RemoteSite/Edit/5
        public async Task <ActionResult> Edit(string id)
        {
            RemoteSite site;

            if (id == null)
            {
                site = new RemoteSite();
            }
            else
            {
                site = await RemoteSiteUtil.GetSite(id);
            }
            return(View(site));
        }
Beispiel #9
0
        private static void RunConsole(RemoteSite siteConfig, string[] args)
        {
            if (ParseCommandLine(args))
            {
                relay.StartAsync().Wait();
                timer.Start();
                _isRunning = true;

                while (_isRunning)
                {
                    Console.TreatControlCAsInput = true;
                    Console.WriteLine("Press \"p\" to send a Ping test, Ctrl-C to end.");
                    var key = Console.ReadKey(true);
                    switch (key.Key)
                    {
                    case ConsoleKey.P:
                        WriteConsoleStatus("Sending ping...");
                        _pingTest = new PingEvent(DateTime.Now);
                        relay.Send(new RelayMessage
                        {
                            Operation  = SiteOperation.Ping,
                            ApiKey     = OrgApiCalls.ApiKey,
                            DestSiteId = siteConfig.Id
                        });
                        break;

                    case ConsoleKey.Escape:
                    case ConsoleKey.C:
                        if (key.Key == ConsoleKey.C && key.Modifiers != ConsoleModifiers.Control)
                        {
                            break;
                        }

                        Console.WriteLine("Stop the relay agent? (Y or N)");
                        if (Console.ReadKey().Key == ConsoleKey.Y)
                        {
                            WriteConsoleStatus("Received shutdown command.");
                            _isRunning = false;
                        }
                        break;
                    }
                }
                relay.Stop();
            }
        }
Beispiel #10
0
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            try
            {
                var key = actionContext.Request.Headers.SingleOrDefault(h => h.Key == "apikey").Value.FirstOrDefault();

                RemoteSite site = null;
                var        task = Task.Run(async() => {
                    site = await SiteUtils.AuthorizeApiAsync(key);
                });
                task.Wait();

                if (site == null)
                {
                    Unauthorized(ref actionContext);
                    base.OnAuthorization(actionContext);
                    return;
                }
                if (_isAdmin && site.SiteType != SiteTypes.MasterHQ)
                {
                    Unauthorized(ref actionContext);
                    base.OnAuthorization(actionContext);
                    return;
                }

                //we're authenticated
                var p = actionContext.RequestContext.Principal;
                if (!AuthAndAddClaims(site, ref p))
                {
                    Unauthorized(ref actionContext);
                    base.OnAuthorization(actionContext);
                    return;
                }
                actionContext.RequestContext.Principal = p;
                base.OnAuthorization(actionContext);
                return;
            }
            catch (Exception ex)
            {
                throw new Exception("Error authorizing access", ex);
            }
        }
Beispiel #11
0
        private static string GetJsonConfig(RemoteSite site, string apiUrl)
        {
            string apiKey        = site.ApiKey;
            var    scriptUpdates = new Dictionary <string, string>
            {
                { "ApiKey", apiKey },
                { "ApiSite", apiUrl }
            };

            if (site.SiteType == SiteTypes.MasterHQ)
            {
                //to enable GraphAPI calls for B2B invitations
                scriptUpdates.Add("AADClientID", Settings.ClientId);
                scriptUpdates.Add("AADClientKey", Settings.ClientSecret);
                scriptUpdates.Add("AADTenantID", Settings.TenantId);
            }
            var config = JsonConvert.SerializeObject(scriptUpdates);

            return(config);
        }
Beispiel #12
0
        private static void InitTimers(RemoteSite site)
        {
            //setup timers
            var scripts = new List <ScriptObject>();

            if (site.SiteType == SiteTypes.MasterHQ)
            {
                scripts.Add(new ScriptObject("sync-ad.ps1"));
                scripts.Add(new ScriptObject("sync-b2b.ps1"));
            }
            else
            {
                scripts.Add(new ScriptObject("sync.ps1"));
            }

            ScriptTimer.ScriptFolderPath = _scriptFolderPath;

            timer               = new ScriptTimer(scripts.ToArray(), _timerIntervalMinutes);
            timer.ErrorEvent   += Timer_ErrorEvent;
            timer.StatusUpdate += Timer_StatusUpdate;
        }
Beispiel #13
0
        private void CheckConfig()
        {
            _hasConfig = (txtApiKey.Text.Length > 0 && txtSiteUrl.Text.Length > 0);
            if (_hasConfig)
            {
                OrgApiCalls.ApiKey   = txtApiKey.Text;
                OrgApiCalls.SiteUrl  = txtSiteUrl.Text;
                _siteConfig          = OrgApiCalls.GetSiteConfig();
                txtDomainName.Text   = _siteConfig.OnPremDomainName;
                txtSiteID.Text       = _siteConfig.Id;
                ADTools.ADDomainName = _siteConfig.OnPremDomainName;

                txtSiteType.Text = _siteConfig.SiteType.ToString();
                SaveConfig();
                lstRemoteDomainList.Items.Clear();
                lstRemoteDomainList.Items.AddRange(_siteConfig.SiteDomains.ToArray());
                CheckDomainsToUpns();
            }
            else
            {
                MessageBox.Show("Please configure your API Key and Site URL before confirming your config.", "Need Config", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return;
            }
        }
Beispiel #14
0
        public static MemoryStream SetupZip(string dirPath, RemoteSite site, string apiUrl)
        {
            string apiKey                = site.ApiKey;
            var    dirPath2              = Path.Combine(dirPath, _zipName);
            var    apiFilePath           = Path.Combine(dirPath2, "api.config.txt");
            var    serviceConfigFilePath = Path.Combine(dirPath2, "ComplexOrgSiteAgent.exe.config");

            var apiConfigFile     = GetConfig(apiFilePath, site, apiUrl);
            var serviceConfigFile = GetConfig(serviceConfigFilePath, site, apiUrl);
            var jsonConfigFile    = GetJsonConfig(site, apiUrl);

            var scriptVersionFile = GetCurrSiteVersion(dirPath);

            var scriptFolderName = site.SiteType.ToString();
            var scriptFolderPath = Path.Combine(dirPath, scriptFolderName);

            using (var zipFile = File.Open(Path.Combine(dirPath, _zipName + ".zip"), FileMode.Open))
            {
                Stream zipCopy = new MemoryStream();
                zipFile.CopyTo(zipCopy);

                var archive = new ZipArchive(zipCopy, ZipArchiveMode.Update, true);

                try
                {
                    //setup app config file
                    var item = archive.CreateEntry("api.config", CompressionLevel.Fastest);

                    using (var streamWriter = new StreamWriter(item.Open()))
                    {
                        streamWriter.Write(apiConfigFile);
                    }

                    //setup service config file
                    item = archive.CreateEntry("ComplexOrgSiteAgent.exe.config", CompressionLevel.Fastest);

                    using (var streamWriter = new StreamWriter(item.Open()))
                    {
                        streamWriter.Write(serviceConfigFile);
                    }

                    //add correct PS script folder
                    AddFilesAndFolders(scriptFolderPath, ref archive, "Scripts");

                    //setup script version file
                    item = archive.CreateEntry("Scripts\\ScriptVersion.txt", CompressionLevel.Fastest);

                    using (var streamWriter = new StreamWriter(item.Open()))
                    {
                        streamWriter.Write(scriptVersionFile);
                    }

                    //setup script variables file
                    item = archive.CreateEntry("Scripts\\SyncVars.json", CompressionLevel.Fastest);

                    using (var streamWriter = new StreamWriter(item.Open()))
                    {
                        streamWriter.Write(jsonConfigFile);
                    }

                    return(zipCopy as MemoryStream);
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    archive.Dispose();
                }
            }
        }
Beispiel #15
0
        static void Main(string[] args)
        {
            var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            _scriptFolderPath = args.Where(a => a.StartsWith("-scriptPath")).FirstOrDefault();
            if (_scriptFolderPath != null)
            {
                _scriptFolderPath = _scriptFolderPath.Split(':')[1];
            }
            else
            {
                _scriptFolderPath = Path.GetFullPath(string.Format("{0}\\Scripts", dir));
            }

            ServiceName              = Assembly.GetCallingAssembly().GetCustomAttribute <AssemblyTitleAttribute>().Title;
            ConsoleLogSource         = String.Format("{0}-console", ServiceName);
            ServiceUtil.AssemblyName = AssemblyName;
            ServiceUtil.ServiceName  = ServiceName;

            PrintLogo();

            if (args.Any(a => a == "-debug"))
            {
                _isDebug = true;
            }

            var sUrl      = ConfigurationManager.AppSettings["SiteUrl"];
            var sDebugUrl = ConfigurationManager.AppSettings["DebugSiteUrl"];

            _timerIntervalMinutes = Convert.ToInt16(ConfigurationManager.AppSettings["TimerIntervalMinutes"]);

            OrgApiCalls.ApiKey  = ConfigurationManager.AppSettings["ApiKey"];
            OrgApiCalls.SiteUrl = (_isDebug) ? sDebugUrl : sUrl;

            ConsoleLogSource = Utils.SetupLog(ConsoleLogSource);

            try
            {
                RemoteSite siteConfig = null;

                try
                {
                    siteConfig = OrgApiCalls.GetSiteConfig();
                }
                catch (Exception)
                {
                    WriteConsoleStatus("Failed retrieving site status");
                }

                if (siteConfig == null)
                {
                    throw new Exception("Unable to retrieve site configuration, exiting");
                }

                var scriptConfig = GetJsonConfig(siteConfig, OrgApiCalls.SiteUrl);
                File.WriteAllText(Path.Combine(_scriptFolderPath, "SyncVars.json"), scriptConfig);

                ADTools.ADDomainName = siteConfig.OnPremDomainName;

                relay = new SigRClient(OrgApiCalls.SiteUrl, OrgApiCalls.ApiKey, "SiteHub", true);

                relay.StatusUpdate += Relay_StatusUpdate;
                relay.ErrorEvent   += Relay_ErrorEvent;
                relay.PingEvent    += Relay_PingEvent;

                InitTimers(siteConfig);

                relay.FireScriptEvent += Relay_FireScriptEvent;

                if (Environment.UserInteractive)
                {
                    RunConsole(siteConfig, args);
                }
                else
                {
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[]
                    {
                        new SiteListenerService(relay, timer)
                    };
                    ServiceBase.Run(ServicesToRun);
                }
            }
            catch (Exception ex)
            {
                var msg = Utils.GetFormattedException(ex);
                Utils.AddLogEntry(ConsoleLogSource, msg, EventLogEntryType.Error);
            }
        }
Beispiel #16
0
        public static async Task <IEnumerable <RemoteSite> > UpdateSite(RemoteSite site)
        {
            var res = await DocDBRepo.DB <RemoteSite> .UpdateItemAsync(site);

            return(await GetAllSites());
        }