public Yield PostBans(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     PermissionsBL.CheckUserAllowed(DekiContext.Current.User, Permissions.ADMIN);
     BanBE ban = BanningBL.SaveBan(request.ToDocument());
     DekiContext.Current.Instance.EventSink.BanCreated(context.StartTime, ban);
     response.Return(DreamMessage.Ok(BanningBL.GetBanXml(ban)));
     yield break;
 }
 public Yield SetPageTags(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     PageBE page = PageBL.AuthorizePage(DekiContext.Current.User, Permissions.UPDATE, false);
     XUri href = DekiContext.Current.ApiUri.At("pages", page.ID.ToString(), "tags");
     TagBL.PutTagsFromXml(page, request.ToDocument());
     XDoc doc = TagBL.GetTagListXml(TagBL.GetTagsForPage(page), "tags", href, false);
     response.Return(DreamMessage.Ok(doc));
     yield break;
 }
 public Yield GetPageAllowedUsers(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     List<uint> userids = new List<uint>();
     if(request.HasDocument) {
         foreach(XDoc userid in request.ToDocument()["user/@id"]) {
             uint? id = userid.AsUInt;
             if(id.HasValue) {
                 userids.Add(id.Value);
             } else {
                 throw new DreamBadRequestException(string.Format("'{0}' is not a valid userid", userid.AsText));
             }
         }
     }
     if(userids.Count == 0) {
         throw new DreamBadRequestException("must provide at least one userid");
     }
     string permissionsList = context.GetParam("permissions");
     bool filterDisabled = context.GetParam("filterdisabled", false);
     if(filterDisabled) {
         List<uint> activeUsers = new List<uint>();
         foreach(UserBE user in DbUtils.CurrentSession.Users_GetByIds(userids)) {
             if(user.UserActive) {
                 activeUsers.Add(user.ID);
             }
         }
         userids = activeUsers;
         if(userids.Count == 0) {
             response.Return(DreamMessage.Ok(new XDoc("users")));
             yield break;
         }
     }
     Permissions permissions = Permissions.READ;
     if(!string.IsNullOrEmpty(permissionsList)) {
         bool first = true;
         foreach(string perm in permissionsList.Split(',')) {
             Permissions p;
             if(!SysUtil.TryParseEnum(perm, out p)) {
                 throw new DreamBadRequestException(string.Format("'{0}' is not a valid permission value", perm));
             }
             if(first) {
                 permissions = p;
             } else {
                 permissions |= p;
             }
             first = false;
         }
     }
     uint[] filteredIds = PermissionsBL.FilterDisallowed(userids.ToArray(), context.GetParam<uint>("pageid"), false, permissions);
     XDoc msg = new XDoc("users");
     foreach(int userid in filteredIds) {
         msg.Start("user").Attr("id", userid).End();
     }
     response.Return(DreamMessage.Ok(msg));
     yield break;
 }
Example #4
0
 internal IEnumerator<IYield> QueueUpdateTemplates(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     var doc = request.ToDocument();
     var wikiId = doc["@wikiid"].AsText;
     var channel = doc["channel"].AsText;
     _log.DebugFormat("received event '{0}' from '{1}'", channel, wikiId);
     if(!_processingQueue.TryEnqueue(doc)) {
         throw new InvalidOperationException("Enqueue of update event failed.");
     }
     response.Return(DreamMessage.Ok());
     yield break;
 }
 internal IEnumerator<IYield> PostUpdateTemplates(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     var doc = request.ToDocument();
     var wikiId = doc["@wikiid"].AsText;
     var apiUri = doc["uri"].AsText;
     var apiPlug = CreateApiPlug(apiUri, wikiId);
     _log.DebugFormat("received manual tickle from '{0}' @ '{1}'", wikiId, apiUri);
     XDoc importReport = null;
     yield return GetInstance(wikiId, true).UpdatePackages(apiPlug, _apikey, new Result<XDoc>()).Set(x => importReport = x);
     response.Return(DreamMessage.Ok(importReport));
     yield break;
 }
        internal Yield QueuePurge(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
            XDoc doc = request.ToDocument();
            XUri channel = doc["channel"].AsUri;
            string action = channel.Segments[2];

            // there are certain sub-events we don't use to trigger on
            if(action != "view") {
                _updateDelayQueue.Enqueue(doc);
            }
            response.Return(DreamMessage.Ok());
            yield break;
        }
        public Yield PutUser(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
            UserBE user = GetUserFromUrl();

            //Authorization is performed later.
            if (user == null) {
                throw new DreamAbortException(DreamMessage.NotFound(DekiResources.GIVEN_USER_NOT_FOUND_USE_POST));
            }
            string accountPassword = context.GetParam("accountpassword", null);
            user = UserBL.PostUserFromXml(request.ToDocument(), user, accountPassword, context.GetParam("authusername", null), context.GetParam("authpassword", null));
            response.Return(DreamMessage.Ok(UserBL.GetUserXmlVerbose(user, null, Utils.ShowPrivateUserInfo(user))));
            yield break;
        }
Example #8
0
 public Yield PostGroupUsers(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     PermissionsBL.CheckUserAllowed(DekiContext.Current.User, Permissions.ADMIN);
     GroupBE group = GetGroupFromUrl();
     group = GroupBL.AddGroupMembers(group, request.ToDocument());
     response.Return(DreamMessage.Ok(GroupBL.GetGroupXmlVerbose(group, null)));
     yield break;
 }
Example #9
0
        //--- Constructors ---
        /// <summary>
        /// Serialize message into Xml.
        /// </summary>
        /// <param name="message">Message to serialize.</param>
        public XMessage(DreamMessage message)
            : base("message")
        {
            Elem("status", (int)message.Status);
            Start("headers");
            foreach(KeyValuePair<string, string> pair in message.Headers) {
                Elem(pair.Key, pair.Value ?? string.Empty);
            }
            if(message.HasCookies) {
                foreach(DreamCookie cookie in message.Cookies) {

                    // NOTE (steveb): we rely on the 'Version' being set to differentiate between 'Cookie' and a 'Set-Cookie' headers

                    if(cookie.Version != 0) {
                        Add(cookie.AsSetCookieDocument);
                    } else {
                        Add(cookie.AsCookieDocument);
                    }
                }
            }
            End();
            Start("body");
            if(message.HasDocument) {
                Attr("format", "xml").Add(message.ToDocument());
            } else {
                byte[] bytes = message.ToBytes();
                string body = null;
                string attr = "none";

                // TODO (steveb): we need to use a content-type matching algorithm and match against all known text types (text/*, application/json, etc.)
                if(bytes.Length > 0) {
                    if(message.ContentType.Match(MimeType.ANY_TEXT)) {
                        body = message.ContentType.CharSet.GetString(bytes).EncodeHtmlEntities(Encoding.UTF8, false);
                        attr = "text";
                    } else {
                        body = Convert.ToBase64String(bytes);
                        attr = "base64";
                    }
                }
                Attr("format", attr).Value(body);
            }
            End();
        }
Example #10
0
 internal Yield PostGrant(DreamContext context, DreamMessage request, Result<DreamMessage> response)
 {
     lock(Cookies) {
         Cookies.Update(DreamCookie.ParseAllSetCookieNodes(request.ToDocument()), null);
     }
     response.Return(DreamMessage.Ok());
     yield break;
 }
Example #11
0
 private void rc_moved_to_title_check(DreamMessage msg, string path)
 {
     string pathMeta = msg.ToDocument()["change/rc_moved_to_title"].AsText ?? String.Empty;
     Assert.AreEqual(path, pathMeta, "Unexpected rc_moved_to_title");
 }
Example #12
0
 private void rc_type_check(DreamMessage msg, int t)
 {
     int typeMeta = msg.ToDocument()["change/rc_type"].AsInt ?? -1;
     Assert.AreEqual(t, typeMeta, "Unexpected rc_type");
 }
Example #13
0
 private void cmnt_content_mimetype_check(DreamMessage msg, string cmnt_content_mimetype)
 {
     string cmnt_content_mimetype_meta = msg.ToDocument()["change/cmnt_content_mimetype"].AsText ?? String.Empty;
     Assert.AreEqual(cmnt_content_mimetype, cmnt_content_mimetype_meta, "Unexpected cmnt_content_mimetype");
 }
Example #14
0
 private void cmnt_number_check(DreamMessage msg, int cmnt_number)
 {
     int cmnt_number_meta = msg.ToDocument()["change/cmnt_number"].AsInt ?? 0;
     Assert.AreEqual(cmnt_number, cmnt_number_meta, "Unexpected cmnt_number");
 }
Example #15
0
 private void rc_summary_check(DreamMessage msg, string summary)
 {
     string sumMeta = msg.ToDocument()["change/rc_summary"].AsText ?? String.Empty;
     Assert.AreEqual(summary.ToLower(), sumMeta.ToLower(), "Unexpected rc_summary");
 }
Example #16
0
 private void rc_timestamp_check(DreamMessage msg, string timestamp)
 {
     string timestampMeta = msg.ToDocument()["change/rc_timestamp"].AsText ?? String.Empty;
     Assert.AreEqual(timestamp, timestampMeta, "Unexpected rc_timestamp");
 }
Example #17
0
 private void cmnt_deleted_check(DreamMessage msg, int deleted)
 {
     int delMeta = msg.ToDocument()["change/cmnt_deleted"].AsInt ?? -1;
     Assert.AreEqual(deleted, delMeta, "Unexpected cmnt_deleted");
 }
Example #18
0
 private void rc_moved_to_ns_check(DreamMessage msg, int ns)
 {
     int nsMeta = msg.ToDocument()["change/rc_moved_to_ns"].AsInt ?? -1;
     Assert.AreEqual(ns, nsMeta, "Unexpected rc_moved_to_ns");
 }
Example #19
0
 private void old_is_hidden_check(DreamMessage msg, bool old_is_hidden)
 {
     bool? old_is_hidden_meta = msg.ToDocument()["change/old_is_hidden"].AsBool;
     Assert.IsTrue(old_is_hidden == old_is_hidden_meta, "Unexpected old_is_hidden");
 }
Example #20
0
 private void rc_user_name_check(DreamMessage msg, string user)
 {
     string userMeta = msg.ToDocument()["change/rc_user_name"].AsText.ToLower() ?? String.Empty;
     Assert.AreEqual(user.ToLower(), userMeta.ToLower(), "Unexpected rc_user_name");
 }
Example #21
0
 private void rc_id_check(DreamMessage msg)
 {
     int rc_id = msg.ToDocument()["change/rc_id"].AsInt ?? 0;
     Assert.IsTrue(rc_id > 0, "Invalid feed rc_id");
 }
Example #22
0
        protected virtual Yield PutConfig(DreamContext context, DreamMessage request, Result<DreamMessage> response)
        {
            XDoc config = request.ToDocument();
            if(config.Name != "config") {
                throw new DreamBadRequestException("bad document type");
            }
            if(IsStarted) {
                throw new DreamBadRequestException("service must be stopped first");
            }
            _timerFactory = TaskTimerFactory.Create(this);

            // configure service container
            var lifetimeScope = _env.CreateServiceLifetimeScope(this, (c, b) => PreInitializeLifetimeScope(c, b, config));

            // call container-less start (which contains shared start logic)
            yield return Coroutine.Invoke(Start, request.ToDocument(), new Result());

            // call start with container for sub-classes that want to resolve instances at service start
            yield return Coroutine.Invoke(Start, config, lifetimeScope, new Result());

            response.Return(DreamMessage.Ok(new XDoc("service-info")
                .Start("private-key")
                    .Add(DreamCookie.NewSetCookie("service-key", PrivateAccessKey, Self.Uri).AsSetCookieDocument)
                .End()
                .Start("internal-key")
                    .Add(DreamCookie.NewSetCookie("service-key", InternalAccessKey, Self.Uri).AsSetCookieDocument)
                .End()
               ));
        }
Example #23
0
 private void rc_comment_check(DreamMessage msg, string comment)
 {
     string commentMeta = msg.ToDocument()["change/rc_comment"].AsText ?? String.Empty;
     Assert.AreEqual(comment, commentMeta, "Unexpected rc_comment");
 }
Example #24
0
 public Yield PostGroup(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
     PermissionsBL.CheckUserAllowed(DekiContext.Current.User, Permissions.ADMIN);
     DreamMessage responseMsg = null;
     GroupBE group = GroupBL.PostGroupFromXml(request.ToDocument(), null, context.GetParam("authusername", null), context.GetParam("authpassword", null));
     responseMsg = DreamMessage.Ok(GroupBL.GetGroupXmlVerbose(group, null));
     response.Return(responseMsg);
     yield break;
 }
Example #25
0
 private void rc_this_oldid_check(DreamMessage msg, int oldid)
 {
     int oldidMeta = msg.ToDocument()["change/rc_this_oldid"].AsInt ?? 0;
     Assert.AreEqual(oldid, oldidMeta, "Unexpected rc_last_oldid");
 }
Example #26
0
 private static object GetRequestAsDocument(DreamContext context, DreamMessage request, Result <DreamMessage> response)
 {
     return(request.ToDocument());
 }
Example #27
0
 private void rc_cur_id_check(DreamMessage msg, int id)
 {
     int rc_cur_id = msg.ToDocument()["change/rc_cur_id"].AsInt ?? 0;
     Assert.AreEqual(id, rc_cur_id, "Unexpected rc_cur_id");
 }
        public Yield PostUser(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
            if(!PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.ADMIN)) {
                throw new DreamForbiddenException("Must provide an apikey or admin authtoken to create a user");
            }
            UserBE user = null;

            //Authorization is performed later.
            string accountPassword = context.GetParam("accountpassword", null);

            //standard user creation/editing
            user = UserBL.PostUserFromXml(request.ToDocument(), null, accountPassword, context.GetParam("authusername", null), context.GetParam("authpassword", null));
            response.Return(DreamMessage.Ok(UserBL.GetUserXmlVerbose(user, null, Utils.ShowPrivateUserInfo(user))));
            yield break;
        }
Example #29
0
 private void rc_timestamp_check(DreamMessage msg)
 {
     string timestamp = msg.ToDocument()["change/rc_timestamp"].AsText ?? String.Empty;
     Assert.IsTrue(timestamp.Length > 0, "rc_timestamp is not present!");
 }
        public Yield PostUsersAllowed(DreamContext context, DreamMessage request, Result<DreamMessage> response) {
            ulong permissionMask = context.GetParam<ulong>("mask", 0);
            string operationList = context.GetParam("operations", "");

            UserBE u = GetUserFromUrlMustExist();

            //Use comma separated permission list or permissionmask from request.
            Permissions p = Permissions.NONE;
            if (permissionMask != 0) {
                p = (Permissions) permissionMask;
            }

            //Convert operation list to mask combined with provided mask
            if (!string.IsNullOrEmpty(operationList)) {
                try {
                    p |= (Permissions) PermissionsBL.MaskFromPermissionList(PermissionsBL.PermissionListFromString(operationList));
                }
                catch {
                    throw new DreamAbortException(DreamMessage.BadRequest(DekiResources.INVALID_OPERATION_LIST));
                }
            }

            if (request.ToDocument().HasName("pages")) {
                
                //Parse provided page list into objects
                IList<PageBE> result = PageBL.ReadPagesXml(request.ToDocument());
                if (p != Permissions.NONE) {
                    result = PermissionsBL.FilterDisallowed(u, result, false, p);
                }

                XDoc responseDoc = new XDoc("pages");
                if (result != null) {
                    foreach (PageBE pg in result) {
                        responseDoc.Add(PageBL.GetPageXml(pg, null));
                    }
                }
                response.Return(DreamMessage.Ok(responseDoc));
            }
            else {
                throw new DreamAbortException(DreamMessage.BadRequest(DekiResources.EXPECTED_ROOT_NODE_PAGES));
            }
            yield break;
        }
Example #31
0
        private void rc_timestamp_check(DreamMessage msg, int pageid)
        {
            Plug p = Utils.BuildPlugForAdmin();

            // Retrieve page date.modified and strip all non-digit characters
            DreamMessage newmsg = p.At("pages", pageid.ToString()).GetAsync().Wait();
            Assert.AreEqual(DreamStatus.Ok, newmsg.Status, "Page retrieval failed");
            string timestamp = newmsg.ToDocument()["date.modified"].AsText ?? String.Empty;
            timestamp = Regex.Replace(timestamp, "[^0-9]", "");

            string timestampMeta = msg.ToDocument()["change/rc_timestamp"].AsText ?? String.Empty;
            Assert.AreEqual(timestamp, timestampMeta, "Unexpected rc_timestamp");
        }