예제 #1
0
파일: WaveTest.cs 프로젝트: azist/azos
        private void jsonMapAndPrimitives(string actionName)
        {
            var initialMap = new JsonDataMap();

            initialMap["ID"]   = 100;
            initialMap["Name"] = "Initial Name";
            var str = initialMap.ToJson(JsonWritingOptions.CompactRowsAsMap);

            var values = new NameValueCollection();

            values.Add("n", "777");
            values.Add("s", "sss");

            using (var wc = CreateWebClient())
            {
                wc.QueryString = values;
                wc.Headers[HttpRequestHeader.ContentType] = Azos.Web.ContentType.JSON;
                var res = wc.UploadString(INTEGRATION_HTTP_ADDR + actionName, str);

                var gotMap = JsonReader.DeserializeDataObject(res) as JsonDataMap;

                Aver.AreObjectsEqual(gotMap["ID"], 777);
                Aver.AreObjectsEqual(gotMap["Name"], "sss");
            }
        }
예제 #2
0
        protected override void DoEncodeResponse(MemoryStream ms, ResponseMsg msg, ISerializer serializer)
        {
            var data = new JsonDataMap();

            data["id"]       = msg.RequestID.ID;
            data["instance"] = msg.RemoteInstance?.ToString("D");

            if (msg.ReturnValue is string rstr)
            {
                data["return"] = rstr;
            }
            else if (msg.ReturnValue is Contracts.RemoteTerminalInfo rtrm)
            {
                data["return"] = rtrm;
            }
            else if (msg.ReturnValue is WrappedExceptionData wed)
            {
                data["return"] = new JsonDataMap {
                    { "error-content", wed.ToJson(JsonWritingOptions.CompactRowsAsMap) }
                }
            }
            ;
            else
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_RESPONSE_ERROR.Args(nameof(AppTermBinding), "unsupported ReturnValue `{0}`".Args(msg.ReturnValue)));
            }

            var json = data.ToJson(JsonWritingOptions.Compact);
            var utf8 = Encoding.UTF8.GetBytes(json);

            ms.Write(utf8, 0, utf8.Length);
        }
예제 #3
0
 protected override void DoAfterWork(WorkContext work, JsonDataMap matched)
 {
     work.Log(
         matched[VAR_TYPE].AsEnum <MessageType>(MessageType.Info),
         matched[VAR_TEXT].AsString(work.About),
         matched[VAR_FROM].AsString("{0}.After".Args(GetType().FullName)),
         pars: matched.ToJson(JsonWritingOptions.CompactASCII)
         );
 }
예제 #4
0
        public void SortMapKeys()
        {
            var dict = new JsonDataMap()
            {
                { "z", 1 }, { "g", -2 }, { "a", 3 }, { "b", 7 }
            };

            var json = dict.ToJson(JsonWritingOptions.Compact);

            json.See();

            json = dict.ToJson(new JsonWritingOptions(JsonWritingOptions.Compact)
            {
                MapSortKeys = true
            });
            json.See();
            Aver.AreEqual(@"{""a"":3,""b"":7,""g"":-2,""z"":1}", json);
        }
예제 #5
0
        private MinIdpUserData processResponse(Guid rel, JsonDataMap response)
        {
            if (ComponentEffectiveLogLevel < MessageType.Trace)
            {
                WriteLog(MessageType.DebugA, nameof(processResponse), "#100 Got response", related: rel, pars: response.ToJson(JsonWritingOptions.CompactASCII));
            }

            var got = response.UnwrapPayloadObject();

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

            var dataMap = got as JsonDataMap;

            if (dataMap == null)
            {
                if (got is string ciphered && ciphered.IsNotNullOrWhiteSpace())
                {
                    if (ComponentEffectiveLogLevel < MessageType.Trace)
                    {
                        WriteLog(MessageType.DebugA, nameof(processResponse), "#150 Deciphering", related: rel, pars: ciphered);
                    }

                    var deciphered = MessageProtectionAlgorithm.NonNull(nameof(MessageProtectionAlgorithm))
                                     .UnprotectObject(ciphered);

                    if (deciphered == null)//returns null if message could not be deciphered
                    {
                        WriteLog(MessageType.Critical, nameof(processResponse), StringConsts.SECURITY_IDP_RESPONSE_DECIPHER_ERROR, related: rel);
                    }

                    dataMap = deciphered as JsonDataMap;
                }
                else
                {
                    var etext = StringConsts.SECURITY_IDP_PROTOCOL_ERROR.Args("unsupported `data` of type `{0}`".Args(got.GetType().Name));

                    if (ComponentEffectiveLogLevel < MessageType.Trace)
                    {
                        WriteLog(MessageType.DebugError, nameof(processResponse), "#155 " + etext, related: rel);
                    }

                    throw new SecurityException(etext);
                }
            }
예제 #6
0
        private ConfigSectionNode buildSection(string name, JsonDataMap sectData, ConfigSectionNode parent)
        {
            var value = sectData[SECTION_VALUE_ATTR].AsString();
            ConfigSectionNode result = parent == null ? new ConfigSectionNode(this, null, name, value)
                                              : parent.AddChildNode(name, value);

            foreach (var kvp in sectData)
            {
                if (kvp.Value is JsonDataMap)
                {
                    buildSection(kvp.Key, (JsonDataMap)kvp.Value, result);
                }
                else if (kvp.Value is JsonDataArray)
                {
                    var lst = (JsonDataArray)kvp.Value;
                    foreach (var lnode in lst)
                    {
                        if (lnode is JsonDataMap lmap)
                        {
                            buildSection(kvp.Key, lmap, result);
                        }
                        else
                        if (lnode is JsonDataArray larray)
                        {
                            throw new ConfigException(StringConsts.CONFIG_JSON_STRUCTURE_ERROR, new ConfigException("Bad structure: " + sectData.ToJson()));
                        }
                        else
                        {
                            result.AddAttributeNode(kvp.Key, "{0}".Args(lnode));
                        }
                    }
                }
                else
                {
                    if (!kvp.Key.EqualsIgnoreCase(SECTION_VALUE_ATTR))
                    {
                        result.AddAttributeNode(kvp.Key, kvp.Value);
                    }
                }
            }

            return(result);
        }
예제 #7
0
 public override string ToString() => m_Content.ToJson(JsonWritingOptions.CompactASCII);
예제 #8
0
파일: ErrorFilter.cs 프로젝트: lulzzz/azos
        /// <summary>
        /// Handles the exception by responding appropriately with error page with conditional level of details and logging
        /// </summary>
        public static void HandleException(WorkContext work,
                                           Exception error,
                                           OrderedRegistry <WorkMatch> showDumpMatches,
                                           OrderedRegistry <WorkMatch> logMatches,
                                           string securityRedirectURL    = null,
                                           string securityRedirectTarget = null,
                                           OrderedRegistry <WorkMatch> securityRedirectMatches = null,
                                           Type customPageType = null
                                           )
        {
            if (work == null || error == null)
            {
                return;
            }

            var showDump = showDumpMatches != null?
                           showDumpMatches.OrderedValues.Any(m => m.Make(work) != null) : false;

            if (work.Response.Buffered)
            {
                work.Response.CancelBuffered();
            }

            var json = false;

            if (work.Request != null && work.Request.AcceptTypes != null)//if needed for some edge HttpListener cases when Request or Request.AcceptTypes are null
            {
                json = work.Request.AcceptTypes.Any(at => at.EqualsIgnoreCase(ContentType.JSON));
            }

            var actual = error;

            if (actual is FilterPipelineException fpe)
            {
                actual = fpe.RootException;
            }

            if (actual is MvcException mvce)
            {
                actual = mvce.InnerException;
            }


            var securityError = Security.AuthorizationException.IsDenotedBy(actual);


            if (actual is IHttpStatusProvider httpStatusProvider)
            {
                work.Response.StatusCode        = httpStatusProvider.HttpStatusCode;
                work.Response.StatusDescription = httpStatusProvider.HttpStatusDescription;
            }
            else
            {
                if (securityError)
                {
                    work.Response.StatusCode        = WebConsts.STATUS_403;
                    work.Response.StatusDescription = WebConsts.STATUS_403_DESCRIPTION;
                }
                else
                {
                    work.Response.StatusCode        = WebConsts.STATUS_500;
                    work.Response.StatusDescription = WebConsts.STATUS_500_DESCRIPTION;
                }
            }


            if (json)
            {
                work.Response.ContentType = ContentType.JSON;
                work.Response.WriteJSON(error.ToClientResponseJSONMap(showDump));
            }
            else
            {
                if (securityRedirectMatches != null && securityRedirectMatches.Count > 0)
                {
                    JsonDataMap matched = null;
                    foreach (var match in securityRedirectMatches.OrderedValues)
                    {
                        matched = match.Make(work, actual);
                        if (matched != null)
                        {
                            break;
                        }
                    }
                    if (matched != null)
                    {
                        var url    = matched[VAR_SECURITY_REDIRECT_URL].AsString();
                        var target = matched[VAR_SECURITY_REDIRECT_TARGET].AsString();

                        if (url.IsNotNullOrWhiteSpace())
                        {
                            securityRedirectURL = url;
                        }
                        if (target.IsNotNullOrWhiteSpace())
                        {
                            securityRedirectTarget = target;
                        }
                    }
                }

                if (securityRedirectURL.IsNotNullOrWhiteSpace() && securityError && !work.IsAuthenticated)
                {
                    var url    = securityRedirectURL;
                    var target = securityRedirectTarget;
                    if (target.IsNotNullOrWhiteSpace())
                    {
                        var partsA = url.Split('#');
                        var parts  = partsA[0].Split('?');
                        var query  = parts.Length > 1 ? parts[0] + "&" : string.Empty;
                        url = "{0}?{1}{2}={3}{4}".Args(parts[0], query,
                                                       target, Uri.EscapeDataString(work.Request.Url.PathAndQuery),
                                                       partsA.Length > 1 ? "#" + partsA[1] : string.Empty);
                    }
                    work.Response.RedirectAndAbort(url);
                }
                else
                {
                    WaveTemplate errorPage = null;

                    if (customPageType != null)
                    {
                        try
                        {
                            errorPage = Activator.CreateInstance(customPageType) as WaveTemplate;
                            if (errorPage == null)
                            {
                                throw new WaveException("not WaveTemplate");
                            }
                        }
                        catch (Exception actErr)
                        {
                            work.Log(Log.MessageType.Error,
                                     StringConsts.ERROR_PAGE_TEMPLATE_TYPE_ERROR.Args(customPageType.FullName, actErr.ToMessageWithType()),
                                     typeof(ErrorFilter).FullName + ".ctor(customPageType)",
                                     actErr);
                        }
                    }

                    if (errorPage == null)
                    {
                        errorPage = new ErrorPage(work, error, showDump);
                    }

                    errorPage.Render(work, error);
                }
            }

            if (logMatches != null && logMatches.Count > 0)
            {
                JsonDataMap matched = null;
                foreach (var match in logMatches.OrderedValues)
                {
                    matched = match.Make(work, error);
                    if (matched != null)
                    {
                        break;
                    }
                }
                if (matched != null)
                {
                    work.Log(Log.MessageType.Error, error.ToMessageWithType(), typeof(ErrorFilter).FullName, pars: matched.ToJson(JsonWritingOptions.CompactASCII));
                }
            }
        }
예제 #9
0
        protected override void DoEncodeRequest(MemoryStream ms, RequestMsg msg)
        {
            if (msg.Contract != typeof(Contracts.IRemoteTerminal))
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding),
                                                                                                      nameof(Contracts.IRemoteTerminal),
                                                                                                      msg.Contract.FullName));
            }

            var request = msg as RequestAnyMsg;

            if (request == null)
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding),
                                                                                                      nameof(RequestAnyMsg),
                                                                                                      msg.GetType().FullName));
            }


            var data = new JsonDataMap();

            data["id"]       = request.RequestID.ID;
            data["instance"] = request.RemoteInstance?.ToString("D");
            data["method"]   = request.MethodName;
            data["one-way"]  = false;//reserved for future use

            if (request.Arguments != null && request.Arguments.Length > 0)
            {
                data["command"] = request.Arguments[0];
            }
            else
            {
                data["command"] = null;
            }

            //Handle headers, this binding allows ONLY for AuthenticationHeader with supported tokens/credentials
            if (request.HasHeaders)
            {
                if (request.Headers.Count > 1)
                {
                    throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding),
                                                                                                          "1 AuthenticationHeader",
                                                                                                          request.Headers.Count));
                }
                var ahdr = request.Headers[0] as AuthenticationHeader;
                if (ahdr == null)
                {
                    throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding),
                                                                                                          "1 AuthenticationHeader",
                                                                                                          request.Headers[0].GetType().FullName));
                }

                if (ahdr.Token.Assigned)
                {
                    data["auth-token"] = ahdr.Token.ToString();
                }

                if (ahdr.Credentials != null)
                {
                    var src = ahdr.Credentials as Azos.Security.IStringRepresentableCredentials;
                    if (src == null)
                    {
                        throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding),
                                                                                                              "IStringRepresentableCredentials",
                                                                                                              ahdr.Credentials.GetType().FullName));
                    }
                    data["auth-cred"] = src.RepresentAsString();
                }
            }

            var json = data.ToJson(JsonWritingOptions.Compact);
            var utf8 = Encoding.UTF8.GetBytes(json);

            ms.Write(utf8, 0, utf8.Length);
        }
예제 #10
0
파일: ErrorFilter.cs 프로젝트: erxdkh/azos
        /// <summary>
        /// Handles the exception by responding appropriately with error page with conditional level of details and logging
        /// </summary>
        public static void HandleException(WorkContext work,
                                           Exception error,
                                           OrderedRegistry <WorkMatch> showDumpMatches,
                                           OrderedRegistry <WorkMatch> logMatches,
                                           string securityRedirectURL    = null,
                                           string securityRedirectTarget = null,
                                           OrderedRegistry <WorkMatch> securityRedirectMatches = null,
                                           Type customPageType = null
                                           )
        {
            if (work == null || error == null)
            {
                return;
            }

            var showDump = showDumpMatches != null?
                           showDumpMatches.OrderedValues.Any(m => m.Make(work) != null) : false;

            if (work.Response.Buffered)
            {
                work.Response.CancelBuffered();
            }

            var json = false;

            if (work.Request != null && work.Request.AcceptTypes != null)//if needed for some edge HttpListener cases when Request or Request.AcceptTypes are null
            {
                json = work.Request.AcceptTypes.Any(at => at.EqualsIgnoreCase(ContentType.JSON));
            }

            var actual = error;

            if (actual is FilterPipelineException fpe)
            {
                actual = fpe.RootException;
            }

            if (actual is MvcException mvce)
            {
                actual = mvce.InnerException;
            }


            var securityError = Security.AuthorizationException.IsDenotedBy(error);

            var hsp = error.SearchThisOrInnerExceptionOf <IHttpStatusProvider>();

            if (hsp != null)
            {
                work.Response.StatusCode        = hsp.HttpStatusCode;
                work.Response.StatusDescription = hsp.HttpStatusDescription;
            }
            else
            {
                if (securityError)
                {
                    work.Response.StatusCode        = WebConsts.STATUS_403;
                    work.Response.StatusDescription = WebConsts.STATUS_403_DESCRIPTION;
                }
                else
                {
                    work.Response.StatusCode        = WebConsts.STATUS_500;
                    work.Response.StatusDescription = WebConsts.STATUS_500_DESCRIPTION;
                }
            }


            if (json)
            {
                work.Response.ContentType = ContentType.JSON;
                work.Response.WriteJSON(error.ToClientResponseJsonMap(showDump), JsonWritingOptions.PrettyPrintRowsAsMap);
            }
            else
            {
                if (securityRedirectMatches != null && securityRedirectMatches.Count > 0)
                {
                    JsonDataMap matched = null;
                    foreach (var match in securityRedirectMatches.OrderedValues)
                    {
                        matched = match.Make(work, actual);
                        if (matched != null)
                        {
                            break;
                        }
                    }
                    if (matched != null)
                    {
                        var url    = matched[VAR_SECURITY_REDIRECT_URL].AsString();
                        var target = matched[VAR_SECURITY_REDIRECT_TARGET].AsString();

                        if (url.IsNotNullOrWhiteSpace())
                        {
                            securityRedirectURL = url;
                        }
                        if (target.IsNotNullOrWhiteSpace())
                        {
                            securityRedirectTarget = target;
                        }
                    }
                }

                if (securityRedirectURL.IsNotNullOrWhiteSpace() && securityError && !work.IsAuthenticated)
                {
                    var url    = securityRedirectURL;
                    var target = securityRedirectTarget;
                    if (target.IsNotNullOrWhiteSpace())
                    {
                        var partsA = url.Split('#');
                        var parts  = partsA[0].Split('?');
                        var query  = parts.Length > 1 ? parts[0] + "&" : string.Empty;
                        url = "{0}?{1}{2}={3}{4}".Args(parts[0], query,
                                                       target, Uri.EscapeDataString(work.Request.Url.PathAndQuery),
                                                       partsA.Length > 1 ? "#" + partsA[1] : string.Empty);
                    }
                    work.Response.RedirectAndAbort(url);
                }
                else
                {
                    WaveTemplate errorPage = null;

                    if (customPageType != null)
                    {
                        try
                        {
                            //20201130 DKh fix #376
                            var simpleCtor = customPageType.GetConstructor(new Type[] { typeof(Exception), typeof(bool) }) == null;
                            errorPage = (simpleCtor ? Activator.CreateInstance(customPageType) :
                                         Activator.CreateInstance(customPageType, error, showDump)
                                         ) as WaveTemplate;//fix #376

                            if (errorPage == null)
                            {
                                throw new WaveException("not a {0}".Args(nameof(WaveTemplate)));
                            }
                        }
                        catch (Exception actErr)
                        {
                            work.Log(Log.MessageType.Error,
                                     StringConsts.ERROR_PAGE_TEMPLATE_TYPE_ERROR.Args(customPageType.FullName, actErr.ToMessageWithType()),
                                     typeof(ErrorFilter).FullName + ".ctor(customPageType)",
                                     actErr);
                        }
                    }

                    if (errorPage == null)
                    {
                        errorPage = new ErrorPage(error, showDump);
                    }

                    errorPage.Render(work, error);
                }
            }

            if (logMatches != null && logMatches.Count > 0)
            {
                JsonDataMap matched = null;
                foreach (var match in logMatches.OrderedValues)
                {
                    matched = match.Make(work, error);
                    if (matched != null)
                    {
                        break;
                    }
                }
                if (matched != null)
                {
                    matched["$ip"]   = work.EffectiveCallerIPEndPoint.ToString();
                    matched["$ua"]   = work.Request.UserAgent.TakeFirstChars(78, "..");
                    matched["$mtd"]  = work.Request.HttpMethod;
                    matched["$uri"]  = work.Request.Url.ToString().TakeFirstChars(78, "..");
                    matched["$ref"]  = work.Request.UrlReferrer?.ToString().TakeFirstChars(78, "..");
                    matched["$stat"] = "{0}/{1}".Args(work.Response.StatusCode, work.Response.StatusDescription);

                    if (work.Portal != null)
                    {
                        matched["$portal"] = work.Portal.Name;
                    }

                    if (work.GeoEntity != null)
                    {
                        matched["$geo"] = work.GeoEntity.LocalityName;
                    }

                    work.Log(Log.MessageType.Error, error.ToMessageWithType(), typeof(ErrorFilter).FullName, pars: matched.ToJson(JsonWritingOptions.CompactASCII));
                }
            }
        }
예제 #11
0
 public override string ToString()
 {
     return(m_Content.ToJson());
 }