Example #1
0
        public Yield GetSiteFunctions(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
            if(UserBL.IsAnonymous(DekiContext.Current.User)) {
                throw new SiteMustBeLoggedInForbiddenException();
            }

            // build set of libraries
            List<XDoc> libraries = DekiContext.Current.Instance.RunningServices.ExtensionServices
                .Select(x => x.Extension.Manifest).ToList();

            // add registered libraries
            libraries.Sort((left, right) => left["title"].Contents.CompareInvariantIgnoreCase(right["title"].Contents));

            // add built-in functions
            XDoc builtinlib = new XDoc("extension");
            builtinlib.Elem("title", "Built-in Functions");
            builtinlib.Elem("label", "Built-in");
            builtinlib.Elem("uri.help", "http://wiki.developer.mindtouch.com/MindTouch_Deki/DekiScript/Reference");
            builtinlib.Elem("description", "The following functions and variables are part the DekiScript and MindTouch runtime environment.");
            foreach(var function in ScriptRuntime.Functions.Values) {
                if(function.Access == DreamAccess.Public) {
                    builtinlib.Add(function.ToXml(null));
                }
            }
            libraries.Insert(0, builtinlib);

            // create composite document
            bool hasUnsafeContentPermission = PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.UNSAFECONTENT);
            XDoc extensions = new XDoc("extensions").AddAll(libraries);
            foreach(XDoc extension in extensions["extension"]) {
                XUri serviceUri = extension["@uri"].AsUri;

                // check if extension is protected
                bool @protected;
                bool.TryParse(ExtensionBL.GetExtensionPreference(serviceUri, "protected"), out @protected);
                if(@protected) {
                    if(!hasUnsafeContentPermission) {
                        extension.Remove();
                        continue;
                    }
                    extension.Attr("protected", @protected);
                }

                // read overwriteable settings
                AddOrReplace(extension, "title", ExtensionBL.GetExtensionPreference(serviceUri, "title.custom"));
                AddOrReplace(extension, "label", ExtensionBL.GetExtensionPreference(serviceUri, "label.custom"));
                AddOrReplace(extension, "uri.logo", ExtensionBL.GetExtensionPreference(serviceUri, "uri.logo.custom"));
                AddOrReplace(extension, "namespace", ExtensionBL.GetExtensionPreference(serviceUri, "namespace.custom"));
                extension.Elem("description.custom", ExtensionBL.GetExtensionPreference(serviceUri, "description.custom"));

                // check which functions to keep
                string[] allowedFunctions = (ExtensionBL.GetExtensionPreference(serviceUri, "functions") ?? string.Empty).Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
                if(allowedFunctions.Length > 0) {
                    foreach(XDoc function in extension["function"]) {

                        // check if user specified a list of functions to show
                        string name = function["name"].Contents;
                        if(Array.FindIndex(allowedFunctions, current => current.EqualsInvariantIgnoreCase(name)) < 0) {
                            function.Remove();
                        }
                    }
                }

                // check if extension has any functions
                if(extension["function"].ListLength == 0) {
                    extension.Remove();
                }
            }

            // build response document
            string format = context.GetParam("format", "html");
            if(StringUtil.EqualsInvariant(format, "xml")) {
                response.Return(DreamMessage.Ok(extensions));
            } else {

                // prepare document
                string header = string.Format("{0} - Registered Extensions", DekiContext.Current.Instance.SiteName);
                XDoc result = new XDoc("html").Attr("xmlns", "http://www.w3.org/1999/xhtml")
                    .Start("head")
                        .Elem("title", header)
                        .Start("meta").Attr("http-equiv", "content-type").Attr("content", "text/html;charset=utf-8").End()
                    .End();
                result.Start("body");
                result.Elem("h1", header);

                // build table of contents
                result.Elem("strong", "Table of Contents");
                result.Start("ol");
                int count = 0;
                foreach(XDoc library in extensions["extension"]) {
                    ++count;
                    XUri serviceUri = library["@uri"].AsUri;
                    result.Start("li")
                        .Start("a")
                            .Attr("href", "#section" + count)
                            .Value(ExtensionBL.GetExtensionPreference(serviceUri, "title.custom") ?? library["title"].AsText)
                        .End()
                    .End();
                }
                result.End();

                // enumerate libraries
                count = 0;
                foreach(XDoc library in extensions["extension"]) {
                    ++count;

                    // read overwriteable settings
                    string title = library["title"].AsText;
                    string logo = library["uri.logo"].AsText;
                    string ns = library["namespace"].AsText;
                    bool @protected = library["@protected"].AsBool ?? false;

                    // show & link library name
                    result.Start("h2").Attr("id", "section" + count);
                    if(!string.IsNullOrEmpty(library["uri.help"].AsText)) {
                        result.Start("a").Attr("href", library["uri.help"].AsText).Attr("target", "_blank").Attr("title", library["title"].AsText + " Documentation").Value(title).End();
                    } else {
                        result.Value(title);
                    }
                    if(@protected) {
                        var resources = DekiContext.Current.Resources;
                        var builder = new DekiResourceBuilder();
                        builder.Append(" (");
                        builder.Append(DekiResources.PROTECTED());
                        builder.Append(")");
                        result.Value(builder.Localize(resources));
                    }
                    result.End();

                    // show optional logo
                    if(!string.IsNullOrEmpty(logo)) {
                        result.Start("img").Attr("src", logo).Attr("alt", title).End();
                    }

                    // show descriptions
                    if(library["uri.license"].AsText != null) {
                        result.Start("a").Attr("href", library["uri.license"].AsText).Attr("target", "_blank").Value("Read Library License").End();
                    }
                    if(!string.IsNullOrEmpty(library["description"].AsText)) {
                        result.Elem("p", library["description"].AsText);
                    }
                    if(!string.IsNullOrEmpty(library["description.custom"].AsText)) {
                        result.Elem("p", library["description.custom"].AsText);
                    }

                    // enumerate library functions
                    XDoc functions = new XDoc("functions").AddAll(library["function"]);
                    functions.Sort(delegate(XDoc left, XDoc right) {
                        return StringUtil.CompareInvariantIgnoreCase(left["name"].Contents, right["name"].Contents);
                    });
                    foreach(XDoc function in functions["function"]) {
                        AddFunction(result, ns, function);
                    }
                }
                result.End();
                switch(format) {
                default:
                case "html":
                    response.Return(DreamMessage.Ok(MimeType.HTML, result.ToString()));
                    break;
                case "body":
                    response.Return(DreamMessage.Ok(MimeType.TEXT_UTF8, result["body"].Contents));
                    break;
                }
            }
            yield break;
        }
Example #2
0
        public Yield GetSiteFunctions(DreamContext context, DreamMessage request, Result <DreamMessage> response)
        {
            if (UserBL.IsAnonymous(DekiContext.Current.User))
            {
                throw new SiteMustBeLoggedInForbiddenException();
            }

            // build set of libraries
            List <XDoc> libraries = DekiContext.Current.Instance.RunningServices.ExtensionServices
                                    .Select(x => x.Extension.Manifest).ToList();

            // add registered libraries
            libraries.Sort((left, right) => left["title"].Contents.CompareInvariantIgnoreCase(right["title"].Contents));

            // add built-in functions
            XDoc builtinlib = new XDoc("extension");

            builtinlib.Elem("title", "Built-in Functions");
            builtinlib.Elem("label", "Built-in");
            builtinlib.Elem("uri.help", "http://wiki.developer.mindtouch.com/MindTouch_Deki/DekiScript/Reference");
            builtinlib.Elem("description", "The following functions and variables are part the DekiScript and MindTouch runtime environment.");
            foreach (var function in ScriptRuntime.Functions.Values)
            {
                if (function.Access == DreamAccess.Public)
                {
                    builtinlib.Add(function.ToXml(null));
                }
            }
            libraries.Insert(0, builtinlib);

            // create composite document
            bool hasUnsafeContentPermission = PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.UNSAFECONTENT);
            XDoc extensions = new XDoc("extensions").AddAll(libraries);

            foreach (XDoc extension in extensions["extension"])
            {
                XUri serviceUri = extension["@uri"].AsUri;

                // check if extension is protected
                bool @protected;
                bool.TryParse(ExtensionBL.GetExtensionPreference(serviceUri, "protected"), out @protected);
                if (@protected)
                {
                    if (!hasUnsafeContentPermission)
                    {
                        extension.Remove();
                        continue;
                    }
                    extension.Attr("protected", @protected);
                }

                // read overwriteable settings
                AddOrReplace(extension, "title", ExtensionBL.GetExtensionPreference(serviceUri, "title.custom"));
                AddOrReplace(extension, "label", ExtensionBL.GetExtensionPreference(serviceUri, "label.custom"));
                AddOrReplace(extension, "uri.logo", ExtensionBL.GetExtensionPreference(serviceUri, "uri.logo.custom"));
                AddOrReplace(extension, "namespace", ExtensionBL.GetExtensionPreference(serviceUri, "namespace.custom"));
                extension.Elem("description.custom", ExtensionBL.GetExtensionPreference(serviceUri, "description.custom"));

                // check which functions to keep
                string[] allowedFunctions = (ExtensionBL.GetExtensionPreference(serviceUri, "functions") ?? string.Empty).Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (allowedFunctions.Length > 0)
                {
                    foreach (XDoc function in extension["function"])
                    {
                        // check if user specified a list of functions to show
                        string name = function["name"].Contents;
                        if (Array.FindIndex(allowedFunctions, current => current.EqualsInvariantIgnoreCase(name)) < 0)
                        {
                            function.Remove();
                        }
                    }
                }

                // check if extension has any functions
                if (extension["function"].ListLength == 0)
                {
                    extension.Remove();
                }
            }

            // build response document
            string format = context.GetParam("format", "html");

            if (StringUtil.EqualsInvariant(format, "xml"))
            {
                response.Return(DreamMessage.Ok(extensions));
            }
            else
            {
                // prepare document
                string header = string.Format("{0} - Registered Extensions", DekiContext.Current.Instance.SiteName);
                XDoc   result = new XDoc("html").Attr("xmlns", "http://www.w3.org/1999/xhtml")
                                .Start("head")
                                .Elem("title", header)
                                .Start("meta").Attr("http-equiv", "content-type").Attr("content", "text/html;charset=utf-8").End()
                                .End();
                result.Start("body");
                result.Elem("h1", header);

                // build table of contents
                result.Elem("strong", "Table of Contents");
                result.Start("ol");
                int count = 0;
                foreach (XDoc library in extensions["extension"])
                {
                    ++count;
                    XUri serviceUri = library["@uri"].AsUri;
                    result.Start("li")
                    .Start("a")
                    .Attr("href", "#section" + count)
                    .Value(ExtensionBL.GetExtensionPreference(serviceUri, "title.custom") ?? library["title"].AsText)
                    .End()
                    .End();
                }
                result.End();

                // enumerate libraries
                count = 0;
                foreach (XDoc library in extensions["extension"])
                {
                    ++count;

                    // read overwriteable settings
                    string title      = library["title"].AsText;
                    string logo       = library["uri.logo"].AsText;
                    string ns         = library["namespace"].AsText;
                    bool   @protected = library["@protected"].AsBool ?? false;

                    // show & link library name
                    result.Start("h2").Attr("id", "section" + count);
                    if (!string.IsNullOrEmpty(library["uri.help"].AsText))
                    {
                        result.Start("a").Attr("href", library["uri.help"].AsText).Attr("target", "_blank").Attr("title", library["title"].AsText + " Documentation").Value(title).End();
                    }
                    else
                    {
                        result.Value(title);
                    }
                    if (@protected)
                    {
                        var resources = DekiContext.Current.Resources;
                        var builder   = new DekiResourceBuilder();
                        builder.Append(" (");
                        builder.Append(DekiResources.PROTECTED());
                        builder.Append(")");
                        result.Value(builder.Localize(resources));
                    }
                    result.End();

                    // show optional logo
                    if (!string.IsNullOrEmpty(logo))
                    {
                        result.Start("img").Attr("src", logo).Attr("alt", title).End();
                    }

                    // show descriptions
                    if (library["uri.license"].AsText != null)
                    {
                        result.Start("a").Attr("href", library["uri.license"].AsText).Attr("target", "_blank").Value("Read Library License").End();
                    }
                    if (!string.IsNullOrEmpty(library["description"].AsText))
                    {
                        result.Elem("p", library["description"].AsText);
                    }
                    if (!string.IsNullOrEmpty(library["description.custom"].AsText))
                    {
                        result.Elem("p", library["description.custom"].AsText);
                    }

                    // enumerate library functions
                    XDoc functions = new XDoc("functions").AddAll(library["function"]);
                    functions.Sort(delegate(XDoc left, XDoc right) {
                        return(StringUtil.CompareInvariantIgnoreCase(left["name"].Contents, right["name"].Contents));
                    });
                    foreach (XDoc function in functions["function"])
                    {
                        AddFunction(result, ns, function);
                    }
                }
                result.End();
                switch (format)
                {
                default:
                case "html":
                    response.Return(DreamMessage.Ok(MimeType.HTML, result.ToString()));
                    break;

                case "body":
                    response.Return(DreamMessage.Ok(MimeType.TEXT_UTF8, result["body"].Contents));
                    break;
                }
            }
            yield break;
        }