public void StartPlanAsyncWithParametersAsPost(long planInstanceId, bool dryRun, [FromBody] string planString)
        {
            StartPlanEnvelope planEnvelope = StartPlanEnvelope.FromYaml(planString, isEncoded: true);
            Plan plan = planEnvelope.Plan;

            string context = GetContext(nameof(StartPlanAsyncWithParametersAsPost),
                                        nameof(plan), plan.Name, nameof(dryRun), dryRun, nameof(planInstanceId), planInstanceId);

            Impersonator runAsUser = null;

            try
            {
                SynapseServer.Logger.Debug(context);
                plan.InstanceId = planInstanceId;

                ValidatePlanSignature(plan);

                if (SynapseServer.UseImpersonation(User?.Identity))
                {
                    if (Request?.Headers?.Authorization?.Scheme?.ToLower() == "basic")
                    {
                        runAsUser = new Impersonator(Request.Headers.Authorization);
                    }
                    else
                    {
                        runAsUser = new Impersonator((WindowsIdentity)User.Identity);
                    }
                    runAsUser.Start(SynapseServer.Logger);
                }

                PlanRuntimePod p = new PlanRuntimePod(plan, dryRun, planEnvelope.GetCaseInsensitiveDynamicParameters(), plan.InstanceId, this.Url.Request.Headers.Referrer, this.Request?.Headers?.Authorization);
                _scheduler.StartPlan(p);
            }
            catch (Exception ex)
            {
                SynapseServer.Logger.Error(
                    Utilities.UnwindException(context, ex, asSingleLine: true));
                throw;
            }
            finally
            {
                runAsUser?.Stop(SynapseServer.Logger);
            }
        }
Beispiel #2
0
        public long StartPlan([FromBody] StartPlanEnvelope planEnvelope, string planUniqueName, bool dryRun = false, string requestNumber = null, string nodeRootUrl = null)
        {
            InitPlanServer();

            if (!string.IsNullOrWhiteSpace(requestNumber))
            {
                requestNumber = System.Web.HttpUtility.UrlDecode(requestNumber);
            }
            if (!string.IsNullOrWhiteSpace(nodeRootUrl))
            {
                requestNumber = System.Web.HttpUtility.UrlDecode(nodeRootUrl);
            }

            bool failedToDeserialize = false;
            Dictionary <string, string> dynamicParameters = planEnvelope?.GetCaseInsensitiveDynamicParameters();

            StringBuilder parms = new StringBuilder();

            if (dynamicParameters != null)
            {
                string s = string.Empty;
                foreach (string key in dynamicParameters.Keys)
                {
                    parms.Append($"{s}{key}: {dynamicParameters[key]}");
                    s = ", ";
                }
            }
            else
            {
                string rawBody = CurrentUrl.Request.Properties["body"].ToString();
                failedToDeserialize = !string.IsNullOrWhiteSpace(rawBody);
                if (failedToDeserialize)
                {
                    parms.Append(rawBody);
                }
            }

            string context = GetContext(nameof(StartPlan), nameof(CurrentUserName), CurrentUserName,
                                        nameof(planUniqueName), planUniqueName, nameof(dryRun), dryRun,
                                        nameof(requestNumber), requestNumber, nameof(nodeRootUrl), nodeRootUrl, "planParameters", parms.ToString());

            Impersonator runAsUser = null;

            if (SynapseServer.UseImpersonation(CurrentUser?.Identity))
            {
                if (Request?.Headers?.Authorization?.Scheme?.ToLower() == "basic")
                {
                    runAsUser = new Impersonator(this.AuthenticationHeader);
                }
                else
                {
                    runAsUser = new Impersonator((WindowsIdentity)(CurrentUser?.Identity));
                }
                runAsUser.Start(SynapseServer.Logger);
            }

            try
            {
                SynapseServer.Logger.Info(context);

                if (failedToDeserialize)
                {
                    throw new Exception($"Failed to deserialize message body:\r\n{parms.ToString()}");
                }

                return(_server.StartPlan(CurrentUserName, planUniqueName, dryRun, requestNumber, dynamicParameters,
                                         postDynamicParameters: true, nodeRootUrl: nodeRootUrl, referrer: CurrentUrl.Request.RequestUri, authHeader: this.AuthenticationHeader));
            }
            catch (Exception ex)
            {
                SynapseServer.Logger.Error(
                    Utilities.UnwindException(context, ex, asSingleLine: true));
                throw;
            }
            finally
            {
                runAsUser?.Stop(SynapseServer.Logger);
            }
        }