def validate_params(self):
        params = self.event['request']['userAttributes']
        if UserUtil.check_try_to_register_as_line_user(self.event['userName']) or \
           UserUtil.check_try_to_register_as_twitter_user(self.event['userName']) or \
           UserUtil.check_try_to_register_as_yahoo_user(self.event['userName']) or \
           UserUtil.check_try_to_register_as_facebook_user(self.event['userName']):
            raise ValidationError("external provider's user can not execute")
        if params.get('phone_number', '') != '' and \
           params.get('phone_number_verified', '') != 'true' and \
           self.event['triggerSource'] != 'CustomMessage_ForgotPassword':
            validate(params, self.get_schema())
            client = boto3.client('cognito-idp')
            response = client.list_users(
                UserPoolId=self.event['userPoolId'],
                Filter='phone_number = "%s"' % params['phone_number'],
            )
            for user in response['Users']:
                for attribute in user['Attributes']:
                    if attribute[
                            'Name'] == 'phone_number_verified' and attribute[
                                'Value'] == 'true':
                        raise ValidationError(
                            'This phone_number is already exists')
        # セキュリティ観点より、電話番号変更を実行させない。
        # これにより XSS が発生したとしても、電話番号認証が必要な処理は回避が可能
        if self.event['triggerSource'] == 'CustomMessage_VerifyUserAttribute':
            # phone_number_verified が true の場合は電話番号変更を行っていないため当チェックは不要
            if params.get('phone_number_verified', '') != 'true':
                self.__validate_has_not_token(params)

        # サードパーティを利用したユーザの場合、パスワード変更を実行させない
        if self.event['triggerSource'] == 'CustomMessage_ForgotPassword':
            # サードパーティを利用したユーザかを確認
            if UserUtil.is_external_provider_user(self.dynamodb,
                                                  self.event['userName']):
                raise ValidationError(
                    "external provider's user can not execute")
 def test_is_external_provider_user_ng(self):
     self.assertFalse(
         UserUtil.is_external_provider_user(self.dynamodb, 'test-user'))
 def test_is_external_provider_user_ok(self):
     self.assertTrue(
         UserUtil.is_external_provider_user(self.dynamodb, 'user_id'))