示例#1
0
        public async Task <HttpResponseMessage> Get(string id)
        {
            var thisOne = await hub.GetRegistrationAsync <RegistrationDescription>(id);

            if (thisOne == null)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Could not find id"));
            }

            return(Request.CreateResponse(HttpStatusCode.OK, thisOne));
        }
        public async Task InitializeAsync()
        {
            NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(options.HubConnection, options.HubName);
            var reg = await client.GetRegistrationAsync <RegistrationDescription>(endpoint.Endpoint);

            if (reg.Tags == null)
            {
                reg.Tags = new HashSet <string>()
                {
                    config.Id
                };
            }
            else
            {
                reg.Tags.Add(config.Id);
            }
            await client.UpdateRegistrationAsync(reg);
        }
示例#3
0
        private async Task <bool> VerifyTags(string channelUri, string installationId, NotificationHubClient nhClient)
        {
            IPrincipal user = this.User;
            int        expectedTagsCount = 1;

            if (user.Identity != null && user.Identity.IsAuthenticated)
            {
                expectedTagsCount = 2;
            }

            string continuationToken = null;

            do
            {
                CollectionQueryResult <RegistrationDescription> regsForChannel = await nhClient.GetRegistrationsByChannelAsync(channelUri, continuationToken, 100);

                continuationToken = regsForChannel.ContinuationToken;
                foreach (RegistrationDescription reg in regsForChannel)
                {
                    RegistrationDescription registration = await nhClient.GetRegistrationAsync <RegistrationDescription>(reg.RegistrationId);

                    if (registration.Tags == null || registration.Tags.Count() < expectedTagsCount)
                    {
                        return(false);
                    }
                    if (!registration.Tags.Contains("$InstallationId:{" + installationId + "}"))
                    {
                        return(false);
                    }

                    ClaimsIdentity identity    = user.Identity as ClaimsIdentity;
                    Claim          userIdClaim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
                    string         userId      = (userIdClaim != null) ? userIdClaim.Value : string.Empty;

                    if (user.Identity != null && user.Identity.IsAuthenticated && !registration.Tags.Contains("_UserId:" + userId))
                    {
                        return(false);
                    }
                }
            } while (continuationToken != null);
            return(true);
        }
示例#4
0
        public async Task <IResult> DeleteSubscription(DeleteSubscriptionCommand command)
        {
            try
            {
                var registration = await _hubClient.GetRegistrationAsync <RegistrationDescription>(command.RegistrationId);

                if (registration == null)
                {
                    return(new FailedResult());
                }

                await _hubClient.DeleteRegistrationAsync(command.RegistrationId);

                return(new SuccessfulResult());
            }
            catch (Exception exception)
            {
                _logger.LogError($"{nameof(DeleteSubscription)}: {exception}");
                return(new FailedResult());
            }
        }
        private async Task<bool> VerifyTags(string channelUri, string installationId, NotificationHubClient nhClient)
        {
            IPrincipal user = this.User;
            int expectedTagsCount = 1;
            if (user.Identity != null && user.Identity.IsAuthenticated)
            {
                expectedTagsCount = 2;
            }
            string continuationToken = null;
            do
            {
                CollectionQueryResult<RegistrationDescription> regsForChannel = await nhClient.GetRegistrationsByChannelAsync(channelUri, continuationToken, 100);
                continuationToken = regsForChannel.ContinuationToken;
                foreach (RegistrationDescription reg in regsForChannel)
                {
                    RegistrationDescription registration = await nhClient.GetRegistrationAsync<RegistrationDescription>(reg.RegistrationId);
                    if (registration.Tags == null || registration.Tags.Count() != expectedTagsCount)
                    {
                        return false;
                    }
                    if (!registration.Tags.Contains("$InstallationId:{" + installationId + "}"))
                    {
                        return false;
                    }

                    ClaimsIdentity identity = user.Identity as ClaimsIdentity;
                    Claim userIdClaim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
                    string userId = (userIdClaim != null) ? userIdClaim.Value : string.Empty;

                    if (expectedTagsCount > 1 && !registration.Tags.Contains("_UserId:" + userId))
                    {
                        return false;
                    }
                }
            } while (continuationToken != null);
            return true;
        }
        /// <summary>
        /// CSV 形式でアップロードされたファイルを元に登録情報の追加、更新を行います
        /// </summary>
        public async Task <HttpResponseMessage> Post()
        {
            // マルチパート以外の場合には拒否
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            // マルチパートデータを読み込む
            var provider = await Request.Content.ReadAsMultipartAsync();

            var content = provider.Contents.FirstOrDefault(p => p.Headers.ContentDisposition.Name == "\"csv\"");

            // ファイルが見つからない場合にはエラー
            if (content == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            RegistrationModel[] records;

            try
            {
                // CSV としてファイルを解析する
                var csvData = await content.ReadAsStringAsync();

                var reader = new StringReader(csvData);

                var csvReader = new CsvReader(reader);

                csvReader.Configuration.RegisterClassMap <RegistrationModelMap>();

                records = csvReader.GetRecords <RegistrationModel>().ToArray();
            }
            catch (Exception ex)
            {
                return(Failure(ex.Message));
            }

            // 予め登録済みのデータがあるかを非同期で一括取得する
            var registrations = (await Task.WhenAll(records.Where(p => !string.IsNullOrEmpty(p.RegistrationId)).Select(p => _client.GetRegistrationAsync <RegistrationDescription>(p.RegistrationId)))).Where(p => p != null).ToArray();

            long insert = 0, update = 0;

            var targets = new List <RegistrationDescription>();

            // 1 レコードごとに追加なのか、更新なのか RegistrationId の有無で処理を行う
            foreach (var record in records)
            {
                var registration = registrations.FirstOrDefault(p => p.RegistrationId == record.RegistrationId);

                if (registration == null)
                {
                    switch (record.Platform)
                    {
                    case Platforms.Windows:
                        registration = new WindowsRegistrationDescription(record.Handle);
                        break;

                    case Platforms.WindowsPhone:
                        registration = new MpnsRegistrationDescription(record.Handle);
                        break;

                    case Platforms.Apple:
                        registration = new AppleRegistrationDescription(record.Handle);
                        break;

                    case Platforms.Android:
                        registration = new GcmRegistrationDescription(record.Handle);
                        break;

                    default:
                        throw new HttpResponseException(HttpStatusCode.BadRequest);
                    }

                    registration.RegistrationId = await _client.CreateRegistrationIdAsync();

                    insert += 1;
                }
                else
                {
                    switch (record.Platform)
                    {
                    case Platforms.Windows:
                        ((WindowsRegistrationDescription)registration).ChannelUri = new Uri(record.Handle);
                        break;

                    case Platforms.WindowsPhone:
                        ((MpnsRegistrationDescription)registration).ChannelUri = new Uri(record.Handle);
                        break;

                    case Platforms.Apple:
                        ((AppleRegistrationDescription)registration).DeviceToken = record.Handle;
                        break;

                    case Platforms.Android:
                        ((GcmRegistrationDescription)registration).GcmRegistrationId = record.Handle;
                        break;

                    default:
                        throw new HttpResponseException(HttpStatusCode.BadRequest);
                    }

                    update += 1;
                }

                registration.Tags = record.Tags;

                targets.Add(registration);
            }

            try
            {
                // 処理対象を非同期で一括処理する
                await Task.WhenAll(targets.Select(p => _client.CreateOrUpdateRegistrationAsync(p)));
            }
            catch (Exception ex)
            {
                return(Failure(ex.Message));
            }

            // 処理結果を返却
            return(Success(string.Format("Imported from CSV : Insert {0}, Update {1}, Total {2}", insert, update, insert + update)));
        }
 /// <summary>
 /// Get the registration for an app instance
 /// </summary>
 /// <param name="hubClient">Notification hub client for this app</param>
 /// <param name="hubRegistrationId">Hub registration id for this app instance</param>
 /// <returns>Registration description for the app instance</returns>
 protected override async Task <RegistrationDescription> GetRegistrationAsync(NotificationHubClient hubClient, string hubRegistrationId)
 {
     return(await hubClient.GetRegistrationAsync <AppleRegistrationDescription>(hubRegistrationId));
 }
        // PUT api/register/5
        // This creates or updates a registration (with provided channelURI) at the specified id
        public async Task <HttpResponseMessage> Put()
        {
            string value = await Request.Content.ReadAsStringAsync();

            var    entidad = System.Web.Helpers.Json.Decode(value);
            string id      = entidad.idhubazure;

            string[] tag = Convert.ToString(entidad.tag).Split(',');

            DeviceRegistration deviceUpdate = new DeviceRegistration()
            {
                Platform = entidad.platform,
                Handle   = entidad.key,
                Tags     = tag
            };

            RegistrationDescription registration = null;

            switch (deviceUpdate.Platform)
            {
            case "mpns":
                registration = new MpnsRegistrationDescription(deviceUpdate.Handle);
                break;

            case "wns":
                registration = new WindowsRegistrationDescription(deviceUpdate.Handle);
                break;

            case "apns":
                registration = new AppleRegistrationDescription(deviceUpdate.Handle);
                break;

            case "gcm":
                registration = new GcmRegistrationDescription(deviceUpdate.Handle);
                break;

            default:
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            //registration.RegistrationId = id;
            var username = HttpContext.Current.User.Identity.Name;

            registration = await hub.GetRegistrationAsync <RegistrationDescription>(entidad.idhubazure);

            registration.Tags = new HashSet <string>();
            registration.Tags.Add("username:"******" ", "").Trim();
                registration.Tags.Add(tagString);
            }



            try
            {
                await hub.CreateOrUpdateRegistrationAsync(registration);
            }
            catch (MessagingException e)
            {
                ReturnGoneIfHubResponseIsGone(e);
            }

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
示例#9
0
        public async Task DeleteRegistrationAsync_DeleteAppleNativeRegistration_RegistrationIsDeleted()
        {
            LoadMockData();
            await DeleteAllRegistrationsAndInstallations();

            var registration = new AppleRegistrationDescription(_configuration["AppleDeviceToken"]);

            var createdRegistration = await _hubClient.CreateRegistrationAsync(registration);

            await _hubClient.DeleteRegistrationAsync(createdRegistration);

            await Assert.ThrowsAsync <MessagingEntityNotFoundException>(async() => await _hubClient.GetRegistrationAsync <AppleRegistrationDescription>(createdRegistration.RegistrationId));

            RecordTestResults();
        }
        // Private async method that performs the actual registration,
        // since we can't return Task<T> from a service operation.
        private async Task <string> RegisterForPushNotificationsAsync(
            Registration clientRegistration)
        {
            // If the client gave us a registration ID, use it to try and get the registration.
            RegistrationDescription currentRegistration = null;

            if (!string.IsNullOrEmpty(clientRegistration.RegistrationId))
            {
                // Try to get the current registration by ID.
                currentRegistration =
                    await hubClient.GetRegistrationAsync <RegistrationDescription>(
                        clientRegistration.RegistrationId);
            }

            // Update a current registration.
            if (currentRegistration != null)
            {
                // Update the current set of tags.
                foreach (string tag in clientRegistration.Tags)
                {
                    if (!currentRegistration.Tags.Contains(tag))
                    {
                        currentRegistration.Tags.Add(tag);
                    }
                }

                // We need to update each platform separately.
                switch (clientRegistration.Platform)
                {
                case "windows":
                case "win8":
                    // In the Windows Store case we need to delete and recreate the
                    // registration because there's no way to change from a toast template
                    // to a native raw notification.
                    await DeleteRegistrationsAsync(currentRegistration.RegistrationId);

                    clientRegistration.RegistrationId =
                        await createWindowsRegistration(clientRegistration,
                                                        currentRegistration.Tags);

                    break;

                case "wp":
                case "windowsphone":
                    await DeleteRegistrationsAsync(currentRegistration.RegistrationId);

                    clientRegistration.RegistrationId =
                        await createWindowsRegistration(clientRegistration,
                                                        currentRegistration.Tags);

                    break;

                case "ios":
                    var iosReg = currentRegistration as AppleRegistrationDescription;
                    // Update tags and device token.
                    iosReg.DeviceToken = clientRegistration.DeviceToken;
                    clientRegistration.RegistrationId =
                        (await hubClient.UpdateRegistrationAsync(iosReg)).RegistrationId;
                    break;
                }
            }
            // Create a new registration.
            else
            {
                // Create an ISet<T> of the supplied tags.
                HashSet <string> tags = new HashSet <string>(clientRegistration.Tags);

                // We need to create each platform separately.
                switch (clientRegistration.Platform)
                {
                case "windows":
                case "win8":
                    // Call the method that creates Windows Store registrations.
                    clientRegistration.RegistrationId = await createWindowsRegistration(clientRegistration, tags);

                    break;

                case "ios":
                    var template = @"{""aps"":{""alert"":""$(message)""}, ""inAppMessage"":""$(message)""}";
                    clientRegistration.RegistrationId =
                        (await hubClient.CreateAppleTemplateRegistrationAsync(
                             clientRegistration.DeviceToken, template, tags)).RegistrationId;
                    break;

                default:
                    throw new DataServiceException("Unsupported client platform.");
                }
            }

            return(clientRegistration.RegistrationId);
        }
示例#11
0
        public async Task <RegistrationDescription> Get(string id)
        {
            var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(id);

            return(registrationDescription);
        }
示例#12
0
        public async Task <ActionResult> Update([FromBody] SurveyGroup surveyGroup)
        {
            try
            {
                var username = string.Empty;

                if (HttpContext.User.Identity is ClaimsIdentity identity)
                {
                    username = identity.FindFirst(ClaimTypes.Name).Value;
                }

                var existingGroup = await _db.SurveyGroups.Include(group => group.ApplicationUsers).Where(group => group.Id == surveyGroup.Id).FirstOrDefaultAsync();

                existingGroup.GroupName = surveyGroup.GroupName;

                // update associated users
                var users = _db.Users.Where(user => surveyGroup.ApplicationUserIds.Contains(user.Id)).ToList();

                // remove users which have been removed from the group
                List <ApplicationUser> usersToRemove = new List <ApplicationUser>();

                foreach (var user in existingGroup.ApplicationUsers)
                {
                    if (!surveyGroup.ApplicationUserIds.Contains(user.Id))
                    {
                        usersToRemove.Add(user);
                    }
                }

                usersToRemove.ForEach(user => existingGroup.ApplicationUsers.Remove(user));

                foreach (var user in usersToRemove)
                {
                    if (!string.IsNullOrEmpty(user.RegistrationId))
                    {
                        var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(user.RegistrationId);

                        if (registrationDescription.Tags.Contains($"group:{existingGroup.GroupName.Replace(' ', '-')}"))
                        {
                            registrationDescription.Tags.Remove($"group:{existingGroup.GroupName.Replace(' ', '-')}");
                            await _hub.CreateOrUpdateRegistrationAsync(registrationDescription);
                        }
                    }
                }

                // users to add
                foreach (var user in users)
                {
                    if (existingGroup.ApplicationUsers.Where(usr => usr.Id == user.Id).Count() == 0)
                    {
                        existingGroup.ApplicationUsers.Add(user);
                    }
                }

                foreach (var user in existingGroup.ApplicationUsers)
                {
                    if (!string.IsNullOrEmpty(user.RegistrationId))
                    {
                        var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(user.RegistrationId);

                        if (!registrationDescription.Tags.Contains($"group:{existingGroup.GroupName.Replace(' ','-')}"))
                        {
                            registrationDescription.Tags.Add($"group:{existingGroup.GroupName.Replace(' ', '-')}");
                            await _hub.CreateOrUpdateRegistrationAsync(registrationDescription);
                        }
                    }
                }

                _db.Entry(existingGroup).State = EntityState.Modified;
                await _db.SaveChangesAsync();

                return(Ok(existingGroup));
            }
            catch (Exception)
            {
                return(BadRequest());
            }
        }