예제 #1
0
        private static BanBE ReadBanXml(XDoc doc)
        {
            BanBE b = new BanBE();

            b.BanAddresses = new List <string>();
            b.BanUserIds   = new List <uint>();
            try {
                b.Reason     = doc["description"].AsText;
                b.RevokeMask = PermissionsBL.MaskFromPermissionList(PermissionsBL.PermissionListFromString(doc["permissions.revoked/operations"].AsText ?? string.Empty));
                b.LastEdit   = DateTime.UtcNow;
                b.Expires    = doc["date.expires"].AsDate;
                b.ByUserId   = DekiContext.Current.User.ID;
                foreach (XDoc val in doc["ban.addresses/address"])
                {
                    if (!val.IsEmpty)
                    {
                        b.BanAddresses.Add(val.AsText);
                    }
                }
                foreach (XDoc val in doc["ban.users/user"])
                {
                    uint?id = val["@id"].AsUInt;
                    if (id != null)
                    {
                        b.BanUserIds.Add(id ?? 0);
                    }
                }
            } catch (ResourcedMindTouchException) {
                throw;
            } catch (Exception x) {
                throw new MindTouchInvalidOperationException(x.Message, x);
            }
            return(b);
        }
예제 #2
0
        public Yield PostUsersAllowed(DreamContext context, DreamMessage request, Result <DreamMessage> response)
        {
            var permissionMask = context.GetParam <ulong>("mask", 0);
            var operationList  = context.GetParam("operations", "");
            var user           = GetUserFromUrlMustExist();
            var verbose        = context.GetParam("verbose", true);
            var invert         = context.GetParam("invert", false);

            // Use comma separated permission list or permissionmask from request.
            var permissions = Permissions.NONE;

            if (permissionMask != 0)
            {
                permissions = (Permissions)permissionMask;
            }

            // Convert operation list to mask combined with provided mask
            if (!string.IsNullOrEmpty(operationList))
            {
                try {
                    permissions |= (Permissions)PermissionsBL.MaskFromPermissionList(PermissionsBL.PermissionListFromString(operationList));
                } catch {
                    throw new UserOperationListInvalidArgumentException();
                }
            }
            IEnumerable <ulong> pageIds;
            var textOutput = false;

            if (request.HasDocument)
            {
                if (!request.ToDocument().HasName("pages"))
                {
                    throw new UserExpectedRootNodePagesInvalidDocumentException();
                }
                pageIds = from pageIdXml in request.ToDocument()["page/@id"]
                          let pageId = pageIdXml.AsULong
                                       where pageId.HasValue
                                       select pageId.Value;
            }
            else if (verbose)
            {
                throw new UserPageFilterVerboseNotAllowedException();
            }
            else if (!request.ContentType.Match(MimeType.TEXT))
            {
                throw new UserPageFilterInvalidInputException();
            }
            else
            {
                textOutput = true;
                pageIds    = request.ToText().CommaDelimitedToULong();
            }
            IEnumerable <ulong> filtered;
            var allowedPages = PermissionsBL.FilterDisallowed(user, pageIds, false, out filtered, permissions);

            if (textOutput)
            {
                var output = invert
                    ? filtered.ToCommaDelimitedString()
                    : allowedPages.ToCommaDelimitedString();
                response.Return(DreamMessage.Ok(MimeType.TEXT, output ?? string.Empty));
            }
            else
            {
                var responseDoc = new XDoc("pages");
                if (invert)
                {
                    foreach (var pageId in filtered)
                    {
                        responseDoc.Start("page").Attr("id", pageId).End();
                    }
                }
                else if (allowedPages.Any())
                {
                    if (verbose)
                    {
                        foreach (var page in PageBL.GetPagesByIdsPreserveOrder(allowedPages))
                        {
                            responseDoc.Add(PageBL.GetPageXml(page, null));
                        }
                    }
                    else
                    {
                        foreach (var pageId in allowedPages)
                        {
                            responseDoc.Start("page").Attr("id", pageId).End();
                        }
                    }
                }
                response.Return(DreamMessage.Ok(responseDoc));
            }
            yield break;
        }