Example #1
0
        public FileResult Index(Guid? Id)
        {
            if (Id == null)
                return AccessDenied();

            RemoteCalendarAccessManager manager = new RemoteCalendarAccessManager();
            BLM.RemoteCalendarAccess remoteCalendarAccess = manager.GetRemoteCalendarAccess(Id.Value);

            if (remoteCalendarAccess == null)
                return AccessDenied();

            AzureActiveDirectory azureAD = new AzureActiveDirectory();

            IUser user = null;
            try
            {
                user = azureAD.GetUser(remoteCalendarAccess.UserId).Result;
            }
            catch (AggregateException e)
            {
                if (!e.InnerExceptions.Any(i => i.Message == "User " + remoteCalendarAccess.UserId + " not found."))
                    throw;
            }

            if (user == null || user.AccountEnabled == false)
                return AccessDenied();

            manager.UpdateLastAccessTime(remoteCalendarAccess);

            Uri uri = new Uri(remoteCalendarAccess.SiteAddress);
            string realm = TokenHelper.GetRealmFromTargetUrl(uri);
            var token = TokenHelper.GetAppOnlyAccessToken("00000003-0000-0ff1-ce00-000000000000", uri.Authority, realm);
            ClientContext clientContext = TokenHelper.GetClientContextWithAccessToken(uri.ToString(), token.AccessToken);

            clientContext.Load(clientContext.Web.Lists);
            clientContext.ExecuteQuery();

            List list = clientContext.Web.Lists.Where(l => l.Id == remoteCalendarAccess.CalendarId).First();

            if (list == null)
                return AccessDenied();

            ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());
            clientContext.Load(items);

            clientContext.Load(clientContext.Web);
            clientContext.Load(clientContext.Web.RegionalSettings);
            clientContext.Load(clientContext.Web.RegionalSettings.TimeZone);
            clientContext.Load(clientContext.Web, w => w.Title);

            clientContext.ExecuteQuery();

            Calendar calendar = new Calendar();
            calendar.Title = clientContext.Web.Title + " - " + list.Title;
            calendar.Timezone = Timezone.Parse(clientContext.Web.RegionalSettings.TimeZone.Description);
            calendar.Events = items.Select(i => Event.Parse(i)).ToList<Event>();

            FileContentResult result = File(System.Text.Encoding.Default.GetBytes(calendar.ToString()), "text/calendar", "calendar.ics");

            return result;
        }