Example #1
0
        public override ActionResult Process()
        {
            if (!Folder.Write)
            {
                ForbiddenAccess forbidden = new ForbiddenAccess();
                return(forbidden.Process());
            }

            if (Folder.Type == FileSystem.FolderType.CalendarFolder)
            {
                AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;


                var e = RequestData.CurrentCalendar.Items.FirstOrDefault();
                e.LastModified = DateTime.UtcNow;
                System.Net.HttpStatusCode result = calendarFolder.Save(RequestData.CurrentCalendar, e.UID);

                return(new Result()
                {
                    Headers = new Dictionary <string, string> {
                        { "Location", $"{Folder.Path}{e.UID}.ics" },
                        { "ETag", Common.FormatDate(e.LastModified) }
                    },
                    Status = result
                });
            }

            NotImplemented notImplemented = new NotImplemented();

            return(notImplemented.Process());
        }
Example #2
0
        public override ActionResult Process()
        {
            if (Folder.Type == FileSystem.FolderType.CalendarFolder)
            {
                AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;

                var obj = calendarFolder.GetObjectByUID(calendarFolder.File);

                return(new Result(System.Text.Encoding.UTF8.GetBytes(ToString(obj)))
                {
                    ContentType = "text/calendar",
                    Status = System.Net.HttpStatusCode.OK
                });
            }
            NotImplemented notImplemented = new NotImplemented();

            return(notImplemented.Process());
        }
        public override ActionResult Process()
        {
            if (Folder.Type == FileSystem.FolderType.CalendarFolder && Enabled)
            {
                AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;

                var calendar = calendarFolder.CreateCalendar(calendarFolder.FolderID.ToString());

                return(new Result
                {
                    Headers = new Dictionary <string, string> {
                        { "Location", calendarFolder.Path },
                    },
                    Status = System.Net.HttpStatusCode.Created
                });
            }

            NotImplemented notImplemented = new NotImplemented();

            return(notImplemented.Process());
        }
Example #4
0
        public override ActionResult Process()
        {
            if (!Folder.Write)
            {
                ForbiddenAccess forbidden = new ForbiddenAccess();
                return(forbidden.Process());
            }

            if (Folder.Type == FileSystem.FolderType.CalendarFolder)
            {
                AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;

                calendarFolder.DeleteObject(calendarFolder.File);
                return(new Result()
                {
                    Status = System.Net.HttpStatusCode.NoContent
                });
            }

            NotImplemented notImplemented = new NotImplemented();

            return(notImplemented.Process());
        }
Example #5
0
        public override ActionResult Process()
        {
            var xdoc = RequestData.XmlBody;

            if (xdoc != null && (Folder.Type == FileSystem.FolderType.CalendarFolder))
            {
                var request = xdoc.Root.Elements().FirstOrDefault();

                AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;


                switch (request.Name.LocalName.ToLower())
                {
                case "calendar-collection-set":
                    var calendars = this.RequestData.CurrentPrincipal.CalendarPaths;

                    return(new Result
                    {
                        Content = Common.xDav.Element("options-response",
                                                      Common.xCalDav.Element("calendar-collection-set",
                                                                             calendars.Select(calendar =>
                                                                                              Common.xDav.Element("href", $"{calendar}"))
                                                                             )
                                                      )
                    });
                }
            }

            return(new Result
            {
                DavHeader = Folder.GetOptions,
                Headers = new Dictionary <string, string> {
                    { "Allow", Folder.AllowOptions },
                    { "Public", Folder.PublicOptions }
                }
            });
        }
Example #6
0
        private void BuildResponse(AbstractFolder currentFolder, List <XElement> props, int depth, XElement elementBase)
        {
            var supportedProperties = new HashSet <XName>();

            var response = Common.xDav.Element("response");

            response.Add(Common.xDav.Element("href", currentFolder.Path));
            var propStat = Common.xDav.Element("propstat");

            response.Add(propStat);

            propStat.Add(Common.xDav.Element("status", "HTTP/1.1 200 OK"));

            var prop = Common.xDav.Element("prop");

            propStat.Add(prop);


            if (depth < 0)
            {
                return;
            }

            AbstractCalendarRepository calendarFolder = null;


            var allprop       = props.Elements(Common.xDav.GetName("allprops")).Any();
            var hrefName      = Common.xDav.GetName("href");
            var privilegeName = Common.xDav.GetName("privilege");

            XElement resourceType     = null;
            XName    resourceTypeName = null;

            XElement getctag     = null;
            XName    getctagName = null;

            XElement getContentType     = null;
            XName    getContentTypeName = null;

            XName getetagName = Common.xDav.GetName("getetag");


            // Dav:: https://tools.ietf.org/html/rfc3744#section-5.1.1
            // CalDav:: https://icalendar.org/RFC-Specifications/CalDAV-Access-RFC-4791/

            foreach (var currentProp in props)
            {
                var test = Properties.Where(a => a.Name == currentProp.Name).SingleOrDefault();

                XElement currentElement = null;
                if (test != null)
                {
                    currentElement = test.Build(allprop, props, currentFolder, prop, supportedProperties, RequestData);

                    if (currentProp.Name.LocalName.Equals("resourcetype"))
                    {
                        resourceType     = currentElement;
                        resourceTypeName = test.Name;
                    }
                    else if (currentProp.Name.LocalName.Equals("getctag"))
                    {
                        getctag     = currentElement;
                        getctagName = test.Name;
                    }
                    else if (currentProp.Name.LocalName.Equals("getcontenttype"))
                    {
                        getContentType     = currentElement;
                        getContentTypeName = test.Name;
                    }
                }
            }


            var status = BuildUnsupportedProperties(props, supportedProperties);

            if (status != null)
            {
                response.Add(status);
            }


            elementBase.Add(response);
            // solve Depth

            // if this is a calendar folder and depth request remains return calendar props
            if (currentFolder.Type == FileSystem.FolderType.CalendarFolder && depth > 0)
            {
                calendarFolder = (AbstractCalendarRepository)currentFolder;

                var calendarObjects = calendarFolder.GetObjects().Where(x => x != null).ToArray();

                var calendarItems = calendarObjects.Select(item => Common.xDav.Element("response",
                                                                                       hrefName.Element($"{calendarFolder.Path}{item.UID}.ics"),
                                                                                       Common.xDav.Element("propstat",
                                                                                                           Common.xDav.Element("status", "HTTP/1.1 200 OK"),
                                                                                                           resourceType == null ? null : resourceTypeName.Element(),
                                                                                                           (getContentType == null
                           ? null
                           : getContentTypeName.Element("text/calendar; component=v" + item.GetType().Name.ToLower())),
                                                                                                           getetagName.Element("\"" + Common.FormatDate(item.LastModified) + "\"")
                                                                                                           ))).ToArray();

                elementBase.Add(calendarItems);
            }
            depth--;
            foreach (var child in currentFolder.ChildFolders ?? new List <AbstractFolder>())
            {
                BuildResponse(child, props, depth, elementBase);
            }
        }
Example #7
0
        public override ActionResult Process()
        {
            var xdoc = RequestData.XmlBody;

            if (xdoc == null || !(Folder.Type == FileSystem.FolderType.CalendarFolder))
            {
                return(new Result());
            }

            AbstractCalendarRepository calendarFolder = (AbstractCalendarRepository)Folder;

            var firstElement = xdoc.Root.Elements().FirstOrDefault();

            if (xdoc.Root.Name.LocalName == "sync-collection")
            {
                var multiStat = Common.xDav.Element("multistatus");
                multiStat.Add(Common.xDav.Element("sync-token", "http://CALDAV/sync/" + calendarFolder.Ctag));
                multiStat.Add(Common.xDav.Element("sync-level", RequestData.Depth));
                if (RequestData.Depth > 0)
                {
                    IQueryable <ICalendarObject> calObjects = calendarFolder.GetObjects();

                    // check depth == sync-level
                    // sync response for each file in the folder - depth = 1

                    /*
                     * <href>file href</href>
                     * <status>HTTP/1.1 200 OK</status>
                     * <propstat>
                     *      <prop>
                     *          <getetag>file Etag</getetag>
                     *      </prop>
                     * </propstat>
                     *
                     * <sync-token>syncURL/GTag</sync-token>
                     */

                    if (calObjects != null)
                    {
                        return(new Result
                        {
                            Status = (System.Net.HttpStatusCode) 207,
                            Content = Common.xDav.Element("multistatus",
                                                          Common.xDav.Element("sync-token", "http://CALDAV/sync/" + calendarFolder.Ctag),
                                                          Common.xDav.Element("sync-level", RequestData.Depth),
                                                          calObjects.Select(r =>
                                                                            Common.xDav.Element("response",
                                                                                                Common.xDav.Element("href", $"{Folder.Path}{r.UID}.ics"),
                                                                                                Common.xDav.Element("propstat",
                                                                                                                    Common.xDav.Element("status", "HTTP/1.1 200 OK"),
                                                                                                                    Common.xDav.Element("prop",
                                                                                                                                        (Common.xDav.Element("getetag",
                                                                                                                                                             "\"" + Common.FormatDate(r.LastModified) + "\"")),
                                                                                                                                        (Common.xCalDav.Element("content-type", "text/calendar; charset=utf-8")
                                                                                                                                        )
                                                                                                                                        )
                                                                                                                    )
                                                                                                )
                                                                            )
                                                          )
                        });
                    }
                }
            }
            else
            {
                var request  = xdoc.Root.Elements().FirstOrDefault();
                var requests = xdoc.Root.Elements().ToList();

                var filterElm = requests.Where(a => a.Name == Common.xCalDav.GetName("filter")).SingleOrDefault();

                var filter           = filterElm == null ? null : new Filter(filterElm);
                var hrefName         = Common.xDav.GetName("href");
                var hrefs            = xdoc.Descendants(hrefName).Select(x => x.Value).ToArray();
                var getetagName      = Common.xDav.GetName("getetag");
                var getetag          = xdoc.Descendants(getetagName).FirstOrDefault();
                var calendarDataName = Common.xCalDav.GetName("calendar-data");
                var calendarData     = xdoc.Descendants(calendarDataName).FirstOrDefault();

                var ownerName       = Common.xDav.GetName("owner");
                var displaynameName = Common.xDav.GetName("displayname");

                IQueryable <ICalendarObject> result = null;
                if (filter != null)
                {
                    result = calendarFolder.GetObjectsByFilter(filter);
                }
                else if (hrefs.All(a => a.Contains(".ics")))
                {
                    result = hrefs.Select(x => calendarFolder.GetObjectByUID(GetObjectUIDFromPath(x)))
                             .Where(x => x != null)
                             .AsQueryable();
                }
                else if (hrefs.All(a => !a.Contains(".ics")))
                {
                    result = calendarFolder.GetObjects();
                }

                if (result != null)
                {
                    return(new Result
                    {
                        Status = (System.Net.HttpStatusCode) 207,
                        Content = Common.xDav.Element("multistatus",
                                                      result.Select(r =>
                                                                    Common.xDav.Element("response",
                                                                                        Common.xDav.Element("href", $"{Folder.Path}{r.UID}.ics"),
                                                                                        Common.xDav.Element("propstat",
                                                                                                            Common.xDav.Element("status", "HTTP/1.1 200 OK"),
                                                                                                            Common.xDav.Element("prop",
                                                                                                                                (getetag == null
                                                ? null
                                                : Common.xDav.Element("getetag",
                                                                      "\"" + Common.FormatDate(r.LastModified) + "\"")),
                                                                                                                                (calendarData == null
                                                ? null
                                                : Common.xCalDav.Element("calendar-data",
                                                                         ToString(r)
                                                                         ))
                                                                                                                                )
                                                                                                            )
                                                                                        )
                                                                    ))
                    });
                }
            }

            return(new Result
            {
                Headers = new Dictionary <string, string> {
                    { "ETag", calendarFolder.Ctag }
                }
            });
        }