diff -Nru 389-ds-base-1.4.3.6/debian/changelog 389-ds-base-1.4.4.3/debian/changelog --- 389-ds-base-1.4.3.6/debian/changelog 2020-04-21 17:19:06.000000000 +0000 +++ 389-ds-base-1.4.4.3/debian/changelog 2020-06-02 08:33:44.000000000 +0000 @@ -1,3 +1,10 @@ +389-ds-base (1.4.4.3-1) unstable; urgency=medium + + * New upstream release. + * fix-db-home-dir.diff: Dropped, upstream. + + -- Timo Aaltonen Tue, 02 Jun 2020 11:33:44 +0300 + 389-ds-base (1.4.3.6-2) unstable; urgency=medium * fix-db-home-dir.diff: Set db_home_dir same as db_dir to fix an issue diff -Nru 389-ds-base-1.4.3.6/debian/patches/fix-db-home-dir.diff 389-ds-base-1.4.4.3/debian/patches/fix-db-home-dir.diff --- 389-ds-base-1.4.3.6/debian/patches/fix-db-home-dir.diff 2020-04-21 17:17:45.000000000 +0000 +++ 389-ds-base-1.4.4.3/debian/patches/fix-db-home-dir.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ ---- a/ldap/admin/src/defaults.inf.in -+++ b/ldap/admin/src/defaults.inf.in -@@ -58,7 +58,7 @@ access_log = @localstatedir@/log/dirsrv/ - audit_log = @localstatedir@/log/dirsrv/slapd-{instance_name}/audit - error_log = @localstatedir@/log/dirsrv/slapd-{instance_name}/errors - db_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/db --db_home_dir = /dev/shm/dirsrv/slapd-{instance_name} -+db_home_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/db - backup_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/bak - ldif_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/ldif - diff -Nru 389-ds-base-1.4.3.6/debian/patches/series 389-ds-base-1.4.4.3/debian/patches/series --- 389-ds-base-1.4.3.6/debian/patches/series 2020-04-21 17:17:21.000000000 +0000 +++ 389-ds-base-1.4.4.3/debian/patches/series 2020-06-02 08:17:05.000000000 +0000 @@ -2,4 +2,3 @@ fix-systemctl-path.diff CVE-2017-15135.patch drop-old-man.diff -fix-db-home-dir.diff diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/conftest.py 389-ds-base-1.4.4.3/dirsrvtests/conftest.py --- 389-ds-base-1.4.3.6/dirsrvtests/conftest.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/conftest.py 2020-05-29 20:19:44.000000000 +0000 @@ -8,6 +8,7 @@ from lib389.paths import Paths from enum import Enum + pkgs = ['389-ds-base', 'nss', 'nspr', 'openldap', 'cyrus-sasl'] p = Paths() @@ -22,6 +23,7 @@ def __str__(self): return self.value + def get_rpm_version(pkg): try: result = subprocess.check_output(['rpm', '-q', '--queryformat', diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/longduration/automembers_long_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/longduration/automembers_long_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/longduration/automembers_long_test.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/longduration/automembers_long_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,728 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2019 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- + +""" +Will do stress testing of automember plugin +""" + +import os +import pytest + +from lib389.tasks import DEFAULT_SUFFIX +from lib389.topologies import topology_m4 as topo_m4 +from lib389.idm.nscontainer import nsContainers, nsContainer +from lib389.idm.organizationalunit import OrganizationalUnits +from lib389.idm.domain import Domain +from lib389.idm.posixgroup import PosixGroups +from lib389.plugins import AutoMembershipPlugin, AutoMembershipDefinitions, \ + MemberOfPlugin, AutoMembershipRegexRules +from lib389.backend import Backends +from lib389.config import Config +from lib389.replica import ReplicationManager +from lib389.tasks import AutomemberRebuildMembershipTask +from lib389.idm.group import Groups, Group, nsAdminGroups, nsAdminGroup + + +SUBSUFFIX = f'dc=SubSuffix,{DEFAULT_SUFFIX}' +REPMANDN = "cn=ReplManager" +REPMANSFX = "dc=replmangr,dc=com" +CACHE_SIZE = '-1' +CACHEMEM_SIZE = '10485760' + + +pytestmark = pytest.mark.tier3 + + +@pytest.fixture(scope="module") +def _create_entries(topo_m4): + """ + Will act as module .Will set up required user/entries for the test cases. + """ + for instance in [topo_m4.ms['master1'], topo_m4.ms['master2'], + topo_m4.ms['master3'], topo_m4.ms['master4']]: + assert instance.status() + + for org in ['autouserGroups', 'Employees', 'TaskEmployees']: + OrganizationalUnits(topo_m4.ms['master1'], DEFAULT_SUFFIX).create(properties={'ou': org}) + + Backends(topo_m4.ms['master1']).create(properties={ + 'cn': 'SubAutoMembers', + 'nsslapd-suffix': SUBSUFFIX, + 'nsslapd-CACHE_SIZE': CACHE_SIZE, + 'nsslapd-CACHEMEM_SIZE': CACHEMEM_SIZE + }) + + Domain(topo_m4.ms['master1'], SUBSUFFIX).create(properties={ + 'dc': SUBSUFFIX.split('=')[1].split(',')[0], + 'aci': [ + f'(targetattr="userPassword")(version 3.0;aci "Replication Manager Access";' + f'allow (write,compare) userdn="ldap:///{REPMANDN},cn=config";)', + f'(target ="ldap:///{SUBSUFFIX}")(targetattr !="cn||sn||uid")(version 3.0;' + f'acl "Group Permission";allow (write)(groupdn = "ldap:///cn=GroupMgr,{SUBSUFFIX}");)', + f'(target ="ldap:///{SUBSUFFIX}")(targetattr !="userPassword")(version 3.0;' + f'acl "Anonym-read access"; allow (read,search,compare) (userdn="ldap:///anyone");)'] + }) + + for suff, grp in [(DEFAULT_SUFFIX, 'SubDef1'), + (DEFAULT_SUFFIX, 'SubDef2'), + (DEFAULT_SUFFIX, 'SubDef3'), + (DEFAULT_SUFFIX, 'SubDef4'), + (DEFAULT_SUFFIX, 'SubDef5'), + (DEFAULT_SUFFIX, 'Employees'), + (DEFAULT_SUFFIX, 'NewEmployees'), + (DEFAULT_SUFFIX, 'testuserGroups'), + (SUBSUFFIX, 'subsuffGroups'), + (SUBSUFFIX, 'Employees'), + (DEFAULT_SUFFIX, 'autoMembersPlugin'), + (DEFAULT_SUFFIX, 'replsubGroups'), + ("cn=replsubGroups,{}".format(DEFAULT_SUFFIX), 'Managers'), + ("cn=replsubGroups,{}".format(DEFAULT_SUFFIX), 'Contractors'), + ("cn=replsubGroups,{}".format(DEFAULT_SUFFIX), 'Interns'), + ("cn=replsubGroups,{}".format(DEFAULT_SUFFIX), 'Visitors'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'SuffDef1'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'SuffDef2'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'SuffDef3'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'SuffDef4'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'SuffDef5'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'Contractors'), + ("ou=autouserGroups,{}".format(DEFAULT_SUFFIX), 'Managers'), + ("CN=testuserGroups,{}".format(DEFAULT_SUFFIX), 'TestDef1'), + ("CN=testuserGroups,{}".format(DEFAULT_SUFFIX), 'TestDef2'), + ("CN=testuserGroups,{}".format(DEFAULT_SUFFIX), 'TestDef3'), + ("CN=testuserGroups,{}".format(DEFAULT_SUFFIX), 'TestDef4'), + ("CN=testuserGroups,{}".format(DEFAULT_SUFFIX), 'TestDef5')]: + Groups(topo_m4.ms['master1'], suff, rdn=None).create(properties={'cn': grp}) + + for suff, grp, gid in [(SUBSUFFIX, 'SubDef1', '111'), + (SUBSUFFIX, 'SubDef2', '222'), + (SUBSUFFIX, 'SubDef3', '333'), + (SUBSUFFIX, 'SubDef4', '444'), + (SUBSUFFIX, 'SubDef5', '555'), + ('cn=subsuffGroups,{}'.format(SUBSUFFIX), 'Managers', '666'), + ('cn=subsuffGroups,{}'.format(SUBSUFFIX), 'Contractors', '999')]: + PosixGroups(topo_m4.ms['master1'], suff, rdn=None).create(properties={ + 'cn': grp, + 'gidNumber': gid}) + + for master in [topo_m4.ms['master1'], topo_m4.ms['master2'], + topo_m4.ms['master3'], topo_m4.ms['master4']]: + AutoMembershipPlugin(master).add("nsslapd-pluginConfigArea", + "cn=autoMembersPlugin,{}".format(DEFAULT_SUFFIX)) + MemberOfPlugin(master).enable() + + automembers = AutoMembershipDefinitions(topo_m4.ms['master1'], + f'cn=autoMembersPlugin,{DEFAULT_SUFFIX}') + automember1 = automembers.create(properties={ + 'cn': 'replsubGroups', + 'autoMemberScope': f'ou=Employees,{DEFAULT_SUFFIX}', + 'autoMemberFilter': "objectclass=posixAccount", + 'autoMemberDefaultGroup': [f'cn=SubDef1,{DEFAULT_SUFFIX}', + f'cn=SubDef2,{DEFAULT_SUFFIX}', + f'cn=SubDef3,{DEFAULT_SUFFIX}', + f'cn=SubDef4,{DEFAULT_SUFFIX}', + f'cn=SubDef5,{DEFAULT_SUFFIX}'], + 'autoMemberGroupingAttr': 'member:dn' + }) + + automembers = AutoMembershipRegexRules(topo_m4.ms['master1'], automember1.dn) + automembers.create(properties={ + 'cn': 'Managers', + 'description': f'Group placement for Managers', + 'autoMemberTargetGroup': [f'cn=Managers,cn=replsubGroups,{DEFAULT_SUFFIX}'], + 'autoMemberInclusiveRegex': ['uidNumber=^5..5$', 'gidNumber=^[1-4]..3$', + 'nsAdminGroupName=^Manager$|^Supervisor$'], + "autoMemberExclusiveRegex": ['uidNumber=^999$', + 'gidNumber=^[6-8].0$', + 'nsAdminGroupName=^Junior$'], + }) + automembers.create(properties={ + 'cn': 'Contractors', + 'description': f'Group placement for Contractors', + 'autoMemberTargetGroup': [f'cn=Contractors,cn=replsubGroups,{DEFAULT_SUFFIX}'], + 'autoMemberInclusiveRegex': ['uidNumber=^8..5$', + 'gidNumber=^[5-9]..3$', + 'nsAdminGroupName=^Contract|^Temporary$'], + "autoMemberExclusiveRegex": ['uidNumber=^[1,3,8]99$', + 'gidNumber=^[2-4]00$', + 'nsAdminGroupName=^Employee$'], + }) + automembers.create(properties={ + 'cn': 'Interns', + 'description': f'Group placement for Interns', + 'autoMemberTargetGroup': [f'cn=Interns,cn=replsubGroups,{DEFAULT_SUFFIX}'], + 'autoMemberInclusiveRegex': ['uidNumber=^1..6$', + 'gidNumber=^[1-9]..3$', + 'nsAdminGroupName=^Interns$|^Trainees$'], + "autoMemberExclusiveRegex": ['uidNumber=^[1-9]99$', + 'gidNumber=^[1-9]00$', + 'nsAdminGroupName=^Students$'],}) + automembers.create(properties={ + 'cn': 'Visitors', + 'description': f'Group placement for Visitors', + 'autoMemberTargetGroup': [f'cn=Visitors,cn=replsubGroups,{DEFAULT_SUFFIX}'], + 'autoMemberInclusiveRegex': ['uidNumber=^1..6$', + 'gidNumber=^[1-5]6.3$', + 'nsAdminGroupName=^Visitors$'], + "autoMemberExclusiveRegex": ['uidNumber=^[7-9]99$', + 'gidNumber=^[7-9]00$', + 'nsAdminGroupName=^Inter'], + }) + for instance in [topo_m4.ms['master1'], topo_m4.ms['master2'], + topo_m4.ms['master3'], topo_m4.ms['master4']]: + instance.restart() + + +def delete_users_and_wait(topo_m4, automem_scope): + """ + Deletes entries after test and waits for replication. + """ + for user in nsAdminGroups(topo_m4.ms['master1'], automem_scope, rdn=None).list(): + user.delete() + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + + +def create_entry(topo_m4, user_id, suffix, uid_no, gid_no, role_usr): + """ + Will create entries with nsAdminGroup objectclass + """ + user = nsAdminGroups(topo_m4.ms['master1'], suffix, rdn=None).create(properties={ + 'cn': user_id, + 'sn': user_id, + 'uid': user_id, + 'homeDirectory': '/home/{}'.format(user_id), + 'loginShell': '/bin/bash', + 'uidNumber': uid_no, + 'gidNumber': gid_no, + 'objectclass': ['top', 'person', 'posixaccount', 'inetuser', + 'nsMemberOf', 'nsAccount', 'nsAdminGroup'], + 'nsAdminGroupName': role_usr, + 'seeAlso': 'uid={},{}'.format(user_id, suffix), + 'entrydn': 'uid={},{}'.format(user_id, suffix) + }) + return user + + +def test_adding_300_user(topo_m4, _create_entries): + """ + Adding 300 user entries matching the inclusive regex rules for + all targetted groups at M1 and checking the same created in M2 & M3 + :id: fcd867bc-be57-11e9-9842-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 300 user entries matching the inclusive regex rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + """ + user_rdn = "long01usr" + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef1,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef2,{}".format(DEFAULT_SUFFIX) + # Adding BulkUsers + for number in range(300): + create_entry(topo_m4, f'{user_rdn}{number}', automem_scope, '5795', '5693', 'Contractor') + try: + # Check to sync the entries + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master2'], 'Managers'), + (topo_m4.ms['master3'], 'Contractors'), + (topo_m4.ms['master4'], 'Interns')]: + assert len(nsAdminGroup( + instance, f'cn={grp},{grp_container}').get_attr_vals_utf8('member')) == 300 + for grp in [default_group1, default_group2]: + assert not Group(topo_m4.ms['master4'], grp).get_attr_vals_utf8('member') + assert not Group(topo_m4.ms['master3'], grp).get_attr_vals_utf8('member') + + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_adding_1000_users(topo_m4, _create_entries): + """ + Adding 1000 users matching inclusive regex for Managers/Contractors + and exclusive regex for Interns/Visitors + :id: f641e612-be57-11e9-94e6-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 1000 user entries matching the inclusive/exclusive + regex rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef1,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef2,{}".format(DEFAULT_SUFFIX) + # Adding 1000 users + for number in range(1000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '799', '5693', 'Manager') + try: + # Check to sync the entries + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], 'Managers'), + (topo_m4.ms['master3'], 'Contractors')]: + assert len(nsAdminGroup( + instance, "cn={},{}".format(grp, + grp_container)).get_attr_vals_utf8('member')) == 1000 + for instance, grp in [(topo_m4.ms['master2'], 'Interns'), + (topo_m4.ms['master4'], 'Visitors')]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + for grp in [default_group1, default_group2]: + assert not Group(topo_m4.ms['master2'], grp).get_attr_vals_utf8('member') + assert not Group(topo_m4.ms['master3'], grp).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_adding_3000_users(topo_m4, _create_entries): + """ + Adding 3000 users matching all inclusive regex rules and no matching exclusive regex rules + :id: ee54576e-be57-11e9-b536-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef3,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef5,{}".format(DEFAULT_SUFFIX) + # Adding 3000 users + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '5995', '5693', 'Manager') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], 'Managers'), + (topo_m4.ms['master3'], 'Contractors'), + (topo_m4.ms['master2'], 'Interns'), + (topo_m4.ms['master4'], 'Visitors') + ]: + assert len( + nsAdminGroup(instance, + "cn={},{}".format(grp, + grp_container)).get_attr_vals_utf8('member')) == 3000 + for grp in [default_group1, default_group2]: + assert not Group(topo_m4.ms['master2'], grp).get_attr_vals_utf8('member') + assert not Group(topo_m4.ms['master3'], grp).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_3000_users_matching_all_exclusive_regex(topo_m4, _create_entries): + """ + Adding 3000 users matching all exclusive regex rules and no matching inclusive regex rules + :id: e789331e-be57-11e9-b298-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef1,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef2,{}".format(DEFAULT_SUFFIX) + default_group4 = "cn=SubDef4,{}".format(DEFAULT_SUFFIX) + # Adding 3000 users + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '399', '700', 'Manager') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + + for instance, grp in [(topo_m4.ms['master1'], default_group4), + (topo_m4.ms['master2'], default_group1), + (topo_m4.ms['master3'], default_group2), + (topo_m4.ms['master4'], default_group2)]: + assert len(nsAdminGroup(instance, grp).get_attr_vals_utf8('member')) == 3000 + for grp, instance in [('Managers', topo_m4.ms['master3']), + ('Contractors', topo_m4.ms['master2'])]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_no_matching_inclusive_regex_rules(topo_m4, _create_entries): + """ + Adding 3000 users matching all exclusive regex rules and no matching inclusive regex rules + :id: e0cc0e16-be57-11e9-9c0f-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef1,{}".format(DEFAULT_SUFFIX) + # Adding 3000 users + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '399', '700', 'Manager') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], "cn=SubDef4,{}".format(DEFAULT_SUFFIX)), + (topo_m4.ms['master2'], default_group1), + (topo_m4.ms['master3'], "cn=SubDef2,{}".format(DEFAULT_SUFFIX)), + (topo_m4.ms['master4'], "cn=SubDef3,{}".format(DEFAULT_SUFFIX))]: + assert len(nsAdminGroup(instance, grp).get_attr_vals_utf8('member')) == 3000 + for grp, instance in [('Managers', topo_m4.ms['master3']), + ('Contractors', topo_m4.ms['master2'])]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_adding_deleting_and_re_adding_the_same_3000(topo_m4, _create_entries): + """ + Adding, Deleting and re-adding the same 3000 users matching all + exclusive regex rules and no matching inclusive regex rules + :id: d939247c-be57-11e9-825d-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + 3. Delete 3000 users + 4. Again add 3000 users + 5. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + 3. Pass + 4. Pass + 5. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef1,{}".format(DEFAULT_SUFFIX) + # Adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '399', '700', 'Manager') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + assert len(nsAdminGroup(topo_m4.ms['master2'], + default_group1).get_attr_vals_utf8('member')) == 3000 + # Deleting + for user in nsAdminGroups(topo_m4.ms['master2'], automem_scope, rdn=None).list(): + user.delete() + for master in [topo_m4.ms['master1'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master2'], + master, timeout=30000) + # Again adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '399', '700', 'Manager') + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], "cn=SubDef4,{}".format(DEFAULT_SUFFIX)), + (topo_m4.ms['master3'], "cn=SubDef5,{}".format(DEFAULT_SUFFIX)), + (topo_m4.ms['master4'], "cn=SubDef3,{}".format(DEFAULT_SUFFIX))]: + assert len(nsAdminGroup(instance, grp).get_attr_vals_utf8('member')) == 3000 + for grp, instance in [('Interns', topo_m4.ms['master3']), + ('Contractors', topo_m4.ms['master2'])]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_re_adding_the_same_3000_users(topo_m4, _create_entries): + """ + Adding, Deleting and re-adding the same 3000 users matching all inclusive + regex rules and no matching exclusive regex rules + :id: d2f5f112-be57-11e9-b164-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + 3. Delete 3000 users + 4. Again add 3000 users + 5. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + 3. Pass + 4. Pass + 5. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef3,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef5,{}".format(DEFAULT_SUFFIX) + # Adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '5995', '5693', 'Manager') + try: + for master in [topo_m4.ms['master1'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master2'], + master, timeout=30000) + assert len(nsAdminGroup( + topo_m4.ms['master2'], + f'cn=Contractors,{grp_container}').get_attr_vals_utf8('member')) == 3000 + # Deleting + delete_users_and_wait(topo_m4, automem_scope) + + # re-adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '5995', '5693', 'Manager') + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], "cn=Managers,{}".format(grp_container)), + (topo_m4.ms['master3'], "cn=Contractors,{}".format(grp_container)), + (topo_m4.ms['master4'], "cn=Visitors,{}".format(grp_container)), + (topo_m4.ms['master2'], "cn=Interns,{}".format(grp_container))]: + assert len(nsAdminGroup(instance, grp).get_attr_vals_utf8('member')) == 3000 + for grp, instance in [(default_group2, topo_m4.ms['master4']), + (default_group1, topo_m4.ms['master3'])]: + assert not nsAdminGroup(instance, grp).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_users_with_different_uid_and_gid_nos(topo_m4, _create_entries): + """ + Adding, Deleting and re-adding the same 3000 users with + different uid and gid nos, with different inclusive/exclusive matching regex rules + :id: cc595a1a-be57-11e9-b053-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Add 3000 user entries matching the inclusive/exclusive regex + rules at topo_m4.ms['master1'] + 2. Check the same created in rest masters + 3. Delete 3000 users + 4. Again add 3000 users + 5. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + 3. Pass + 4. Pass + 5. Pass + """ + automem_scope = "ou=Employees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef3,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef5,{}".format(DEFAULT_SUFFIX) + # Adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, '3994', '5695', 'OnDeputation') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for intstance, grp in [(topo_m4.ms['master2'], default_group1), + (topo_m4.ms['master3'], default_group2)]: + assert len(nsAdminGroup(intstance, grp).get_attr_vals_utf8('member')) == 3000 + for grp, instance in [('Contractors', topo_m4.ms['master3']), + ('Managers', topo_m4.ms['master1'])]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + # Deleting + for user in nsAdminGroups(topo_m4.ms['master1'], automem_scope, rdn=None).list(): + user.delete() + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + # re-adding + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope, + '5995', '5693', 'OnDeputation') + + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for grp, instance in [('Contractors', topo_m4.ms['master3']), + ('Managers', topo_m4.ms['master1']), + ('Interns', topo_m4.ms['master2']), + ('Visitors', topo_m4.ms['master4'])]: + assert len(nsAdminGroup( + instance, f'cn={grp},{grp_container}').get_attr_vals_utf8('member')) == 3000 + + for instance, grp in [(topo_m4.ms['master2'], default_group1), + (topo_m4.ms['master3'], default_group2)]: + assert not nsAdminGroup(instance, grp).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + + +def test_bulk_users_to_non_automemscope(topo_m4, _create_entries): + """ + Adding bulk users to non-automem_scope and then running modrdn + operation to change the ou to automem_scope + :id: c532dc0c-be57-11e9-bcca-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Running modrdn operation to change the ou to automem_scope + 2. Add 3000 user entries to non-automem_scope at topo_m4.ms['master1'] + 3. Run AutomemberRebuildMembershipTask + 4. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + 3. Pass + 4. Pass + """ + automem_scope = "cn=EmployeesNew,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef3,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef5,{}".format(DEFAULT_SUFFIX) + nsContainers(topo_m4.ms['master1'], DEFAULT_SUFFIX).create(properties={'cn': 'ChangeThisCN'}) + Group(topo_m4.ms['master1'], + f'cn=replsubGroups,cn=autoMembersPlugin,{DEFAULT_SUFFIX}').replace('autoMemberScope', + automem_scope) + for instance in [topo_m4.ms['master1'], topo_m4.ms['master2'], + topo_m4.ms['master3'], topo_m4.ms['master4']]: + instance.restart() + # Adding BulkUsers + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', f'cn=ChangeThisCN,{DEFAULT_SUFFIX}', + '5995', '5693', 'Supervisor') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master2'], default_group1), + (topo_m4.ms['master1'], "cn=Managers,{}".format(grp_container))]: + assert not nsAdminGroup(instance, grp).get_attr_vals_utf8('member') + # Deleting BulkUsers "User_Name" Suffix "Nof_Users" + topo_m4.ms['master3'].rename_s(f"CN=ChangeThisCN,{DEFAULT_SUFFIX}", + f'cn=EmployeesNew', newsuperior=DEFAULT_SUFFIX, delold=1) + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + AutomemberRebuildMembershipTask(topo_m4.ms['master1']).create(properties={ + 'basedn': automem_scope, + 'filter': "objectClass=posixAccount" + }) + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master1'], 'Managers'), + (topo_m4.ms['master2'], 'Interns'), + (topo_m4.ms['master3'], 'Contractors'), + (topo_m4.ms['master4'], 'Visitors')]: + assert len(nsAdminGroup( + instance, f'cn={grp},{grp_container}').get_attr_vals_utf8('member')) == 3000 + for grp, instance in [(default_group1, topo_m4.ms['master2']), + (default_group2, topo_m4.ms['master3'])]: + assert not nsAdminGroup(instance, grp).get_attr_vals_utf8('member') + finally: + delete_users_and_wait(topo_m4, automem_scope) + nsContainer(topo_m4.ms['master1'], "CN=EmployeesNew,{}".format(DEFAULT_SUFFIX)).delete() + + +def test_automemscope_and_running_modrdn(topo_m4, _create_entries): + """ + Adding bulk users to non-automem_scope and running modrdn operation + with new superior to automem_scope + :id: bf60f958-be57-11e9-945d-8c16451d917b + :setup: Instance with 4 masters + :steps: + 1. Running modrdn operation to change the ou to automem_scope + 2. Add 3000 user entries to non-automem_scope at topo_m4.ms['master1'] + 3. Run AutomemberRebuildMembershipTask + 4. Check the same created in rest masters + :expected results: + 1. Pass + 2. Pass + 3. Pass + 4. Pass + """ + user_rdn = "long09usr" + automem_scope1 = "ou=Employees,{}".format(DEFAULT_SUFFIX) + automem_scope2 = "cn=NewEmployees,{}".format(DEFAULT_SUFFIX) + grp_container = "cn=replsubGroups,{}".format(DEFAULT_SUFFIX) + default_group1 = "cn=SubDef3,{}".format(DEFAULT_SUFFIX) + default_group2 = "cn=SubDef5,{}".format(DEFAULT_SUFFIX) + OrganizationalUnits(topo_m4.ms['master1'], + DEFAULT_SUFFIX).create(properties={'ou': 'NewEmployees'}) + Group(topo_m4.ms['master1'], + f'cn=replsubGroups,cn=autoMembersPlugin,{DEFAULT_SUFFIX}').replace('autoMemberScope', + automem_scope2) + for instance in [topo_m4.ms['master1'], topo_m4.ms['master2'], + topo_m4.ms['master3'], topo_m4.ms['master4']]: + Config(instance).replace('nsslapd-errorlog-level', '73728') + instance.restart() + # Adding bulk users + for number in range(3000): + create_entry(topo_m4, f'automemusrs{number}', automem_scope1, + '3994', '5695', 'OnDeputation') + try: + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for grp, instance in [(default_group2, topo_m4.ms['master3']), + ("cn=Managers,{}".format(grp_container), topo_m4.ms['master1']), + ("cn=Contractors,{}".format(grp_container), topo_m4.ms['master3'])]: + assert not nsAdminGroup(instance, grp).get_attr_vals_utf8('member') + count = 0 + for user in nsAdminGroups(topo_m4.ms['master3'], automem_scope1, rdn=None).list(): + topo_m4.ms['master1'].rename_s(user.dn, + f'cn=New{user_rdn}{count}', + newsuperior=automem_scope2, delold=1) + count += 1 + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + AutomemberRebuildMembershipTask(topo_m4.ms['master1']).create(properties={ + 'basedn': automem_scope2, + 'filter': "objectClass=posixAccount" + }) + for master in [topo_m4.ms['master2'], topo_m4.ms['master3'], topo_m4.ms['master4']]: + ReplicationManager(DEFAULT_SUFFIX).wait_for_replication(topo_m4.ms['master1'], + master, timeout=30000) + for instance, grp in [(topo_m4.ms['master3'], default_group2), + (topo_m4.ms['master3'], default_group1)]: + assert len(nsAdminGroup(instance, grp).get_attr_vals_utf8('member')) == 3000 + for instance, grp in [(topo_m4.ms['master1'], 'Managers'), + (topo_m4.ms['master3'], 'Contractors'), + (topo_m4.ms['master2'], 'Interns'), + (topo_m4.ms['master4'], 'Visitors')]: + assert not nsAdminGroup( + instance, "cn={},{}".format(grp, grp_container)).get_attr_vals_utf8('member') + finally: + for scope in [automem_scope1, automem_scope2]: + delete_users_and_wait(topo_m4, scope) + + +if __name__ == '__main__': + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s -v %s" % CURRENT_FILE) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/stress/search/simple.py 389-ds-base-1.4.4.3/dirsrvtests/tests/stress/search/simple.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/stress/search/simple.py 2020-04-16 12:56:51.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/stress/search/simple.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,5 +1,6 @@ # --- BEGIN COPYRIGHT BLOCK --- # Copyright (C) 2019 William Brown +# Copyright (C) 2020 Red Hat, Inc. # All rights reserved. # # License: GPL (version 3 or any later version). @@ -8,16 +9,15 @@ # from lib389.topologies import topology_st -from lib389.dbgen import dbgen +from lib389.dbgen import dbgen_users from lib389.ldclt import Ldclt from lib389.tasks import ImportTask - from lib389._constants import DEFAULT_SUFFIX def test_stress_search_simple(topology_st): """Test a simple stress test of searches on the directory server. - + :id: 3786d01c-ea03-4655-a4f9-450693c75863 :setup: Standalone Instance :steps: @@ -31,7 +31,6 @@ """ inst = topology_st.standalone - inst.config.set("nsslapd-verify-filter-schema", "off") # Bump idllimit to test OR worst cases. from lib389.config import LDBMConfig @@ -39,10 +38,9 @@ # lconfig.set("nsslapd-idlistscanlimit", '20000') # lconfig.set("nsslapd-lookthroughlimit", '20000') - ldif_dir = inst.get_ldif_dir() import_ldif = ldif_dir + '/basic_import.ldif' - dbgen(inst, 10000, import_ldif, DEFAULT_SUFFIX) + dbgen_users(inst, 10000, import_ldif, DEFAULT_SUFFIX) r = ImportTask(inst) r.import_suffix_from_ldif(ldiffile=import_ldif, suffix=DEFAULT_SUFFIX) @@ -50,10 +48,8 @@ # Run a small to warm up the server's caches ... l = Ldclt(inst) - l.search_loadtest(DEFAULT_SUFFIX, "(mail=XXXX@example.com)", rounds=1) # Now do it for realsies! # l.search_loadtest(DEFAULT_SUFFIX, "(|(mail=XXXX@example.com)(nonexist=foo))", rounds=10) l.search_loadtest(DEFAULT_SUFFIX, "(mail=XXXX@example.com)", rounds=10) - diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/acl/syntax_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/acl/syntax_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/acl/syntax_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/acl/syntax_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -10,10 +10,10 @@ import os import pytest - from lib389._constants import DEFAULT_SUFFIX from lib389.idm.domain import Domain from lib389.topologies import topology_st as topo +from lib389.utils import ds_is_older import ldap diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/auth_token/basic_auth_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/auth_token/basic_auth_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/auth_token/basic_auth_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/auth_token/basic_auth_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -25,7 +25,7 @@ USER_PASSWORD = "password aouoaeu" TEST_KEY = "4PXhmtKG7iCdT9C49GoBdD92x5X1tvF3eW9bHq4ND2Q=" -@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.2.0'), reason="Auth tokens are not available in older versions") +@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.3.3'), reason="Auth tokens are not available in older versions") def test_ldap_auth_token_config(topology): """ Test that we are able to configure the ldapssotoken backend with various types and states. @@ -72,7 +72,7 @@ topology.standalone.config.remove_all('nsslapd-ldapssotoken-secret') -@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.2.0'), reason="Auth tokens are not available in older versions") +@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.3.3'), reason="Auth tokens are not available in older versions") def test_ldap_auth_token_nsuser(topology): """ Test that we can generate and authenticate with authentication tokens @@ -141,7 +141,7 @@ with pytest.raises(ldap.INVALID_CREDENTIALS): user.authenticate_sso_token(token) -@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.2.0'), reason="Auth tokens are not available in older versions") +@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.3.3'), reason="Auth tokens are not available in older versions") def test_ldap_auth_token_disabled(topology): """ Assert when the feature is disabled that token operations are not able to progress @@ -191,7 +191,7 @@ user_account.authenticate_sso_token(token) -@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.2.0'), reason="Auth tokens are not available in older versions") +@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.3.3'), reason="Auth tokens are not available in older versions") def test_ldap_auth_token_directory_manager(topology): """ Test token auth with directory manager is denied @@ -214,7 +214,7 @@ dm.request_sso_token() ## test as anon (will fail) -@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.2.0'), reason="Auth tokens are not available in older versions") +@pytest.mark.skipif(not default_paths.rust_enabled or ds_is_older('1.4.3.3'), reason="Auth tokens are not available in older versions") def test_ldap_auth_token_anonymous(topology): """ Test token auth with Anonymous is denied. diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/automember_plugin/basic_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/automember_plugin/basic_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/automember_plugin/basic_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/automember_plugin/basic_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -12,18 +12,22 @@ import os import pytest +import time +import re from lib389.topologies import topology_m1 as topo from lib389.idm.organizationalunit import OrganizationalUnits from lib389.idm.domain import Domain from lib389.idm.posixgroup import PosixGroups from lib389.plugins import AutoMembershipPlugin, AutoMembershipDefinitions, \ - MemberOfPlugin, AutoMembershipRegexRules, AutoMembershipDefinition + MemberOfPlugin, AutoMembershipRegexRules, AutoMembershipDefinition, RetroChangelogPlugin from lib389.backend import Backends from lib389.config import Config from lib389._constants import DEFAULT_SUFFIX from lib389.idm.user import UserAccounts from lib389.idm.group import Groups, Group, UniqueGroup, nsAdminGroups, nsAdminGroup +from lib389.tasks import Tasks, AutomemberRebuildMembershipTask, ExportTask from lib389.utils import ds_is_older +from lib389.paths import Paths import ldap pytestmark = pytest.mark.tier1 @@ -32,6 +36,7 @@ TEST_BASE = "dc=testAutoMembers,dc=com" BASE_REPL = "dc=replAutoMembers,dc=com" SUBSUFFIX = f'dc=SubSuffix,{BASE_SUFF}' +PLUGIN_AUTO = "cn=Auto Membership Plugin,cn=plugins,cn=config" REPMANDN = "cn=ReplManager" CACHE_SIZE = '-1' CACHEMEM_SIZE = '10485760' @@ -849,6 +854,332 @@ topo.ms["master1"] .restart() +@pytest.fixture(scope="module") +def _startuptask(topo): + """ + Fixture module that will change required entries for test cases. + """ + for Configs in ["cn=Managers,cn=subsuffGroups", + "cn=Contractors,cn=subsuffGroups", + "cn=testuserGroups", + "cn=subsuffGroups", + "cn=hostGroups"]: + AutoMembershipDefinition(topo.ms["master1"], f'{Configs},{PLUGIN_AUTO}').delete() + AutoMembershipDefinition(topo.ms["master1"], "cn=userGroups,{}".format(PLUGIN_AUTO)).replace( + 'autoMemberScope', 'ou=TaskEmployees,dc=autoMembers,dc=com') + topo.ms['master1'].restart() + + +@pytest.fixture(scope="function") +def _fixture_for_build_task(request, topo): + def finof(): + master = topo.ms['master1'] + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list(): + user.delete() + + request.addfinalizer(finof) + + +def bulk_check_groups(topo, GROUP_DN, MEMBATTR, TOTAL_MEM): + assert len(nsAdminGroup(topo, GROUP_DN).get_attr_vals_utf8(MEMBATTR)) == TOTAL_MEM + + +def test_automemtask_re_build_task(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff973a8-e7ff-11e8-a89b-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users and enable autoMembers plug-in + 2. Run automembers re-build task to create the member attributes + 3. Search for any error logs + :expected results: + 1. Success + 2. Success + 3. Success + """ + master = topo.ms['master1'] + testid = "autoMemTask_01" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + contract_grp = "cn=Contractors,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # make sure the retro changelog is disabled + RetroChangelogPlugin(master).disable() + AutoMembershipPlugin(master).disable() + master.restart() + for i in range(10): + add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(1188), str(1189), "Manager") + for grp in (managers_grp, contract_grp): + with pytest.raises(AssertionError): + assert check_groups(topo, grp, f'uid=User_autoMemTask_010,{auto_mem_scope}', 'member') + AutoMembershipPlugin(master).enable() + master.restart() + error_string = "automember_rebuild_task_thread" + AutomemberRebuildMembershipTask(master).create(properties={ + 'basedn': auto_mem_scope, + 'filter': "objectClass=posixAccount" + }) + # Search for any error logs + assert not master.searchErrorsLog(error_string) + for grp in (managers_grp, contract_grp): + bulk_check_groups(master, grp, "member", 10) + + +def ldif_check_groups(USERS_DN, MEMBATTR, TOTAL_MEM, LDIF_FILE): + study = open('{}'.format(LDIF_FILE), 'r') + study_ready = study.read() + assert len(re.findall("{}: {}".format(MEMBATTR, USERS_DN.lower()), study_ready)) == TOTAL_MEM + + +def check_file_exists(export_ldif): + count = 0 + while not os.path.exists(export_ldif) and count < 3: + time.sleep(1) + count += 1 + + count = 0 + while (os.stat(export_ldif).st_size == 0) and count < 3: + time.sleep(1) + count += 1 + + if os.path.exists(export_ldif) and os.stat(export_ldif).st_size != 0: + return True + else: + return False + + +def test_automemtask_export_task(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff98b18-e7ff-11e8-872a-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users and enable autoMembers plug-in + 2. Run automembers export task to create an ldif file with member attributes + :expected results: + 1. Success + 2. Success + """ + master = topo.ms['master1'] + p = Paths('master1') + testid = "autoMemTask_02" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # Disabling plugin + AutoMembershipPlugin(master).disable() + master.restart() + for i in range(10): + add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(2788), str(2789), "Manager") + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + AutoMembershipPlugin(master).enable() + master.restart() + export_ldif = p.backup_dir + "/Out_Export_02.ldif" + if os.path.exists(export_ldif): + os.remove(export_ldif) + exp_task = Tasks(master) + exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=posixAccount', ldif_out=export_ldif) + check_file_exists(export_ldif) + ldif_check_groups("cn={}".format(user_rdn), "member", 10, export_ldif) + os.remove(export_ldif) + + +def test_automemtask_mapping(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff9a206-e7ff-11e8-bf59-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users and enable autoMembers plug-in + 2. Run automembers Mapping task with input/output ldif files + :expected results: + 1. Should success + 2. Should success + """ + master = topo.ms['master1'] + p = Paths('master1') + testid = "autoMemTask_02" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + export_ldif = p.backup_dir+"/Out_Export_02.ldif" + output_ldif3 = p.backup_dir+"/Output_03.ldif" + for file in [export_ldif, output_ldif3]: + if os.path.exists(file): + os.remove(file) + for i in range(10): + add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(2788), str(2789), "Manager") + ExportTask(master).export_suffix_to_ldif(ldiffile=export_ldif, suffix=BASE_SUFF) + check_file_exists(export_ldif) + map_task = Tasks(master) + map_task.automemberMap(ldif_in=export_ldif, ldif_out=output_ldif3) + check_file_exists(output_ldif3) + ldif_check_groups("cn={}".format(user_rdn), "member", 10, output_ldif3) + for file in [export_ldif, output_ldif3]: + os.remove(file) + + +def test_automemtask_re_build(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff9b944-e7ff-11e8-ad35-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users with inetOrgPerson object class + 2. Run automembers re-build task to create the member attributes, exp to FAIL + :expected results: + 1. Should success + 2. Should not success + """ + master = topo.ms['master1'] + testid = "autoMemTask_04" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # Disabling plugin + AutoMembershipPlugin(master).disable() + master.restart() + for number in range(10): + add_user(topo, f'{user_rdn}{number}', auto_mem_scope, str(number), str(number), "Manager") + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + # Enabling plugin + AutoMembershipPlugin(master).enable() + master.restart() + AutomemberRebuildMembershipTask(master).create(properties={ + 'basedn': auto_mem_scope, + 'filter': "objectClass=inetOrgPerson" + }) + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + + +def test_automemtask_export(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff9cf74-e7ff-11e8-b712-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users with inetOrgPerson objectClass + 2. Run automembers export task to create an ldif file with member attributes, exp to FAIL + :expected results: + 1. Should success + 2. Should not success + """ + master = topo.ms['master1'] + p = Paths('master1') + testid = "autoMemTask_05" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # Disabling plugin + AutoMembershipPlugin(master).disable() + master.restart() + for number in range(10): + add_user(topo, f'{user_rdn}{number}', auto_mem_scope, str(number), str(number), "Manager") + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + # Enabling plugin + AutoMembershipPlugin(master).enable() + master.restart() + export_ldif = p.backup_dir + "/Out_Export_02.ldif" + if os.path.exists(export_ldif): + os.remove(export_ldif) + exp_task = Tasks(master) + exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=inetOrgPerson', ldif_out=export_ldif) + check_file_exists(export_ldif) + with pytest.raises(AssertionError): + ldif_check_groups("uid={}".format(user_rdn), "member", 10, export_ldif) + os.remove(export_ldif) + + +def test_automemtask_run_re_build(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff9e5c2-e7ff-11e8-943e-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users with inetOrgPerson obj class + 2. Change plugin config + 3. Enable plug-in and run re-build task to create the member attributes + :expected results: + 1. Should success + 2. Should success + 3. Should success + """ + master = topo.ms['master1'] + p = Paths('master1') + testid = "autoMemTask_06" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # Disabling plugin + AutoMembershipPlugin(master).disable() + master.restart() + for number in range(10): + add_user(topo, f'{user_rdn}{number}', auto_mem_scope, '111', '111', "Manager") + for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list(): + user.add('objectclass', 'inetOrgPerson') + AutoMembershipDefinition(master, + f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter', + "objectclass=inetOrgPerson") + master.restart() + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + AutoMembershipPlugin(master).enable() + master.restart() + AutomemberRebuildMembershipTask(master).create(properties={ + 'basedn': auto_mem_scope, + 'filter': "objectClass=inetOrgPerson"}) + time.sleep(2) + bulk_check_groups(master, managers_grp, "member", 10) + AutoMembershipDefinition(master, + f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter', + "objectclass=posixAccount") + master.restart() + + +def test_automemtask_run_export(topo, _create_all_entries, _startuptask, _fixture_for_build_task): + """ + :id: 4ff9fba2-e7ff-11e8-a5ec-8c16451d917b + :setup: 4 Instances with replication + :steps: + 1. Add 10 users with inetOrgPerson objectClass + 2. change plugin config + 3. Run export task to create an ldif file with member attributes + :expected results: + 1. Should success + 2. Should success + 3. Should success + """ + master = topo.ms['master1'] + p = Paths('master1') + testid = "autoMemTask_07" + auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF) + managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF) + user_rdn = "User_{}".format(testid) + # Disabling plugin + AutoMembershipPlugin(master).disable() + master.restart() + for number in range(10): + add_user(topo, f'{user_rdn}{number}', auto_mem_scope, '222', '222', "Manager") + for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list(): + user.add('objectclass', 'inetOrgPerson') + AutoMembershipDefinition(master, f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter', + "objectclass=inetOrgPerson") + master.restart() + # Enabling plugin + AutoMembershipPlugin(master).enable() + master.restart() + with pytest.raises(AssertionError): + bulk_check_groups(master, managers_grp, "member", 10) + export_ldif = p.backup_dir + "/Out_Export_02.ldif" + if os.path.exists(export_ldif): + os.remove(export_ldif) + exp_task = Tasks(master) + exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=inetOrgPerson', ldif_out=export_ldif) + check_file_exists(export_ldif) + ldif_check_groups("cn={}".format(user_rdn), "member", 10, export_ldif) + AutoMembershipDefinition(master, f'cn=userGroups,{PLUGIN_AUTO}').\ + replace('autoMemberFilter', "objectclass=posixAccount") + + if __name__ == "__main__": CURRENT_FILE = os.path.realpath(__file__) - pytest.main("-s -v %s" % CURRENT_FILE) + pytest.main("-s -v %s" % CURRENT_FILE) \ No newline at end of file diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/basic/basic_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/basic/basic_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/basic/basic_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/basic/basic_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,5 +1,5 @@ # --- BEGIN COPYRIGHT BLOCK --- -# Copyright (C) 2016 Red Hat, Inc. +# Copyright (C) 2020 Red Hat, Inc. # All rights reserved. # # License: GPL (version 3 or any later version). @@ -18,10 +18,9 @@ from lib389.tasks import * from lib389.utils import * from lib389.topologies import topology_st -from lib389.dbgen import dbgen +from lib389.dbgen import dbgen_users from lib389.idm.organizationalunit import OrganizationalUnits from lib389._constants import DN_DM, PASSWORD, PW_DM -from lib389.topologies import topology_st from lib389.paths import Paths from lib389.idm.directorymanager import DirectoryManager from lib389.config import LDBMConfig @@ -266,7 +265,7 @@ log.info("Generating LDIF...") ldif_dir = topology_st.standalone.get_ldif_dir() import_ldif = ldif_dir + '/basic_import.ldif' - dbgen(topology_st.standalone, 50000, import_ldif, DEFAULT_SUFFIX) + dbgen_users(topology_st.standalone, 50000, import_ldif, DEFAULT_SUFFIX) # Online log.info("Importing LDIF online...") diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/disk_monitoring/disk_monitoring_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/disk_monitoring/disk_monitoring_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/disk_monitoring/disk_monitoring_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/disk_monitoring/disk_monitoring_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -21,7 +21,7 @@ from lib389.idm.user import UserAccounts pytestmark = pytest.mark.tier2 -disk_monitoring_ack = pytest.mark.skipif(not os.environ.get('DISK_MONITORING_ACK', False), reason="GSSAPI tests may damage system configuration.") +disk_monitoring_ack = pytest.mark.skipif(not os.environ.get('DISK_MONITORING_ACK', False), reason="Disk monitoring tests may damage system configuration.") THRESHOLD = '30' THRESHOLD_BYTES = '30000000' diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/ds_logs/ds_logs_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/ds_logs/ds_logs_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/ds_logs/ds_logs_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/ds_logs/ds_logs_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -6,6 +6,7 @@ # See LICENSE for details. # --- END COPYRIGHT BLOCK --- # +from decimal import * import os import logging import pytest @@ -30,7 +31,6 @@ PLUGIN_LOGGING = 'nsslapd-plugin-logging' USER1_DN = 'uid=user1,' + DEFAULT_SUFFIX - def add_users(topology_st, users_num): users = UserAccounts(topology_st, DEFAULT_SUFFIX) log.info('Adding %d users' % users_num) @@ -161,6 +161,20 @@ return clean_access_logs +@pytest.fixture(scope="function") +def remove_users(topology_st, request): + def _remove_users(): + topo = topology_st.standalone + users = UserAccounts(topo, DEFAULT_SUFFIX) + entries = users.list() + assert len(entries) > 0 + + log.info("Removing all added users") + for entry in entries: + delete_obj(entry) + + request.addfinalizer(_remove_users) + def set_audit_log_config_values(topology_st, request, enabled, logsize): topo = topology_st.standalone @@ -182,6 +196,7 @@ set_audit_log_config_values(topology_st, request, 'on', '1') + @pytest.mark.bz1273549 def test_check_default(topology_st): """Check the default value of nsslapd-logging-hr-timestamps-enabled, @@ -230,7 +245,7 @@ @pytest.mark.bz1273549 -def test_log_plugin_on(topology_st): +def test_log_plugin_on(topology_st, remove_users): """Check access logs for millisecond, when nsslapd-logging-hr-timestamps-enabled=ON @@ -263,10 +278,10 @@ access_log_lines = topology_st.standalone.ds_access_log.readlines() assert len(access_log_lines) > 0 assert topology_st.standalone.ds_access_log.match(r'^\[.+\d{9}.+\].+') - + @pytest.mark.bz1273549 -def test_log_plugin_off(topology_st): +def test_log_plugin_off(topology_st, remove_users): """Milliseconds should be absent from access logs when nsslapd-logging-hr-timestamps-enabled=OFF @@ -303,6 +318,7 @@ topology_st.standalone.deleteAccessLogs() # Now generate some fresh logs + add_users(topology_st.standalone, 10) search_users(topology_st.standalone) log.info('Restart the server to flush the logs') @@ -741,6 +757,85 @@ assert not invalid_etime +@pytest.mark.skipif(ds_is_older('1.3.10.1'), reason="Fail because of bug 1749236") +@pytest.mark.bz1749236 +def test_etime_order_of_magnitude(topology_st, clean_access_logs, remove_users): + """Test that the etime reported in the access log has a correct order of magnitude + + :id: e815cfa0-8136-4932-b50f-c3dfac34b0e6 + :setup: Standalone instance + :steps: + 1. Unset log buffering for the access log + 2. Delete potential existing access logs + 3. Add users + 4. Search users + 5. Restart the server to flush the logs + 6. Parse the access log looking for the SRCH operation log + 7. From the SRCH string get the start time and op number of the operation + 8. From the op num find the associated RESULT string in the access log + 9. From the RESULT string get the end time and the etime for the operation + 10. Calculate the ratio between the calculated elapsed time (end time - start time) and the logged etime + :expectedresults: + 1. access log buffering is off + 2. Previously existing access logs are deleted + 3. Users are successfully added + 4. Search operation is successful + 5. Server is restarted and logs are flushed + 6. SRCH operation log string is catched + 7. start time and op number are collected + 8. RESULT string is catched from the access log + 9. end time and etime are collected + 10. ratio between calculated elapsed time and logged etime is less or equal to 1 + """ + + entry = DSLdapObject(topology_st.standalone, DEFAULT_SUFFIX) + + log.info('Set accesslog logbuffering to off to get the log in real time') + topology_st.standalone.config.set('nsslapd-accesslog-logbuffering', 'off') + + log.info('add_users') + add_users(topology_st.standalone, 30) + + log.info ('search users') + search_users(topology_st.standalone) + + log.info('parse the access logs to get the SRCH string') + # Here we are looking at the whole string logged for the search request with base ou=People,dc=example,dc=com + search_str = str(topology_st.standalone.ds_access_log.match(r'.*SRCH base="ou=People,dc=example,dc=com.*'))[1:-1] + assert len(search_str) > 0 + + # the search_str returned looks like : + # [23/Apr/2020:06:06:14.360857624 -0400] conn=1 op=93 SRCH base="ou=People,dc=example,dc=com" scope=2 filter="(&(objectClass=account)(objectClass=posixaccount)(objectClass=inetOrgPerson)(objectClass=organizationalPerson))" attrs="distinguishedName" + + log.info('get the operation start time from the SRCH string') + # Here we are getting the sec.nanosec part of the date, '14.360857624' in the example above + start_time = (search_str.split()[0]).split(':')[3] + + log.info('get the OP number from the SRCH string') + # Here we are getting the op number, 'op=93' in the above example + op_num = search_str.split()[3] + + log.info('get the RESULT string matching the SRCH OP number') + # Here we are looking at the RESULT string for the above search op, 'op=93' in this example + result_str = str(topology_st.standalone.ds_access_log.match(r'.*{} RESULT*'.format(op_num)))[1:-1] + assert len(result_str) > 0 + + # The result_str returned looks like : + # [23/Apr/2020:06:06:14.366429900 -0400] conn=1 op=93 RESULT err=0 tag=101 nentries=30 etime=0.005723017 + + log.info('get the operation end time from the RESULT string') + # Here we are getting the sec.nanosec part of the date, '14.366429900' in the above example + end_time = (result_str.split()[0]).split(':')[3] + + log.info('get the logged etime for the operation from the RESULT string') + # Here we are getting the etime value, '0.005723017' in the example above + etime = result_str.split()[8].split('=')[1][:-3] + + log.info('Calculate the ratio between logged etime for the operation and elapsed time from its start time to its end time - should be around 1') + etime_ratio = (Decimal(end_time) - Decimal(start_time)) // Decimal(etime) + assert etime_ratio <= 1 + + @pytest.mark.xfail(ds_is_older('1.3.10.1'), reason="May fail because of bug 1662461") @pytest.mark.bz1662461 @pytest.mark.ds50428 diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/filter/filterscanlimit_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/filter/filterscanlimit_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/filter/filterscanlimit_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/filter/filterscanlimit_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -11,6 +11,7 @@ """ import os +import ldap import pytest from lib389._constants import DEFAULT_SUFFIX, PW_DM @@ -19,11 +20,11 @@ from lib389.idm.organizationalunit import OrganizationalUnits from lib389.index import Index from lib389.idm.account import Accounts -from lib389.idm.group import UniqueGroups, Group +from lib389.idm.group import UniqueGroups +from lib389.utils import ds_is_older pytestmark = pytest.mark.tier1 - GIVEN_NAME = 'cn=givenname,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config' CN_NAME = 'cn=sn,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config' UNIQMEMBER = 'cn=uniquemember,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config' @@ -39,7 +40,6 @@ "Judy Wallace", "Marcus Ward", "Judy McFarland", - "Anuj Hall", "Gern Triplett", "Emanuel Johnson", "Brad Walker", @@ -57,7 +57,6 @@ "Randy Ulrich", "Richard Francis", "Morgan White", - "Anuj Maddox", "Jody Jensen", "Mike Carter", "Gern Tyler", @@ -77,8 +76,6 @@ "Robert Daugherty", "Torrey Mason", "Brad Talbot", - "Anuj Jablonski", - "Harry Miller", "Jeffrey Campaigne", "Stephen Triplett", "John Falena", @@ -107,8 +104,7 @@ "Tobias Schmith", "Jon Goldstein", "Janet Lutz", - "Karl Cope", -] + "Karl Cope"] LIST_OF_USER_TESTING = [ "Andy Bergin", @@ -122,8 +118,7 @@ "Alan White", "Daniel Ward", "Lee Stockton", - "Matthew Vaughan" -] + "Matthew Vaughan"] LIST_OF_USER_DEVELOPMENT = [ "Kelly Winters", @@ -143,7 +138,6 @@ "Timothy Kelly", "Sue Mason", "Chris Alexander", - "Anuj Jensen", "Martin Talbot", "Scott Farmer", "Allison Jensen", @@ -152,9 +146,7 @@ "Dan Langdon", "Ashley Knutson", "Jon Bourke", - "Pete Hunt", - -] + "Pete Hunt"] LIST_OF_USER_PAYROLL = [ "Ashley Chassin", @@ -164,12 +156,17 @@ "Patricia Shelton", "Dietrich Swain", "Allison Hunter", - "Anne-Louise Barnes" + "Anne-Louise Barnes"] -] +LIST_OF_USER_PEOPLE = [ + 'Sam Carter', + 'Tom Morris', + 'Kevin Vaughan', + 'Rich Daugherty', + 'Harry Miller', + 'Sam Schmith'] - -@pytest.mark.skip(reason="https://pagure.io/389-ds-base/issue/50201") +@pytest.mark.xfail(ds_is_older('1.4.4'), reason="https://pagure.io/389-ds-base/issue/50201") def test_invalid_configuration(topo): """" Error handling for invalid configuration @@ -190,10 +187,7 @@ 'limit=0 flags=AND flags=AND', 'limit=0 type=eq values=foo values=foo', 'limit=0 type=eq values=foo,foo', - 'limit=0 type=sub', - 'limit=0 type=eq values=notvalid', 'limit', - 'limit=0 type=eq values=notavaliddn', 'limit=0 type=pres values=bogus', 'limit=0 type=eq,sub values=bogus', 'limit=', @@ -203,7 +197,8 @@ 'limit=-2', 'type=eq', 'limit=0 type=bogus']: - Index(topo.standalone, GIVEN_NAME).replace('nsIndexIDListScanLimit', i) + with pytest.raises(ldap.UNWILLING_TO_PERFORM): + Index(topo.standalone, GIVEN_NAME).replace('nsIndexIDListScanLimit', i) def test_idlistscanlimit(topo): @@ -247,28 +242,24 @@ (LIST_OF_USER_HUMAN, users_human), (LIST_OF_USER_TESTING, users_testing), (LIST_OF_USER_DEVELOPMENT, users_development), - (LIST_OF_USER_PAYROLL, users_payroll)]: + (LIST_OF_USER_PAYROLL, users_payroll), + (LIST_OF_USER_PEOPLE, users_people)]: for demo1 in data[0]: + fn = demo1.split()[0] + sn = demo1.split()[1] + uid = ''.join([fn[:1], sn]).lower() data[1].create(properties={ - 'uid': demo1, + 'uid': uid, 'cn': demo1, - 'sn': demo1.split()[1], + 'sn': sn, 'uidNumber': str(1000), 'gidNumber': '2000', - 'homeDirectory': '/home/' + demo1, - 'givenname': demo1.split()[0], - 'userpassword': PW_DM + 'homeDirectory': f'/home/{uid}', + 'givenname': fn, + 'userpassword': PW_DM, + 'mail': f'{uid}@test.com' }) - users_people.create(properties={ - 'uid': 'scarter', - 'cn': 'Sam Carter', - 'sn': 'Carter', - 'uidNumber': str(1000), - 'gidNumber': '2000', - 'homeDirectory': '/home/' + 'scarter', - 'mail': 'scarter@anuj.com', - }) try: # Change log levels errorlog_value = topo.standalone.config.get_attr_val_utf8('nsslapd-errorlog-level') @@ -297,16 +288,12 @@ Index(topo.standalone, UNIQMEMBER).\ replace('nsIndexIDListScanLimit', - 'limit=0 type=eq values=uid=kvaughan,ou=People,' - 'dc=example,dc=com,uid=rdaugherty,ou=People,dc=example,dc=com') + 'limit=0 type=eq values=uid=kvaughan\2Cou=People\2Cdc=example\2Cdc=com,' + 'uid=rdaugherty\2Cou=People\2Cdc=example\2Cdc=com') Index(topo.standalone, OBJECTCLASS).\ replace('nsIndexIDListScanLimit', 'limit=0 type=eq flags=AND values=inetOrgPerson') - Index(topo.standalone, MAIL).\ - replace('nsIndexIDListScanLimit', - 'cn=mail,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config') - # Search with filter for i in ['(sn=Lutz)', '(sn=*ter)', @@ -321,22 +308,24 @@ '(&(sn=*)(cn=*))', '(sn=Hunter)', '(&(givenname=Richard)(objectclass=organizationalPerson))', - '(givenname=Anuj)', + '(givenname=Morgan)', '(&(givenname=*)(cn=*))', '(givenname=*)']: assert Accounts(topo.standalone, DEFAULT_SUFFIX).filter(f'{i}') - # Creating Group - Group(topo.standalone, 'cn=Accounting Managers,ou=groups,dc=example,dc=com').\ - add('uniquemember', + # Creating Groups and adding members + groups = UniqueGroups(topo.standalone, DEFAULT_SUFFIX) + accounting_managers = groups.ensure_state(properties={'cn': 'Accounting Managers'}) + hr_managers = groups.ensure_state(properties={'cn': 'HR Managers'}) + + accounting_managers.add('uniquemember', ['uid=scarter, ou=People, dc=example,dc=com', 'uid=tmorris, ou=People, dc=example,dc=com', 'uid=kvaughan, ou=People, dc=example,dc=com', 'uid=rdaugherty, ou=People, dc=example,dc=com', 'uid=hmiller, ou=People, dc=example,dc=com']) - Group(topo.standalone, 'cn=HR Managers,ou=groups,dc=example,dc=com').\ - add('uniquemember', + hr_managers.add('uniquemember', ['uid=kvaughan, ou=People, dc=example,dc=com', 'uid=cschmith, ou=People, dc=example,dc=com']) @@ -403,10 +392,9 @@ '(&(sn=*)(cn=*))', '(sn=Hunter)', '(&(givenname=Richard)(objectclass=organizationalPerson))', - '(givenname=Anuj)', + '(givenname=Morgan)', '(&(givenname=*)(cn=*))', '(givenname=*)']: - assert Accounts(topo.standalone, DEFAULT_SUFFIX).filter(value) finally: diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/filter/rfc3673_all_oper_attrs_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/filter/rfc3673_all_oper_attrs_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/filter/rfc3673_all_oper_attrs_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/filter/rfc3673_all_oper_attrs_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -26,7 +26,7 @@ TEST_PARAMS = [(DN_ROOT, False, [ 'aci', 'createTimestamp', 'creatorsName', 'modifiersName', 'modifyTimestamp', 'namingContexts', - 'nsBackendSuffix', 'nsUniqueId', 'subschemaSubentry', + 'nsBackendSuffix', 'subschemaSubentry', 'supportedControl', 'supportedExtension', 'supportedFeatures', 'supportedLDAPVersion', 'supportedSASLMechanisms', 'vendorName', 'vendorVersion' @@ -34,7 +34,7 @@ (DN_ROOT, True, [ 'createTimestamp', 'creatorsName', 'modifiersName', 'modifyTimestamp', 'namingContexts', - 'nsBackendSuffix', 'nsUniqueId', 'subschemaSubentry', + 'nsBackendSuffix', 'subschemaSubentry', 'supportedControl', 'supportedExtension', 'supportedFeatures', 'supportedLDAPVersion', 'supportedSASLMechanisms', 'vendorName', 'vendorVersion' @@ -156,7 +156,9 @@ entries = topology_st.standalone.search_s(search_suffix, ldap.SCOPE_BASE, '(objectclass=*)', search_filter) - found_attrs = entries[0].data.keys() + found_attrs = set(entries[0].data.keys()) + if search_suffix == DN_ROOT and "nsUniqueId" in found_attrs: + found_attrs.remove("nsUniqueId") if add_attr == '*': assert set(expected_attrs) - set(found_attrs) == set() diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/fractional/__init__.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/fractional/__init__.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/fractional/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/fractional/__init__.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,3 @@ +""" + :Requirement: 389-ds-base: Fractional replication +""" diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,565 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2020 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- +# +import pytest +import os +import subprocess +from lib389.utils import * +from lib389._constants import * +from lib389.cli_base import FakeArgs +from lib389.topologies import topology_st, topology_no_sample +from lib389.cli_ctl.health import health_check_run +from lib389.paths import Paths + + +ds_paths = Paths() +pytestmark = pytest.mark.skipif(ds_paths.perl_enabled and (os.getenv('PYINSTALL') is None), + reason="These tests need to use python installer") + +if DEBUGGING: + logging.getLogger(__name__).setLevel(logging.DEBUG) +else: + logging.getLogger(__name__).setLevel(logging.INFO) +log = logging.getLogger(__name__) + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.xfail(ds_is_older("1.4.1"), reason="Not implemented") +def test_healthcheck_standalone(topology_st): + """Check functionality of HealthCheck Tool on standalone instance with no errors + + :id: 4844b446-3939-4fbd-b14b-293b20bb8be0 + :setup: Standalone instance + :steps: + 1. Create DS instance + 2. Use HealthCheck without --json option + 3. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + """ + + standalone = topology_st.standalone + cmd_output = 'No issues found.' + json_ouput = '[]' + + args = FakeArgs() + args.instance = standalone.serverid + args.verbose = standalone.verbose + + log.info("Use healthcheck without --json option") + args.json = False + health_check_run(standalone, topology_st.logcap.log, args) + assert topology_st.logcap.contains(cmd_output) + + log.info('Use healthcheck with --json option') + args.json = True + health_check_run(standalone, topology_st.logcap.log, args) + assert topology_st.logcap.contains(json_ouput) + + +@pytest.mark.ds50873 +@pytest.mark.bz1796343 +@pytest.mark.xfail(ds_is_older("1.4.1"), reason="Not implemented") +def test_health_check_database_not_initialized(topology_no_sample): + """Check if HealthCheck returns DSBLE0003 code + + :id: 716b1ff1-94bd-4780-98b8-96ff8ef21e30 + :setup: Standalone instance + :steps: + 1. Create DS instance without example entries + 2. Use HealthCheck without --json option + 3. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. HealthCheck should return code DSBLE0003 + 3. HealthCheck should return code DSBLE0003 + """ + + ret_code = 'DSBLE0003' + standalone = topology_no_sample.standalone + + args = FakeArgs() + args.instance = standalone.serverid + args.verbose = standalone.verbose + + log.info("Use healthcheck without --json option") + args.json = False + health_check_run(standalone, topology_no_sample.logcap.log, args) + assert topology_no_sample.logcap.contains(ret_code) + log.info("HealthCheck returned DSBLE0003") + + log.info('Use healthcheck with --json option') + args.json = True + health_check_run(standalone, topology_no_sample.logcap.log, args) + assert topology_no_sample.logcap.contains(ret_code) + log.info("HealthCheck with --json argument returned DSBLE0003") + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_replication(request): + """Check functionality of HealthCheck Tool on replication instance with no errors + + :id: 9ee6d491-d6d7-4c2c-ac78-70d08f054166 + :setup: 2 MM topology + :steps: + 1. Create a two masters replication topology + 2. Use HealthCheck without --json option + 3. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_backend_missing_mapping_tree(request): + """Check if HealthCheck returns DSBLE0001 and DSBLE0002 code + + :id: 4c83ffcf-01a4-4ec8-a3d2-01022b566225 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Disable the dc=example,dc=com backend suffix entry in the mapping tree + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. Enable the dc=example,dc=com backend suffix entry in the mapping tree + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSBLE0001 and DSBLE0002 codes and related details + 4. Healthcheck reports DSBLE0001 and DSBLE0002 codes and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_virtual_attr_incorrectly_indexed(request): + """Check if HealthCheck returns DSVIRTLE0001 code + + :id: 1055173b-21aa-4aaa-9e91-4dc6c5e0c01f + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Create a CoS definition entry + 3. Create the matching CoS template entry, with postalcode as virtual attribute + 4. Create an index for postalcode + 5. Use HealthCheck without --json option + 6. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Success + 5. Healthcheck reports DSVIRTLE0001 code and related details + 6. Healthcheck reports DSVIRTLE0001 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_logging_format_should_be_revised(request): + """Check if HealthCheck returns DSCLE0001 code + + :id: 277d7980-123b-481b-acba-d90921b9f5ac + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Set nsslapd-logging-hr-timestamps-enabled to ‘off’ + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. Set nsslapd-logging-hr-timestamps-enabled to ‘on’ + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSCLE0001 code and related details + 4. Healthcheck reports DSCLE0001 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_insecure_pwd_hash_configured(request): + """Check if HealthCheck returns DSCLE0002 code + + :id: 6baf949c-a5eb-4f4e-83b4-8302e677758a + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Configure an insecure passwordStorageScheme (as SHA) for the instance + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. Set passwordStorageScheme and nsslapd-rootpwstoragescheme to PBKDF2_SHA256 + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSCLE0002 code and related details + 4. Healthcheck reports DSCLE0002 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_min_allowed_tls_version_too_low(request): + """Check if HealthCheck returns DSELE0001 code + + :id: a4be3390-9508-4827-8f82-e4e21081caab + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Set the TLS minimum version to TLS1.0 + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. Set the TLS minimum version to TLS1.2 + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSELE0001 code and related details + 4. Healthcheck reports DSELE0001 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_RI_plugin_is_misconfigured(request): + """Check if HealthCheck returns DSRILE0001 code + + :id: de2e90a2-89fe-472c-acdb-e13cbca5178d + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Configure the instance with Integrity Plugin + 3. Set the referint-update-delay attribute of the RI plugin, to a value upper than 0 + 4. Use HealthCheck without --json option + 5. Use HealthCheck with --json option + 6. Set the referint-update-delay attribute to 0 + 7. Use HealthCheck without --json option + 8. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Healthcheck reports DSRILE0001 code and related details + 5. Healthcheck reports DSRILE0001 code and related details + 6. Success + 7. Healthcheck reports no issue found + 8. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_RI_plugin_missing_indexes(request): + """Check if HealthCheck returns DSRILE0002 code + + :id: 05c55e37-bb3e-48d1-bbe8-29c980f94f10 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Configure the instance with Integrity Plugin + 3. Change the index type of the member attribute index to ‘approx’ + 4. Use HealthCheck without --json option + 5. Use HealthCheck with --json option + 6. Set the index type of the member attribute index to ‘eq’ + 7. Use HealthCheck without --json option + 8. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Healthcheck reports DSRILE0002 code and related details + 5. Healthcheck reports DSRILE0002 code and related details + 6. Success + 7. Healthcheck reports no issue found + 8. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_replication_out_of_sync_broken(request): + """Check if HealthCheck returns DSREPLLE0001 code + + :id: b5ae7cae-de0f-4206-95a4-f81538764bea + :setup: 3 MMR topology + :steps: + 1. Create a 3 masters full-mesh topology, on M2 and M3 don’t set nsds5BeginReplicaRefresh:start + 2. Perform modifications on M1 + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSREPLLE0001 code and related details + 4. Healthcheck reports DSREPLLE0001 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_replication_presence_of_conflict_entries(request): + """Check if HealthCheck returns DSREPLLE0002 code + + :id: 43abc6c6-2075-42eb-8fa3-aa092ff64cba + :setup: Replicated topology + :steps: + 1. Create a replicated topology + 2. Create conflict entries : different entries renamed to the same dn + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSREPLLE0002 code and related details + 4. Healthcheck reports DSREPLLE0002 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_replication_out_of_sync_not_broken(request): + """Check if HealthCheck returns DSREPLLE0003 code + + :id: 8305000d-ba4d-4c00-8331-be0e8bd92150 + :setup: 3 MMR topology + :steps: + 1. Create a 3 masters full-mesh topology, all replicas being synchronized + 2. stop M1 + 3. Perform an update on M2 and M3. + 4. Check M2 and M3 are synchronized. + 5. From M2, reinitialize the M3 agreement + 6. Stop M2 + 7. Restart M1 + 8. Use HealthCheck without --json option + 9. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Success + 5. Success + 6. Success + 7. Success + 8. Healthcheck reports DSREPLLE0003 code and related details + 9. Healthcheck reports DSREPLLE0003 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_replication_presence_of_conflict_entries(request): + """Check if HealthCheck returns DSREPLLE0005 code + + :id: d452a564-7b82-4c1a-b331-a71abbd82a10 + :setup: Replicated topology + :steps: + 1. Create a replicated topology + 2. On M1, set nsds5replicaport for the replication agreement to an unreachable port on the replica + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. On M1, set nsds5replicaport for the replication agreement to a reachable port number + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSREPLLE0005 code and related details + 4. Healthcheck reports DSREPLLE0005 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_changelog_trimming_not_configured(request): + """Check if HealthCheck returns DSCLLE0001 code + + :id: c2165032-88ba-4978-a4ca-2fecfd8c35d8 + :setup: Replicated topology + :steps: + 1. Create a replicated topology + 2. On M1, remove nsslapd-changelogmaxage from cn=changelog5,cn=config + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. On M1, set nsslapd-changelogmaxage to 30d + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSCLLE0001 code and related details + 4. Healthcheck reports DSCLLE0001 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_certif_expiring_within_30d(request): + """Check if HealthCheck returns DSCERTLE0001 code + + :id: c2165032-88ba-4978-a4ca-2fecfd8c35d8 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Use libfaketime to tell the process the date is within 30 days before certificate expiration + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSCERTLE0001 code and related details + 4. Healthcheck reports DSCERTLE0001 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_certif_expired(request): + """Check if HealthCheck returns DSCERTLE0002 code + + :id: ceff2c22-62c0-4fd9-b737-930a88458d68 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Use libfaketime to tell the process the date is after certificate expiration + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSCERTLE0002 code and related details + 4. Healthcheck reports DSCERTLE0002 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_low_disk_space(request): + """Check if HealthCheck returns DSDSLE0001 code + + :id: 144b335d-077e-430c-9c0e-cd6b0f2f73c1 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Get the free disk space for / + 3. Use fallocate -l to create a file large enough for the use % be up 90% + 4. Use HealthCheck without --json option + 5. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. free disk space value + 3. Success + 3. Healthcheck reports DSDSLE0001 code and related details + 4. Healthcheck reports DSDSLE0001 code and related details + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_resolvconf_bad_file_perm(request): + """Check if HealthCheck returns DSPERMLE0001 code + + :id: 8572b9e9-70e7-49e9-b745-864f6f2468a8 + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Change the /etc/resolv.conf file permissions to 444 + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. set /etc/resolv.conf permissions to 644 + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSPERMLE0001 code and related details + 4. Healthcheck reports DSPERMLE0001 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +@pytest.mark.ds50873 +@pytest.mark.bz1685160 +@pytest.mark.skip(reason="Not implemented") +def test_healthcheck_security_bad_file_perm(request): + """Check if HealthCheck returns DSPERMLE0002 code + + :id: ec137d66-bad6-4eed-90bd-fc1d572bbe1f + :setup: Standalone instance + :steps: + 1. Create DS instance from template file + 2. Change the /etc/dirsrv/slapd-xxx/pwdfile.txt permissions to 000 + 3. Use HealthCheck without --json option + 4. Use HealthCheck with --json option + 5. Change the /etc/dirsrv/slapd-xxx/pwdfile.txt permissions to 400 + 6. Use HealthCheck without --json option + 7. Use HealthCheck with --json option + :expectedresults: + 1. Success + 2. Success + 3. Healthcheck reports DSPERMLE0002 code and related details + 4. Healthcheck reports DSPERMLE0002 code and related details + 5. Success + 6. Healthcheck reports no issue found + 7. Healthcheck reports no issue found + """ + + +if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode + CURRENT_FILE = os.path.realpath(__file__) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/healthcheck/__init__.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/healthcheck/__init__.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/healthcheck/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/healthcheck/__init__.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,3 @@ +""" + :Requirement: 389-ds-base: HealthCheck +""" \ No newline at end of file diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/import/import_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/import/import_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/import/import_test.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/import/import_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,176 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2020 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- + +""" +Will test Import (Offline/Online) +""" + +import os +import pytest +import time +import re +import glob +import os +from lib389.topologies import topology_st as topo +from lib389._constants import DEFAULT_SUFFIX +from lib389.dbgen import dbgen_users +from lib389.tasks import ImportTask +from lib389.index import Indexes +from lib389.monitor import Monitor +from lib389.config import LDBMConfig +from lib389.utils import ds_is_newer +from lib389.idm.user import UserAccount, UserAccounts +from lib389.idm.account import Accounts, Account + +pytestmark = pytest.mark.tier1 + + +def _generate_ldif(topo, no_no): + """ + Will generate the ldifs + """ + ldif_dir = topo.standalone.get_ldif_dir() + import_ldif = ldif_dir + '/basic_import.ldif' + dbgen_users(topo.standalone, no_no, import_ldif, DEFAULT_SUFFIX) + + +def _check_users_before_test(topo, no_no): + """ + Will check no user before test. + """ + accounts = Accounts(topo.standalone, DEFAULT_SUFFIX) + assert len(accounts.filter('(uid=*)')) < no_no + + +def _search_for_user(topo, no_n0): + """ + Will make sure that users are imported + """ + accounts = Accounts(topo.standalone, DEFAULT_SUFFIX) + assert len(accounts.filter('(uid=*)')) == no_n0 + + +@pytest.fixture(scope="function") +def _import_clean(request, topo): + def finofaci(): + accounts = Accounts(topo.standalone, DEFAULT_SUFFIX) + for i in accounts.filter('(uid=*)'): + UserAccount(topo.standalone, i.dn).delete() + + ldif_dir = topo.standalone.get_ldif_dir() + import_ldif = ldif_dir + '/basic_import.ldif' + os.remove(import_ldif) + request.addfinalizer(finofaci) + + +def _import_offline(topo, no_no): + """ + Will import ldifs offline + """ + _check_users_before_test(topo, no_no) + ldif_dir = topo.standalone.get_ldif_dir() + import_ldif = ldif_dir + '/basic_import.ldif' + # Generate ldif + _generate_ldif(topo, no_no) + # Offline import + topo.standalone.stop() + t1 = time.time() + if not topo.standalone.ldif2db('userRoot', None, None, None, import_ldif): + assert False + total_time = time.time() - t1 + topo.standalone.start() + _search_for_user(topo, no_no) + return total_time + + +def _import_online(topo, no_no): + """ + Will import ldifs online + """ + _check_users_before_test(topo, no_no) + ldif_dir = topo.standalone.get_ldif_dir() + import_ldif = ldif_dir + '/basic_import.ldif' + _generate_ldif(topo, no_no) + # Online + import_task = ImportTask(topo.standalone) + import_task.import_suffix_from_ldif(ldiffile=import_ldif, suffix=DEFAULT_SUFFIX) + + # Wait a bit till the task is created and available for searching + time.sleep(0.5) + + # Good as place as any to quick test the task has some expected attributes + if ds_is_newer('1.4.1.2'): + assert import_task.present('nstaskcreated') + assert import_task.present('nstasklog') + assert import_task.present('nstaskcurrentitem') + assert import_task.present('nstasktotalitems') + assert import_task.present('ttl') + import_task.wait() + topo.standalone.searchAccessLog('ADD dn="cn=import') + topo.standalone.searchErrorsLog('import userRoot: Import complete.') + _search_for_user(topo, no_no) + + +def test_import_with_index(topo, _import_clean): + """ + Add an index, then import via cn=tasks + + :id: 5bf75c47-a283-430e-a65c-3c5fd8dbadb8 + :setup: Standalone Instance + :steps: + 1. Creating the room number index + 2. Importing online + 3. Import is done -- verifying that it worked + :expected results: + 1. Operation successful + 2. Operation successful + 3. Operation successful + """ + place = topo.standalone.dbdir + assert f'{place}/userRoot/roomNumber.db' not in glob.glob(f'{place}/userRoot/*.db', recursive=True) + # Creating the room number index + indexes = Indexes(topo.standalone) + indexes.create(properties={ + 'cn': 'roomNumber', + 'nsSystemIndex': 'false', + 'nsIndexType': 'eq'}) + topo.standalone.restart() + # Importing online + _import_online(topo, 5) + # Import is done -- verifying that it worked + assert f'{place}/userRoot/roomNumber.db' in glob.glob(f'{place}/userRoot/*.db', recursive=True) + + +def test_crash_on_ldif2db(topo, _import_clean): + """ + Delete the cn=monitor entry for an LDBM backend instance. Doing this will + cause the DS to re-create that entry the next time it starts up. + + :id: aecad390-9352-11ea-8a31-8c16451d917b + :setup: Standalone Instance + :steps: + 1. Delete the cn=monitor entry for an LDBM backend instance + 2. Restart the server and verify that the LDBM monitor entry was re-created. + :expected results: + 1. Operation successful + 2. Operation successful + """ + # Delete the cn=monitor entry for an LDBM backend instance. Doing this will + # cause the DS to re-create that entry the next time it starts up. + monitor = Monitor(topo.standalone) + monitor.delete() + # Restart the server and verify that the LDBM monitor entry was re-created. + _import_offline(topo, 5) + + +if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s %s" % CURRENT_FILE) + diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/import/regression_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/import/regression_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/import/regression_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/import/regression_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,23 +1,27 @@ -# Copyright (C) 2017 Red Hat, Inc. +# Copyright (C) 2020 Red Hat, Inc. # All rights reserved. # # License: GPL (version 3 or any later version). # See LICENSE for details. # --- END COPYRIGHT BLOCK --- # +from decimal import * +import ldap +import logging +import os import pytest +import threading +import time from lib389.backend import Backends from lib389.properties import TASK_WAIT -from lib389.utils import time, ldap, os, logging from lib389.topologies import topology_st as topo -from lib389.dbgen import dbgen +from lib389.dbgen import dbgen_users from lib389._constants import DEFAULT_SUFFIX from lib389.tasks import * from lib389.idm.user import UserAccounts -import threading -import time - from lib389.idm.directorymanager import DirectoryManager +from lib389.dbgen import * +from lib389.utils import * pytestmark = pytest.mark.tier1 @@ -145,7 +149,7 @@ log.info('Create LDIF file and import it...') ldif_dir = topo.standalone.get_ldif_dir() ldif_file = os.path.join(ldif_dir, 'default.ldif') - dbgen(topo.standalone, 5, ldif_file, TEST_DEFAULT_SUFFIX) + dbgen_users(topo.standalone, 5, ldif_file, TEST_DEFAULT_SUFFIX) log.info('Stopping the server and running offline import...') topo.standalone.stop() @@ -185,7 +189,7 @@ ldif_dir = topo.standalone.get_ldif_dir() ldif_file = os.path.join(ldif_dir, 'suffix_del1.ldif') - dbgen(topo.standalone, 10, ldif_file, TEST_SUFFIX1) + dbgen_users(topo.standalone, 10, ldif_file, TEST_SUFFIX1) log.info('Stopping the server and running offline import') topo.standalone.stop() @@ -223,7 +227,7 @@ ldif_dir = topo.standalone.get_ldif_dir() ldif_file = os.path.join(ldif_dir, 'suffix_del2.ldif') - dbgen(topo.standalone, 10, ldif_file, TEST_SUFFIX2) + dbgen_users(topo.standalone, 10, ldif_file, TEST_SUFFIX2) topo.standalone.tasks.importLDIF(suffix=TEST_SUFFIX2, input_file=ldif_file, args={TASK_WAIT: True}) @@ -297,6 +301,111 @@ log.info('Error log should have "Duplicated DN detected" message') assert standalone.ds_error_log.match('.*Duplicated DN detected.*') +@pytest.mark.bz1749595 +@pytest.mark.tier2 +@pytest.mark.xfail(ds_is_older("1.3.10.1"), reason="bz1749595 not fixed on versions older than 1.3.10.1") +def test_large_ldif2db_ancestorid_index_creation(topo): + """Import with ldif2db a large file - check that the ancestorid index creation phase has a correct performance + + :id: fe7f78f6-6e60-425d-ad47-b39b67e29113 + :setup: Standalone instance + :steps: + 1. Delete the previous errors log to start from a fresh one + 2. Create test suffix and backend + 3. Create a large nested ldif file + 4. Stop the server + 5. Run an offline import + 6. Restart the server + 7. Check in the errors log that an independant ancestorid IDs sorting is done + 8. Get the log of the starting of the ancestorid indexing process + 9. Get the log of the end of the ancestorid indexing process + 10. Get the start and end time for ancestorid index creation from these logs + 11. Calculate the duration of the ancestorid indexing process + :expectedresults: + 1. Success + 2. Test suffix and backend successfully created + 3. ldif file successfully created + 4. Success + 5. Import is successfully performed + 6. Success + 7. Log of ancestorid sorting start and end are present + 8. Log of the beginning of gathering ancestorid is found + 9. Log of the final ancestorid index creation is found + 10. Start and end times are successfully extracted + 11. The duration of the ancestorid index creation process should be less than 10s + """ + + ldif_dir = topo.standalone.get_ldif_dir() + ldif_file = os.path.join(topo.standalone.ds_paths.ldif_dir, 'large_nested.ldif') + + # Have a reasonable balance between the need for a large ldif file to import and the time of test execution + # total number of users + num_users = 100000 + + # Choose a limited number of users per node to get as much as possible non-leaf entries + node_limit = 5 + + # top suffix + suffix = 'o=test' + + # backend + backend = 'test' + + log.info('Delete the previous errors logs') + topo.standalone.deleteErrorLogs() + + log.info('Add suffix:{} and backend: {}...'.format(suffix, backend)) + + backends = Backends(topo.standalone) + backends.create(properties={'nsslapd-suffix': suffix, + 'name': backend}) + + props = { + 'numUsers' : num_users, + 'nodeLimit' : node_limit, + 'suffix' : suffix + } + instance = topo.standalone + + log.info('Create a large nested ldif file using dbgen : %s' % ldif_file) + dbgen_nested_ldif(instance, ldif_file, props) + + log.info('Stop the server and run offline import...') + topo.standalone.stop() + assert topo.standalone.ldif2db(backend, None, None, + None, ldif_file) + + log.info('Starting the server') + topo.standalone.start() + + log.info('parse the errors logs to check lines with "Starting sort of ancestorid" are present') + start_sort_str = str(topo.standalone.ds_error_log.match(r'.*Starting sort of ancestorid non-leaf IDs*'))[1:-1] + assert len(start_sort_str) > 0 + + log.info('parse the errors logs to check lines with "Finished sort of ancestorid" are present') + end_sort_str = str(topo.standalone.ds_error_log.match(r'.*Finished sort of ancestorid non-leaf IDs*'))[1:-1] + assert len(end_sort_str) > 0 + + log.info('parse the error logs for the line with "Gathering ancestorid non-leaf IDs"') + start_ancestorid_indexing_op_str = str(topo.standalone.ds_error_log.match(r'.*Gathering ancestorid non-leaf IDs*'))[1:-1] + assert len(start_ancestorid_indexing_op_str) > 0 + + log.info('parse the error logs for the line with "Created ancestorid index"') + end_ancestorid_indexing_op_str = str(topo.standalone.ds_error_log.match(r'.*Created ancestorid index*'))[1:-1] + assert len(end_ancestorid_indexing_op_str) > 0 + + log.info('get the ancestorid non-leaf IDs indexing start and end time from the collected strings') + # Collected lines look like : '[15/May/2020:05:30:27.245967313 -0400] - INFO - bdb_get_nonleaf_ids - import userRoot: Gathering ancestorid non-leaf IDs...' + # We are getting the sec.nanosec part of the date, '27.245967313' in the above example + start_time = (start_ancestorid_indexing_op_str.split()[0]).split(':')[3] + end_time = (end_ancestorid_indexing_op_str.split()[0]).split(':')[3] + + log.info('Calculate the elapsed time for the ancestorid non-leaf IDs index creation') + etime = (Decimal(end_time) - Decimal(start_time)) + # The time for the ancestorid index creation should be less than 10s for an offline import of an ldif file with 100000 entries / 5 entries per node + # Should be adjusted if these numbers are modified in the test + assert etime <= 10 + if __name__ == '__main__': # Run isolated diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/mapping_tree/referral_during_tot_init_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/mapping_tree/referral_during_tot_init_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/mapping_tree/referral_during_tot_init_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/mapping_tree/referral_during_tot_init_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,5 +1,5 @@ # --- BEGIN COPYRIGHT BLOCK --- -# Copyright (C) 2017 Red Hat, Inc. +# Copyright (C) 2020 Red Hat, Inc. # All rights reserved. # # License: GPL (version 3 or any later version). @@ -9,12 +9,10 @@ import ldap import pytest from lib389.topologies import topology_m2 -from lib389._constants import (DEFAULT_SUFFIX, HOST_MASTER_2, PORT_MASTER_2, TASK_WAIT) +from lib389._constants import (DEFAULT_SUFFIX) from lib389.agreement import Agreements - from lib389.idm.user import (TEST_USER_PROPERTIES, UserAccounts) - -from lib389.dbgen import dbgen +from lib389.dbgen import dbgen_users from lib389.utils import ds_is_older pytestmark = pytest.mark.tier1 @@ -26,17 +24,15 @@ master2 = topology_m2.ms["master2"] users = UserAccounts(master2, DEFAULT_SUFFIX) - u = users.create(properties=TEST_USER_PROPERTIES) u.set('userPassword', 'password') - binddn = u.dn bindpw = 'password' # Create a bunch of entries on master1 ldif_dir = master1.get_ldif_dir() import_ldif = ldif_dir + '/ref_during_tot_import.ldif' - dbgen(master1, 10000, import_ldif, DEFAULT_SUFFIX) + dbgen_users(master1, 10000, import_ldif, DEFAULT_SUFFIX) master1.stop() master1.ldif2db(bename=None, excludeSuffixes=None, encrypt=False, suffixes=[DEFAULT_SUFFIX], import_file=import_ldif) @@ -61,9 +57,7 @@ except ldap.REFERRAL: referred = True break - # Means we never go a referral, should not happen! + # Means we never go a referral, should not happen! assert referred # Done. - - diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/password_policy_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/password_policy_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/password_policy_test.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/password_policy_test.py 2020-05-29 20:43:44.000000000 +0000 @@ -0,0 +1,619 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2020 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- + +""" +This test script will test password policy. +""" + +import os +import pytest +from lib389.topologies import topology_st as topo +from lib389.idm.organizationalunit import OrganizationalUnits +from lib389.idm.user import UserAccounts, UserAccount +from lib389._constants import DEFAULT_SUFFIX +from lib389.pwpolicy import PwPolicyManager +import ldap + + +pytestmark = pytest.mark.tier1 + + +def create_user(topo, uid, cn, sn, givenname, userpasseord, gid, ou): + """ + Will create user + """ + user = UserAccounts(topo.standalone, DEFAULT_SUFFIX, rdn=ou).create(properties={ + 'uid': uid, + 'cn': cn, + 'sn': sn, + 'givenname': givenname, + 'mail': f'{uid}@example.com', + 'userpassword': userpasseord, + 'homeDirectory': f'/home/{uid}', + 'uidNumber': gid, + 'gidNumber': gid + }) + return user + + +@pytest.fixture(scope="module") +def _policy_setup(topo): + """ + Will do pretest setup. + """ + for suffix, ou in [(DEFAULT_SUFFIX, 'dirsec'), (f'ou=people,{DEFAULT_SUFFIX}', 'others')]: + OrganizationalUnits(topo.standalone, suffix).create(properties={ + 'ou': ou + }) + for uid, cn, sn, givenname, userpasseord, gid, ou in [ + ('dbyers', 'Danny Byers', 'Byers', 'Danny', 'dby3rs1', '10001', 'ou=dirsec'), + ('orla', 'Orla Hegarty', 'Hegarty', 'Orla', '000rla1', '10002', 'ou=dirsec'), + ('joe', 'Joe Rath', 'Rath', 'Joe', '00j0e1', '10003', 'ou=people'), + ('jack', 'Jack Rath', 'Rath', 'Jack', '00j6ck1', '10004', 'ou=people'), + ('fred', 'Fred Byers', 'Byers', 'Fred', '00fr3d1', '10005', None), + ('deep', 'Deep Blue', 'Blue', 'Deep', '00de3p1', '10006', 'ou=others, ou=people'), + ('accntlusr', 'AccountControl User', 'ControlUser', 'Account', 'AcControl123', '10007', 'ou=dirsec'), + ('nocntlusr', 'NoAccountControl User', 'ControlUser', 'NoAccount', 'NoControl123', '10008', 'ou=dirsec') + ]: + create_user(topo, uid, cn, sn, givenname, userpasseord, gid, ou) + policy_props = {'passwordexp': 'off', + 'passwordchange': 'off', + 'passwordmustchange': 'off', + 'passwordchecksyntax': 'off', + 'passwordinhistory': '6', + 'passwordhistory': 'off', + 'passwordlockout': 'off', + 'passwordlockoutduration': '3600', + 'passwordmaxage': '8640000', + 'passwordmaxfailure': '3', + 'passwordminage': '0', + 'passwordminlength': '6', + 'passwordresetfailurecount': '600', + 'passwordunlock': 'on', + 'passwordStorageScheme': 'CLEAR', + 'passwordwarning': '86400' + } + pwp = PwPolicyManager(topo.standalone) + for dn_dn in (f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}', + f'uid=joe,ou=People,{DEFAULT_SUFFIX}'): + pwp.create_user_policy(dn_dn, policy_props) + pwp.create_subtree_policy(f'ou=People,{DEFAULT_SUFFIX}', policy_props) + + +def change_password(topo, user_password_new_pass_list): + """ + Will change password with self binding. + """ + for user, password, new_pass in user_password_new_pass_list: + real_user = UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}') + conn = real_user.bind(password) + UserAccount(conn, real_user.dn).replace('userpassword', new_pass) + + +def change_password_ultra_new(topo, user_password_new_pass_list): + """ + Will change password with self binding. + """ + for user, password, new_pass, ultra_new_pass in user_password_new_pass_list: + real_user = UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}') + conn = real_user.bind(password) + UserAccount(conn, real_user.dn).replace('userpassword', new_pass) + conn = real_user.bind(new_pass) + UserAccount(conn, real_user.dn).replace('userpassword', ultra_new_pass) + + +def change_password_with_admin(topo, user_password_new_pass_list): + """ + Will change password by root. + """ + for user, password in user_password_new_pass_list: + UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}').replace('userpassword', password) + + +@pytest.fixture(scope="function") +def _fixture_for_password_change(request, topo): + pwp = PwPolicyManager(topo.standalone) + orl = pwp.get_pwpolicy_entry(f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + for attribute in ('passwordMustChange', 'passwordmustchange'): + orl.replace(attribute, 'off') + assert orl.get_attr_val_utf8(attribute) == 'off' + + def final_task(): + people = pwp.get_pwpolicy_entry(f'ou=people,{DEFAULT_SUFFIX}') + people.replace('passwordchange', 'on') + assert people.get_attr_val_utf8('passwordchange') == 'on' + # Administrator Reseting to original password + change_password_with_admin(topo, [ + ('uid=joe,ou=people', '00j0e1'), + ('uid=fred', '00fr3d1'), + ('uid=jack,ou=people', '00j6ck1'), + ('uid=deep,ou=others,ou=people', '00de3p1'), + ('uid=orla,ou=dirsec', '000rla1'), + ('uid=dbyers,ou=dirsec', 'Anuj') + ]) + request.addfinalizer(final_task) + + +def test_password_change_section(topo, _policy_setup, _fixture_for_password_change): + """ Password Change Section. + + :id: 5d018c08-9388-11ea-8394-8c16451d917b + :setup: Standalone + :steps: + 1. Confirm that user is not been affected by fine grained password + (As its is not belong to any password policy) + 2. Should be able to change password(As its is not belong to any password policy) + 3. Try to change password for user even though pw policy is set to no. + Should get error message: unwilling to Perform ! + 4. Set Password change to May Change Password. + 5. Administrator Reseting to original password ! + 6. Attempt to Modify password to orla2 with an invalid first pw with error message. + 7. Changing current password from orla1 to orla2 + 8. Changing current password from orla2 to orla1. + 9. Set Password change to Must Not Change After Reset + 10 Change password for joe,jack,deep even though pw policy is set to no with error message. + 11. Fred can change.(Fred is not belong to any pw policy) + 12. Changing pw policy to may change pw + 13. Set Password change to May Change Password + 14. Administrator Reseting to original password + 15. Try to change password with invalid credentials. Should see error message. + 16. Changing current password for joe and fed. + 17. Changing current password for jack and deep with error message.(passwordchange not on) + 18. Changing pw policy to may change pw + 19. Set Password change to May Change Password + 20. Administrator Reseting to original password + 21. Try to change password with invalid credentials. Should see error message. + 22. Changing current password + 23. Set Password change to Must Not Change After Reset + 24. Searching for passwordchange: Off + 25. Administrator Reseting to original password + 26. Try to change password with invalid credentials. Should see error message + 27. Changing current password (('passwordchange', 'off') for joe) + :expected results: + 1. Success(As its is not belong to any password policy) + 2. Success + 3. Fail(pw policy is set to no) + 4. Success + 5. Success + 6. Fail(invalid first pw) + 7. Success + 8. Success + 9. Success + 10. Fail(pw policy is set to no) + 11. Success((Fred is not belong to any pw policy)) + 12. Success + 13. Success + 14. Success + 15. Fail(invalid credentials) + 16. Success((passwordchange on)) + 17. Fail(passwordchange not on) + 18. Success + 19. Success + 20. Success + 21. Fail(invalid credentials) + 22. Success + 23. Success + 24. Success + 25. Success + 26. Fail(invalid credentials) + 27. Success + """ + # Confirm that uid=dbyers is not been affected by fine grained password + dbyers = UserAccount(topo.standalone, f'uid=dbyers,ou=dirsec,{DEFAULT_SUFFIX}') + conn = dbyers.bind('dby3rs1') + dbyers_conn = UserAccount(conn, f'uid=dbyers,ou=dirsec,{DEFAULT_SUFFIX}') + # Should be able to change password(As its is not belong to any password policy) + dbyers_conn.replace('userpassword', "Anuj") + # Try to change password for uid=orla even though pw policy is set to no. + # Should get error message: unwilling to Perform ! + orla = UserAccount(topo.standalone, f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + conn = orla.bind('000rla1') + orla_conn = UserAccount(conn, f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + # pw policy is set to no + with pytest.raises(ldap.UNWILLING_TO_PERFORM): + orla_conn.replace('userpassword', "000rla2") + pwp = PwPolicyManager(topo.standalone) + orl = pwp.get_pwpolicy_entry(f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + # Set Password change to May Change Password. + orl.replace('passwordchange', 'on') + assert orl.get_attr_val_utf8('passwordchange') == 'on' + # Administrator Reseting to original password ! + orla.replace('userpassword', '000rla1') + # Attempt to Modify password to orla2 with an invalid first pw with error message. + with pytest.raises(ldap.INVALID_CREDENTIALS): + conn = orla.bind('Invalid_password') + # Changing current password from orla1 to orla2 + orla_conn.replace('userpassword', '000rla2') + # Changing current password from orla2 to orla1. + orla_conn = UserAccount(conn, f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + orla_conn.replace('userpassword', '000rla1') + # Set Password change to Must Not Change After Reset + joe = pwp.get_pwpolicy_entry(f'uid=joe,ou=people,{DEFAULT_SUFFIX}') + people = pwp.get_pwpolicy_entry(f'ou=people,{DEFAULT_SUFFIX}') + joe.replace_many(('passwordmustchange', 'off'), ('passwordchange', 'off')) + people.replace_many(('passwordmustchange', 'off'), ('passwordchange', 'off')) + for attr in ['passwordMustChange', 'passwordchange']: + assert joe.get_attr_val_utf8(attr) == 'off' + for attr in ['passwordMustChange', 'passwordchange']: + assert people.get_attr_val_utf8(attr) == 'off' + # Change password for uid,joe,jack,deep even though pw policy is set to no with error message. + for user, password, pass_to_change in [ + ('joe', '00j0e1', '00j0e2'), + ('jack', '00j6ck1', '00j6ck2'), + ('deep,ou=others', '00de3p1', '00de3p2') + ]: + real_user = UserAccount(topo.standalone, f'uid={user},ou=people,{DEFAULT_SUFFIX}') + conn = real_user.bind(password) + real_conn = UserAccount(conn, real_user.dn) + # pw policy is set to no + with pytest.raises(ldap.UNWILLING_TO_PERFORM): + real_conn.replace('userpassword', pass_to_change) + real_user = UserAccount(topo.standalone, f'uid=fred,{DEFAULT_SUFFIX}') + conn = real_user.bind('00fr3d1') + # Fred can change.(Fred is not belong to any pw policy) + real_conn = UserAccount(conn, real_user.dn) + real_conn.replace('userpassword', '00fr3d2') + # Changing pw policy to may change pw + # Set Password change to May Change Password + joe = pwp.get_pwpolicy_entry(f'uid=joe,ou=people,{DEFAULT_SUFFIX}') + joe.replace('passwordchange', 'on') + assert joe.get_attr_val_utf8('passwordchange') == 'on' + # Administrator Reseting to original password + change_password_with_admin(topo, [ + ('uid=joe,ou=people', '00j0e1'), + ('uid=jack,ou=people', '00j6ck1'), + ('uid=fred', '00fr3d1'), + ('uid=deep,ou=others,ou=people', '00de3p1') + ]) + # Try to change password with invalid credentials. Should see error message. + for user in [ + 'uid=joe,ou=people', + 'uid=jack,ou=people', + 'uid=fred', + 'uid=deep,ou=others,ou=people' + ]: + with pytest.raises(ldap.INVALID_CREDENTIALS): + UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}').bind("bad") + # Changing current password for joe and fed. + for user, password, new_pass in [ + ('uid=joe,ou=people', '00j0e1', '00j0e2'), + ('uid=fred', '00fr3d1', '00fr3d2') + ]: + real_user = UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}') + conn = real_user.bind(password) + UserAccount(conn, real_user.dn).replace('userpassword', new_pass) + # Changing current password for jack and deep with error message.(passwordchange not on) + for user, password, new_pass in [ + ('uid=jack,ou=people', '00j6ck1', '00j6ck2'), + ('uid=deep,ou=others,ou=people', '00de3p1', '00de3p2') + ]: + real_user = UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}') + conn = real_user.bind(password) + with pytest.raises(ldap.UNWILLING_TO_PERFORM): + UserAccount(conn, real_user.dn).replace('userpassword', new_pass) + # Changing pw policy to may change pw + # Set Password change to May Change Password + people.replace('passwordchange', 'on') + assert people.get_attr_val_utf8('passwordchange') == 'on' + # Administrator Reseting to original password + change_password_with_admin(topo, [ + ('uid=joe,ou=people', '00j0e1'), + ('uid=jack,ou=people', '00j6ck1'), + ('uid=fred', '00fr3d1'), + ('uid=deep,ou=others,ou=people', '00de3p1') + ]) + # Try to change password with invalid credentials. Should see error message. + for user in [ + 'uid=joe,ou=people', + 'uid=jack,ou=people', + 'uid=fred', + 'uid=deep,ou=others,ou=people' + ]: + with pytest.raises(ldap.INVALID_CREDENTIALS): + UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}').bind("bad") + # Changing current password + change_password(topo, [ + ('uid=joe,ou=people', '00j0e1', '00j0e2'), + ('uid=fred', '00fr3d1', '00fr3d2'), + ('uid=jack,ou=people', '00j6ck1', '00j6ck2'), + ('uid=deep,ou=others,ou=people', '00de3p1', '00de3p2') + ]) + # Set Password change to Must Not Change After Reset + joe.replace('passwordchange', 'off') + assert joe.get_attr_val_utf8('passwordchange') == 'off' + # Administrator Reseting to original password + change_password_with_admin(topo, [ + ('uid=joe,ou=people', '00j0e1'), + ('uid=fred', '00fr3d1'), + ('uid=jack,ou=people', '00j6ck1'), + ('uid=deep,ou=others,ou=people', '00de3p1') + ]) + # Try to change password with invalid credentials. Should see error message + for user in [ + 'uid=joe,ou=people', + 'uid=jack,ou=people', + 'uid=fred', + 'uid=deep,ou=others,ou=people' + ]: + with pytest.raises(ldap.INVALID_CREDENTIALS): + UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}').bind("bad") + # Changing current password + change_password(topo, [ + ('uid=fred', '00fr3d1', '00fr3d2'), + ('uid=jack,ou=people', '00j6ck1', '00j6ck2'), + ('uid=deep,ou=others,ou=people', '00de3p1', '00de3p2') + ]) + # ('passwordchange', 'off') for joe + real_user = UserAccount(topo.standalone, f'uid=joe,ou=people,{DEFAULT_SUFFIX}') + conn = real_user.bind('00j0e1') + with pytest.raises(ldap.UNWILLING_TO_PERFORM): + UserAccount(conn, real_user.dn).replace('userpassword', '00j0e2') + + +@pytest.fixture(scope="function") +def _fixture_for_syntax_section(request, topo): + change_password_with_admin(topo, [ + ('uid=joe,ou=people', '00j0e1'), + ('uid=fred', '00fr3d1'), + ('uid=jack,ou=people', '00j6ck1'), + ('uid=deep,ou=others,ou=people', '00de3p1'), + ('uid=orla,ou=dirsec', '000rla1'), + ('uid=dbyers,ou=dirsec', 'Anuj') + ]) + pwp = PwPolicyManager(topo.standalone) + orl = pwp.get_pwpolicy_entry(f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + joe = pwp.get_pwpolicy_entry(f'uid=joe,ou=people,{DEFAULT_SUFFIX}') + people = pwp.get_pwpolicy_entry(f'ou=people,{DEFAULT_SUFFIX}') + for instance in [orl, joe, people]: + instance.replace('passwordchecksyntax', 'on') + instance.replace('passwordChange', 'on') + assert instance.get_attr_val_utf8('passwordchecksyntax') == 'on' + + def final_step(): + for instance1 in [orl, joe, people]: + instance1.replace('passwordminlength', '6') + change_password_with_admin(topo, [ + ('uid=orla,ou=dirsec', '000rLb1'), + ('uid=joe,ou=people', '00J0e1'), + ('uid=jack,ou=people', '00J6ck1'), + ('uid=deep,ou=others,ou=people', '00De3p1'), + ('uid=dbyers,ou=dirsec', 'dby3rs1'), + ('uid=fred', '00fr3d1') + ]) + + request.addfinalizer(final_step) + + +def test_password_syntax_section(topo, _policy_setup, _fixture_for_syntax_section): + """ Password Syntax Section. + + :id: 7bf1cb46-9388-11ea-9019-8c16451d917b + :setup: Standalone + :steps: + 1. Try to change password with invalid credentials. Should get error (invalid cred). + 2. Try to change to a password that violates length. Should get error (constaint viol.). + 3. Attempt to Modify password to db which is in error to policy + 4. Changing password minimum length to 5 to check triviality + 5. Try to change password to the value of uid, which is trivial. Should get error. + 6. Try to change password to givenname which is trivial. Should get error + 7. Try to change password to sn which is trivial. Should get error + 8. Changing password minimum length back to 6 + 9. Changing current password from *1 to *2 + 10. Changing current password from *2 to *1 + 11. Changing current password to the evil password + 12. Resetting to original password as cn=directory manager + 13. Setting policy to NOT Check Password Syntax + 14. Test that when checking syntax is off, you can use small passwords + 15. Test that when checking syntax is off, trivial passwords can be used + 16. Resetting to original password as cn=directory manager + 17. Changing password minimum length from 6 to 10 + 18. Setting policy to Check Password Syntax again + 19. Try to change to a password that violates length + 20. Change to a password that meets length requirement + :expected results: + 1. Fail(invalid cred) + 2. Fail(constaint viol.) + 3. Fail(Syntax error) + 4. Success + 5. Fail(trivial) + 6. Fail(password to givenname ) + 7. Success + 8. Success + 9. Success + 10. Success + 11. Fail(evil password) + 12. Success + 13. Success + 14. Success + 15. Success + 16. Success + 17. Success + 18. Success + 19. Fail(violates length) + 20. Success + """ + # Try to change password with invalid credentials. Should get error (invalid cred). + for user in [ + 'uid=joe,ou=people', + 'uid=jack,ou=people', + 'uid=fred', + 'uid=deep,ou=others,ou=people', + 'uid=dbyers,ou=dirsec', + 'uid=orla,ou=dirsec' + ]: + with pytest.raises(ldap.INVALID_CREDENTIALS): + UserAccount(topo.standalone, f'{user},{DEFAULT_SUFFIX}').bind("bad") + # Try to change to a password that violates length. Should get error (constaint viol.). + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rla1', 'db'), + ('uid=joe,ou=people', '00j0e1', 'db'), + ('uid=jack,ou=people', '00j6ck1', 'db'), + ('uid=deep,ou=others,ou=people', '00de3p1', 'db') + ]) + # Attempt to Modify password to db which is in error to policy(Syntax error) + change_password_ultra_new(topo, [ + ('uid=dbyers,ou=dirsec', 'Anuj', 'db', 'dby3rs1'), + ('uid=fred', '00fr3d1', 'db', '00fr3d1') + ]) + # Changing password minimum length to 5 to check triviality + pwp = PwPolicyManager(topo.standalone) + orl = pwp.get_pwpolicy_entry(f'uid=orla,ou=dirsec,{DEFAULT_SUFFIX}') + joe = pwp.get_pwpolicy_entry(f'uid=joe,ou=people,{DEFAULT_SUFFIX}') + people = pwp.get_pwpolicy_entry(f'ou=people,{DEFAULT_SUFFIX}') + for instance in [orl, joe, people]: + instance.replace('passwordminlength', '5') + # Try to change password to the value of uid, which is trivial. Should get error. + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rla1', 'orla'), + ('uid=joe,ou=people', '00j0e1', 'joe'), + ('uid=jack,ou=people', '00j6ck1', 'jack'), + ('uid=deep,ou=others,ou=people', '00de3p1', 'deep') + ]) + # dbyers and fred can change + change_password_ultra_new(topo, [ + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'dbyers', 'dby3rs1'), + ('uid=fred', '00fr3d1', 'fred', '00fr3d1') + ]) + # Try to change password to givenname which is trivial. Should get error + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rla1', 'orla'), + ('uid=joe,ou=people', '00j0e1', 'joe'), + ('uid=jack,ou=people', '00j6ck1', 'jack'), + ('uid=deep,ou=others,ou=people', '00de3p1', 'deep') + ]) + # dbyers and fred can change + change_password_ultra_new(topo, [ + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'danny', 'dby3rs1'), + ('uid=fred', '00fr3d1', 'fred', '00fr3d1') + ]) + # Try to change password to sn which is trivial. Should get error + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rla1', 'Hegarty'), + ('uid=joe,ou=people', '00j0e1', 'Rath'), + ('uid=jack,ou=people', '00j6ck1', 'Rath'), + ('uid=deep,ou=others,ou=people', '00de3p1', 'Blue') + ]) + # dbyers and fred can change + change_password_ultra_new(topo, [ + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'Byers', 'dby3rs1'), + ('uid=fred', '00fr3d1', 'Byers', '00fr3d1') + ]) + # Changing password minimum length back to 6 + for instance1 in [orl, joe, people]: + instance1.replace('passwordminlength', '6') + # Changing current password from *1 to *2 + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rla1', '000rLb2'), + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'dby3rs2'), + ('uid=fred', '00fr3d1', '00fr3d2'), + ('uid=joe,ou=people', '00j0e1', '00J0e2'), + ('uid=jack,ou=people', '00j6ck1', '00J6ck2'), + ('uid=deep,ou=others,ou=people', '00de3p1', '00De3p2') + ]) + # Changing current password from *2 to *1 + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rLb2', '000rLb1'), + ('uid=dbyers,ou=dirsec', 'dby3rs2', 'dby3rs1'), + ('uid=fred', '00fr3d2', '00fr3d1'), + ('uid=joe,ou=people', '00J0e2', '00J0e1'), + ('uid=jack,ou=people', '00J6ck2', '00J6ck1'), + ('uid=deep,ou=others,ou=people', '00De3p2', '00De3p1') + ]) + # Changing current password to the evil password + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rLb1', r'{\;\\].'), + ('uid=joe,ou=people', '00J0e1', r'{\;\\].'), + ('uid=jack,ou=people', '00J6ck1', r'{\;\\].'), + ('uid=deep,ou=others,ou=people', '00De3p1', r'{\;\\].') + ]) + # dbyers and fred can change + change_password(topo, [ + ('uid=dbyers,ou=dirsec', 'dby3rs1', r'{\;\\].'), + ('uid=fred', '00fr3d1', r'{\;\\].') + ]) + # Resetting to original password as cn=directory manager + change_password_with_admin(topo, [ + ('uid=orla,ou=dirsec', '000rLb1'), + ('uid=joe,ou=people', '00J0e1'), + ('uid=jack,ou=people', '00J6ck1'), + ('uid=deep,ou=others,ou=people', '00De3p1'), + ('uid=dbyers,ou=dirsec', 'dby3rs1'), + ('uid=fred', '00fr3d1') + ]) + # Setting policy to NOT Check Password Syntax + # Searching for passwordminlength + for instance in [orl, joe, people]: + instance.replace('passwordchecksyntax', 'off') + for instance in [orl, joe, people]: + assert instance.get_attr_val_utf8('passwordchecksyntax') == 'off' + assert instance.get_attr_val_utf8('passwordminlength') == '6' + # Test that when checking syntax is off, you can use small passwords + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rLb1', 'db'), + ('uid=joe,ou=people', '00J0e1', 'db'), + ('uid=jack,ou=people', '00J6ck1', 'db'), + ('uid=deep,ou=others,ou=people', '00De3p1', 'db'), + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'db'), + ('uid=fred', '00fr3d1', 'db') + ]) + # Test that when checking syntax is off, trivial passwords can be used + change_password(topo, [ + ('uid=orla,ou=dirsec', 'db', 'orla'), + ('uid=joe,ou=people', 'db', 'joe'), + ('uid=jack,ou=people', 'db', 'jack'), + ('uid=deep,ou=others,ou=people', 'db', 'deep'), + ('uid=dbyers,ou=dirsec', 'db', 'dbyers'), + ('uid=fred', 'db', 'fred') + ]) + # Resetting to original password as cn=directory manager + change_password_with_admin(topo, [ + ('uid=orla,ou=dirsec', '000rLb1'), + ('uid=joe,ou=people', '00J0e1'), + ('uid=jack,ou=people', '00J6ck1'), + ('uid=deep,ou=others,ou=people', '00De3p1'), + ('uid=dbyers,ou=dirsec', 'dby3rs1'), + ('uid=fred', '00fr3d1') + ]) + # Changing password minimum length from 6 to 10 + # Setting policy to Check Password Syntax again + for instance in [orl, joe, people]: + instance.replace_many( + ('passwordchecksyntax', 'on'), + ('passwordminlength', '10')) + # Try to change to a password that violates length + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rLb1', 'db'), + ('uid=joe,ou=people', '00J0e1', 'db'), + ('uid=jack,ou=people', '00J6ck1', 'db'), + ('uid=deep,ou=others,ou=people', '00De3p1', 'db') + ]) + # dbyers and fred can change as it does not belong to any pw policy + change_password(topo, [ + ('uid=dbyers,ou=dirsec', 'dby3rs1', 'db'), + ('uid=fred', '00fr3d1', 'db') + ]) + # Change to a password that meets length requirement + change_password(topo, [ + ('uid=orla,ou=dirsec', '000rLb1', 'This_IS_a_very_very_long_password'), + ('uid=joe,ou=people', '00J0e1', 'This_IS_a_very_very_long_password'), + ('uid=jack,ou=people', '00J6ck1', 'This_IS_a_very_very_long_password'), + ('uid=deep,ou=others,ou=people', '00De3p1', 'This_IS_a_very_very_long_password'), + ('uid=dbyers,ou=dirsec', 'db', 'This_IS_a_very_very_long_password'), + ('uid=fred', 'db', 'This_IS_a_very_very_long_password') + ]) + + +if __name__ == "__main__": + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s -v %s" % CURRENT_FILE) \ No newline at end of file diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwdPolicy_attribute_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwdPolicy_attribute_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwdPolicy_attribute_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwdPolicy_attribute_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -99,6 +99,7 @@ # Reset user's password our_user = UserAccount(topology_st.standalone, TEST_USER_DN) our_user.replace('userpassword', PASSWORD) + time.sleep(.5) # Check that pwdReset is TRUE assert our_user.get_attr_val_utf8('pwdReset') == 'TRUE' @@ -106,6 +107,7 @@ # Bind as user and change its own password our_user.rebind(PASSWORD) our_user.replace('userpassword', PASSWORD) + time.sleep(.5) # Check that pwdReset is FALSE topology_st.standalone.simple_bind_s(DN_DM, PASSWORD) @@ -114,6 +116,9 @@ # Reset password policy config topology_st.standalone.config.replace('passwordMustChange', 'off') + # Reset user's password + our_user.replace('userpassword', TEST_USER_PWD) + @pytest.mark.parametrize('subtree_pwchange,user_pwchange,exception', [('on', 'off', ldap.UNWILLING_TO_PERFORM), @@ -171,7 +176,7 @@ user.reset_password('new_pass') except ldap.LDAPError as e: log.error('Failed to change userpassword for {}: error {}'.format( - TEST_USER_DN, e.message['info'])) + TEST_USER_DN, e.args[0]['info'])) raise e finally: log.info('Bind as DM') @@ -245,7 +250,7 @@ user.reset_password(TEST_USER_PWD) except ldap.LDAPError as e: log.error('Failed to change userpassword for {}: error {}'.format( - TEST_USER_DN, e.message['info'])) + TEST_USER_DN, e.args[0]['info'])) raise e finally: log.info('Bind as DM') diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwdPolicy_warning_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwdPolicy_warning_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwdPolicy_warning_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwdPolicy_warning_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -581,12 +581,15 @@ ('passwordExp', 'on')) user = UserAccounts(topology_st.standalone, DEFAULT_SUFFIX, rdn=None).create_test_user() user.set('userPassword', 'anuj') + time.sleep(0.5) expire_time = user.get_attr_val_utf8('passwordExpirationTime') config.replace('passwordMaxAge', '172800') user.set('userPassword', 'borah') + time.sleep(0.5) expire_time2 = user.get_attr_val_utf8('passwordExpirationTime') config.replace('passwordMaxAge', '604800') user.set('userPassword', 'anujagaiin') + time.sleep(0.5) expire_time3 = user.get_attr_val_utf8('passwordExpirationTime') assert expire_time != expire_time2 != expire_time3 config.replace('passwordExp', 'off') diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwp_history_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwp_history_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwp_history_test.py 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwp_history_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -22,43 +22,122 @@ logging.getLogger(__name__).setLevel(logging.DEBUG) log = logging.getLogger(__name__) +USER_PWD = 'password' -def test_basic(topology_st): + +@pytest.fixture(scope="function") +def user(topology_st, request): + """Add and remove a test user""" + + dm = DirectoryManager(topology_st.standalone) + + # Add aci so users can change their own password + USER_ACI = '(targetattr="userpassword || passwordHistory")(version 3.0; acl "pwp test"; allow (all) userdn="ldap:///self";)' + ous = OrganizationalUnits(topology_st.standalone, DEFAULT_SUFFIX) + ou = ous.get('people') + ou.add('aci', USER_ACI) + + # Create a user + users = UserAccounts(topology_st.standalone, DEFAULT_SUFFIX) + user = users.create_test_user() + user.set('userpassword', USER_PWD) + def fin(): + dm.rebind() + user.delete() + ou.remove('aci', USER_ACI) + request.addfinalizer(fin) + return user + + +def test_history_is_not_overwritten(topology_st, user): + """Test that passwordHistory user attribute is not overwritten + + :id: 1b311532-dd55-4072-88a9-1f960cb371bd + :setup: Standalone instance, a test user + :steps: + 1. Configure password history policy as bellow: + passwordHistory: on + passwordInHistory: 3 + 2. Change the password 3 times + 3. Try to change the password 2 more times to see + if it rewrites passwordHistory even on a failure attempt + 4. Try to change the password to the initial value (it should be + still in history) + :expectedresults: + 1. Password history policy should be configured successfully + 2. Success + 3. Password changes should be correctly rejected + with Constrant Violation error + 4. Password change should be correctly rejected + with Constrant Violation error + """ + + topology_st.standalone.config.replace_many(('passwordHistory', 'on'), + ('passwordInHistory', '3')) + log.info('Configured password policy.') + time.sleep(1) + + # Bind as the test user + user.rebind(USER_PWD) + time.sleep(.5) + + # Change the password 3 times + user.set('userpassword', 'password1') + user.rebind('password1') + time.sleep(.5) + user.set('userpassword', 'password2') + user.rebind('password2') + time.sleep(.5) + user.set('userpassword', 'password3') + user.rebind('password3') + time.sleep(.5) + + # Try to change the password 2 more times to see + # if it rewrites passwordHistory even on a failure attempt + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + user.set('userpassword', 'password2') + time.sleep(.5) + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + user.set('userpassword', 'password1') + time.sleep(.5) + + # Try to change the password to the initial value (it should be still in history) + with pytest.raises(ldap.CONSTRAINT_VIOLATION): + user.set('userpassword', USER_PWD) + + +def test_basic(topology_st, user): """Test basic password policy history feature functionality :id: 83d74f7d-3036-4944-8839-1b40bbf265ff - :setup: Standalone instance + :setup: Standalone instance, a test user :steps: 1. Configure password history policy as bellow: passwordHistory: on passwordInHistory: 3 passwordChange: on passwordStorageScheme: CLEAR - 2. Add a test user - 3. Attempt to change password to the same password - 4. Change password four times - 5. Check that we only have 3 passwords stored in history - 6. Attempt to change the password to previous passwords - 7. Reset password by Directory Manager (admin reset) - 8. Try and change the password to the previous password before the reset - 9. Test passwordInHistory set to "0" rejects only the current password - 10. Test passwordInHistory set to "2" rejects previous passwords - - + 2. Attempt to change password to the same password + 3. Change password four times + 4. Check that we only have 3 passwords stored in history + 5. Attempt to change the password to previous passwords + 6. Reset password by Directory Manager (admin reset) + 7. Try and change the password to the previous password before the reset + 8. Test passwordInHistory set to "0" rejects only the current password + 9. Test passwordInHistory set to "2" rejects previous passwords :expectedresults: 1. Password history policy should be configured successfully - 2. User should be added successfully - 3. Password change should be correctly rejected + 2. Password change should be correctly rejected with Constrant Violation error - 4. Password should be successfully changed - 5. Only 3 passwords should be stored in history - 6. Password changes should be correctly rejected + 3. Password should be successfully changed + 4. Only 3 passwords should be stored in history + 5. Password changes should be correctly rejected with Constrant Violation error - 7. Password should be successfully reset - 8. Password change should be correctly rejected + 6. Password should be successfully reset + 7. Password change should be correctly rejected with Constrant Violation error + 8. Success 9. Success - 10. Success """ # @@ -76,17 +155,8 @@ assert False time.sleep(1) - # Add aci so users can change their own password - USER_ACI = '(targetattr="userpassword || passwordHistory")(version 3.0; acl "pwp test"; allow (all) userdn="ldap:///self";)' - ous = OrganizationalUnits(topology_st.standalone, DEFAULT_SUFFIX) - ou = ous.get('people') - ou.add('aci', USER_ACI) - - # Create user - users = UserAccounts(topology_st.standalone, DEFAULT_SUFFIX) - user = users.create(properties=TEST_USER_PROPERTIES) - user.set('userpassword', 'password') - user.rebind('password') + # Bind as the test user + user.rebind(USER_PWD) # # Test that password history is enforced. diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwp_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwp_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/password/pwp_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/password/pwp_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -15,11 +15,16 @@ from lib389._constants import DEFAULT_SUFFIX from lib389.config import Config from lib389.idm.group import Group +from lib389.utils import ds_is_older import ldap import time pytestmark = pytest.mark.tier1 +if ds_is_older('1.4'): + DEFAULT_PASSWORD_STORAGE_SCHEME = 'SSHA512' +else: + DEFAULT_PASSWORD_STORAGE_SCHEME = 'PBKDF2_SHA256' def _create_user(topo, uid, cn, uidNumber, userpassword): """ @@ -400,7 +405,7 @@ # Modify password Once user.replace('userPassword', 'secreter') time.sleep(1) - assert 'PBKDF2_SHA256' in user.get_attr_val_utf8('userPassword') + assert DEFAULT_PASSWORD_STORAGE_SCHEME in user.get_attr_val_utf8('userPassword') # Try to change the password with same one for _ in range(3): with pytest.raises(ldap.CONSTRAINT_VIOLATION): @@ -508,4 +513,4 @@ if __name__ == "__main__": CURRENT_FILE = os.path.realpath(__file__) - pytest.main("-s -v %s" % CURRENT_FILE) \ No newline at end of file + pytest.main("-s -v %s" % CURRENT_FILE) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/plugins/rootdn_plugin_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/plugins/rootdn_plugin_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/plugins/rootdn_plugin_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/plugins/rootdn_plugin_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -643,7 +643,10 @@ plugin.apply_mods([(ldap.MOD_REPLACE, 'rootdn-deny-host', 'host.####.com')]) -def test_rootdn_access_denied_ip_wildcard(topology_st, rootdn_setup, rootdn_cleanup): +@pytest.mark.ds50800 +@pytest.mark.bz1807537 +@pytest.mark.xfail(ds_is_older('1.3.11', '1.4.3.5'), reason="May fail because of bz1807537") +def test_rootdn_access_denied_ip_wildcard(topology_st, rootdn_setup, rootdn_cleanup, timeout=5): """Test denied IP feature with a wildcard :id: 73c74f62-9ac2-4bb6-8a63-bacc8d8bbf93 @@ -663,22 +666,33 @@ log.info('Running test_rootdn_access_denied_ip_wildcard...') plugin.add_deny_ip('127.*') - time.sleep(.5) - # Bind as root DN - should fail + # Bind as Root DN - should fail uri = 'ldap://{}:{}'.format('127.0.0.1', topology_st.standalone.port) - with pytest.raises(ldap.UNWILLING_TO_PERFORM): - rootdn_bind(topology_st.standalone, uri=uri) + for i in range(0, timeout): + try: + rootdn_bind(topology_st.standalone, uri=uri) + except ldap.UNWILLING_TO_PERFORM: + break + else: + time.sleep(.5) # Change the denied IP so root DN succeeds plugin.apply_mods([(ldap.MOD_REPLACE, 'rootdn-deny-ip', '255.255.255.255')]) - time.sleep(.5) - # Bind should succeed - rootdn_bind(topology_st.standalone, uri=uri) + # Bind as Root DN - should succeed + for i in range(0, timeout): + try: + rootdn_bind(topology_st.standalone, uri=uri) + break + except: + time.sleep(.5) -def test_rootdn_access_allowed_ip_wildcard(topology_st, rootdn_setup, rootdn_cleanup): +@pytest.mark.ds50800 +@pytest.mark.bz1807537 +@pytest.mark.xfail(ds_is_older('1.3.11', '1.4.3.5'), reason="May fail because of bz1807537") +def test_rootdn_access_allowed_ip_wildcard(topology_st, rootdn_setup, rootdn_cleanup, timeout=5): """Test allowed ip feature :id: c3e22c61-9ed2-4e89-8243-6ff686ecad9b @@ -702,16 +716,25 @@ time.sleep(.5) # Bind as Root DN - should fail - uri = 'ldap://{}:{}'.format("127.0.0.1", topology_st.standalone.port) - with pytest.raises(ldap.UNWILLING_TO_PERFORM): - rootdn_bind(topology_st.standalone, uri=uri) + uri = 'ldap://{}:{}'.format('127.0.0.1', topology_st.standalone.port) + for i in range(0, timeout): + try: + rootdn_bind(topology_st.standalone, uri=uri) + except ldap.UNWILLING_TO_PERFORM: + break + else: + time.sleep(.5) # Allow localhost plugin.add_allow_ip('127.*') - time.sleep(.5) - # Bind should succeed - rootdn_bind(topology_st.standalone, uri=uri) + # Bind as Root DN - should succeed + for i in range(0, timeout): + try: + rootdn_bind(topology_st.standalone, uri=uri) + break + except: + time.sleep(.5) if __name__ == '__main__': diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/pwp_storage/storage_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/pwp_storage/storage_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/pwp_storage/storage_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/pwp_storage/storage_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -21,6 +21,7 @@ from lib389._constants import DEFAULT_SUFFIX from lib389.config import Config from lib389.password_plugins import PBKDF2Plugin, SSHA512Plugin +from lib389.utils import ds_is_older pytestmark = pytest.mark.tier1 @@ -104,7 +105,7 @@ in UserAccount(topo.standalone, user.dn).get_attr_val_utf8('userpassword').lower() user.delete() - +@pytest.mark.skipif(ds_is_older('1.4'), reason="Not implemented") def test_check_pbkdf2_sha256(topo): """Check password scheme PBKDF2_SHA256. diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/acceptance_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/acceptance_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/acceptance_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/acceptance_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -11,6 +11,7 @@ from lib389.tasks import * from lib389.utils import * from lib389.topologies import topology_m4 as topo_m4 +from lib389.topologies import topology_m2 as topo_m2 from . import get_repl_entries from lib389.idm.user import UserAccount from lib389.replica import ReplicationManager @@ -499,6 +500,84 @@ log.info('Check the error log for the error') assert topo_m4.ms["master1"].ds_error_log.match('.*nsds5ReplicaBackoffMax.*10.*invalid.*') +@pytest.mark.skipif(ds_is_older('1.4.4'), reason="Not implemented") +def test_csngen_task(topo_m2): + """Test csn generator test + + :id: b976849f-dbed-447e-91a7-c877d5d71fd0 + :setup: MMR with 2 masters + :steps: + 1. Create a csngen_test task + 2. Check that debug messages "_csngen_gen_tester_main" are in errors logs + :expectedresults: + 1. Should succeeds + 2. Should succeeds + """ + m1 = topo_m2.ms["master1"] + csngen_task = csngenTestTask(m1) + csngen_task.create(properties={ + 'ttl': '300' + }) + time.sleep(10) + log.info('Check the error log contains strings showing csn generator is tested') + assert m1.searchErrorsLog("_csngen_gen_tester_main") + +@pytest.mark.ds51082 +def test_csnpurge_large_valueset(topo_m2): + """Test csn generator test + + :id: 63e2bdb2-0a8f-4660-9465-7b80a9f72a74 + :setup: MMR with 2 masters + :steps: + 1. Create a test_user + 2. add a large set of values (more than 10) + 3. delete all the values (more than 10) + 4. configure the replica to purge those values (purgedelay=5s) + 5. Waiting for 6 second + 6. do a series of update + :expectedresults: + 1. Should succeeds + 2. Should succeeds + 3. Should succeeds + 4. Should succeeds + 5. Should succeeds + 6. Should not crash + """ + m1 = topo_m2.ms["master2"] + + test_user = UserAccount(m1, TEST_ENTRY_DN) + if test_user.exists(): + log.info('Deleting entry {}'.format(TEST_ENTRY_DN)) + test_user.delete() + test_user.create(properties={ + 'uid': TEST_ENTRY_NAME, + 'cn': TEST_ENTRY_NAME, + 'sn': TEST_ENTRY_NAME, + 'userPassword': TEST_ENTRY_NAME, + 'uidNumber' : '1000', + 'gidNumber' : '2000', + 'homeDirectory' : '/home/mmrepl_test', + }) + + # create a large value set so that it is sorted + for i in range(1,20): + test_user.add('description', 'value {}'.format(str(i))) + + # delete all values of the valueset + for i in range(1,20): + test_user.remove('description', 'value {}'.format(str(i))) + + # set purging delay to 5 second and wait more that 5second + replicas = Replicas(m1) + replica = replicas.list()[0] + log.info('nsds5ReplicaPurgeDelay to 5') + replica.set('nsds5ReplicaPurgeDelay', '5') + time.sleep(6) + + # add some new values to the valueset containing entries that should be purged + for i in range(21,25): + test_user.add('description', 'value {}'.format(str(i))) + if __name__ == '__main__': # Run isolated diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/changelog_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/changelog_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/changelog_test.py 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/changelog_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -219,7 +219,7 @@ log.info('Existing changelog %s file: %s removed' % (extension,changelog_file)) -@pytest.mark.xfail(ds_is_older('1.3.10.1'), reason="bug bz1685059") +@pytest.mark.xfail(ds_is_older('1.3.10.1', '1.4.3'), reason="bug bz1685059") @pytest.mark.bz1685059 @pytest.mark.ds50498 @pytest.mark.bz1769296 @@ -319,7 +319,7 @@ log.fatal('.ldif.done files are not present in %s - they should be' % changelog_dir) assert False -@pytest.mark.skipif(ds_is_older("1.3.10.1"), reason="Not implemented") +@pytest.mark.skipif(ds_is_older("1.4.3"), reason="Not implemented") def test_dsconf_dump_changelog_files_removed(topo): """Verify that the python counterpart of cl-dump (using dsconf) has a correct management of generated files @@ -367,7 +367,7 @@ # primary condition before executing the core goal of this case : management of generated files. log.info("Use dsconf dump-changelog with invalid parameters") - cmdline=['python', '/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', 'badpasswd', 'replication', 'dump-changelog'] + cmdline=['/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', 'badpasswd', 'replication', 'dump-changelog'] log.info('Command used : %s' % cmdline) proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE) msg = proc.communicate() @@ -377,7 +377,7 @@ # Now the core goal of the test case # Using dsconf replication changelog without -l option log.info('Use dsconf replication changelog without -l option: no generated ldif files should be present in %s ' % changelog_dir) - cmdline=['python', '/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', PASSWORD, 'replication', 'dump-changelog'] + cmdline=['/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', PASSWORD, 'replication', 'dump-changelog'] log.info('Command used : %s' % cmdline) proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE) proc.communicate() @@ -396,7 +396,7 @@ # Using dsconf replication changelog without -l option log.info('Use dsconf replication changelog with -l option: generated ldif files should be kept in %s ' % changelog_dir) - cmdline=['python', '/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', PASSWORD, 'replication', 'dump-changelog', '-l'] + cmdline=['/usr/sbin/dsconf', instance_url, '-D', DN_DM, '-w', PASSWORD, 'replication', 'dump-changelog', '-l'] log.info('Command used : %s' % cmdline) proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE) proc.communicate() diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/cleanallruv_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/cleanallruv_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/replication/cleanallruv_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/replication/cleanallruv_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -84,7 +84,7 @@ replica = replicas.get(DEFAULT_SUFFIX) count = 0 - while not clean and count < 10: + while not clean and count < 20: ruv = replica.get_ruv() if m4rid in ruv._rids: time.sleep(5) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/rewriters/adfilter_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/rewriters/adfilter_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/rewriters/adfilter_test.py 2020-04-16 14:16:36.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/rewriters/adfilter_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,33 +1,35 @@ import pytest import glob +import base64 +import re from lib389.tasks import * +from lib389.rewriters import * +from lib389.idm.user import UserAccounts from lib389.utils import * from lib389.topologies import topology_st from lib389._constants import DEFAULT_SUFFIX, HOST_STANDALONE, PORT_STANDALONE +samba_missing = False +try: + from samba.dcerpc import security + from samba.ndr import ndr_pack, ndr_unpack +except: + samba_missing = True + pass + log = logging.getLogger(__name__) # Skip on versions 1.4.2 and before. Rewriters are expected in 1.4.3 pytestmark = [pytest.mark.tier2, pytest.mark.skipif(ds_is_older('1.4.3'), reason="Not implemented")] PW = 'password' -configuration_container = 'cn=Configuration,%s' % DEFAULT_SUFFIX -schema_container = "cn=Schema,%s" % configuration_container - -def _create_ad_objects_container(inst): - inst.add_s(Entry(( - configuration_container, { - 'objectClass': 'top nsContainer'.split(), - 'cn': 'Configuration' - }))) - inst.add_s(Entry(( - schema_container, { - 'objectClass': 'top nsContainer'.split(), - 'cn': 'Schema' - }))) -def _create_user(inst, name, salt): +# +# Necessary because objectcategory relies on cn=xxx RDN +# while userAccount creates uid=xxx RDN +# +def _create_user(inst, schema_container, name, salt): dn = 'cn=%s,%s' % (name, schema_container) inst.add_s(Entry(( dn, { @@ -40,7 +42,6 @@ }))) - def test_adfilter_objectCategory(topology_st): """ Test adfilter objectCategory rewriter function @@ -48,15 +49,12 @@ librewriters = os.path.join( topology_st.standalone.ds_paths.lib_dir, 'dirsrv/librewriters.so') assert librewriters - # register objectCategory rewriter - topology_st.standalone.add_s(Entry(( - "cn=adfilter,cn=rewriters,cn=config", { - "objectClass": "top rewriterEntry".split(), - "cn": "adfilter", - "nsslapd-libpath": librewriters, - "nsslapd-filterrewriter": "adfilter_rewrite_objectCategory", - } - ))) + + rewriters = AdRewriters(topology_st.standalone) + ad_rewriter = rewriters.ensure_state(properties={"cn": "adfilter", "nsslapd-libpath": librewriters}) + ad_rewriter.add('nsslapd-filterrewriter', "adfilter_rewrite_objectCategory") + ad_rewriter.create_containers(DEFAULT_SUFFIX) + schema_container = ad_rewriter.get_schema_dn() objectcategory_attr = '( NAME \'objectCategory\' DESC \'test of objectCategory\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )' topology_st.standalone.schema.add_schema('attributetypes', [ensure_bytes(objectcategory_attr)]) @@ -64,9 +62,8 @@ topology_st.standalone.restart(60) # Add a user - _create_ad_objects_container(topology_st.standalone) for i in range(0, 20): - _create_user(topology_st.standalone, "user_%d" % i, str(i)) + _create_user(topology_st.standalone, schema_container, "user_%d" % i, str(i)) # Check EQUALITY filter rewrite => it should match only one entry for i in range(0, 20): @@ -83,3 +80,98 @@ log.info('Test PASSED') +def sid_to_objectsid(sid): + return base64.b64encode(ndr_pack(security.dom_sid(sid))).decode('utf-8') + +def objectsid_to_sid(objectsid): + sid = ndr_unpack(security.dom_sid, base64.b64decode(objectsid)) + return str(sid) + +@pytest.mark.skipif(samba_missing, reason="It is missing samba python bindings") +def test_adfilter_objectSid(topology_st): + """ + Test adfilter objectCategory rewriter function + + :id: fc5880ff-4305-47ba-84fb-38429e264e9e + + :setup: Standalone instance + + :steps: + 1. add a objectsid rewriter (from librewriters.so) + 2. add a dummy schema definition of objectsid to prevent nsslapd-verify-filter-schema + 3. restart the server (to load the rewriter) + 4. Add "samba" container/users + 5. Searches using objectsid in string format + + :expectedresults: + 1. Add operation should PASS. + 2. Add operations should PASS. + 3. restart should PASS + 4. Add "samba" users should PASS + 5. Search returns only one entry + """ + librewriters = os.path.join( topology_st.standalone.ds_paths.lib_dir, 'dirsrv/librewriters.so') + assert librewriters + + rewriters = AdRewriters(topology_st.standalone) + ad_rewriter = rewriters.ensure_state(properties={"cn": "adfilter", "nsslapd-libpath": librewriters}) + ad_rewriter.add('nsslapd-filterrewriter', "adfilter_rewrite_objectsid") + ad_rewriter.create_containers(DEFAULT_SUFFIX) + schema_container = ad_rewriter.get_schema_dn() + + # to prevent nsslapd-verify-filter-schema to reject searches with objectsid + objectcategory_attr = '( NAME \'objectsid\' DESC \'test of objectsid\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )' + topology_st.standalone.schema.add_schema('attributetypes', [ensure_bytes(objectcategory_attr)]) + + topology_st.standalone.restart() + + # Contains a list of b64encoded SID from https://github.com/SSSD/sssd/blob/master/src/tests/intg/data/ad_data.ldif + SIDs = ["AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EUAQAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8E9gEAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EAwIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EBAIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EBgIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EBwIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EBQIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EAAIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EAQIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EAgIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ECAIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EKQIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EOwIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EPAIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ECQIAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8E8gEAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ETQQAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ETgQAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EeUMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EekMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8Ee0MBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EfEMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ETwQAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8EUQQAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ESUMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ESkMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ES0MBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8ETEMBAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8E9AEAAA==", + "AQUAAAAAAAUVAAAADcfLTVzC66zo0l8E9QEAAA=="] + + # Add a container and "samba" like users containing objectsid + users = UserAccounts(topology_st.standalone, schema_container, rdn=None) + i = 0 + for sid in SIDs: + decoded = base64.b64decode(sid) + user = users.create_test_user(uid=i) + user.add('objectclass', 'extensibleobject') + user.replace('objectsid', decoded) + user.replace('objectSidString', objectsid_to_sid(sid)) + i = i + 1 + + # Check that objectsid rewrite can retrieve the "samba" user + # using either a string objectsid (i.e. S-1-5...) or a blob objectsid + for sid_blob in SIDs: + sid_string = objectsid_to_sid(sid_blob) + ents_sid_string = topology_st.standalone.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(objectsid=%s)' % sid_string) + assert len(ents_sid_string) == 1 + diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/rewriters/__init__.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/rewriters/__init__.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/rewriters/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/rewriters/__init__.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,3 @@ +""" + :Requirement: 389-ds-base: Rewriters +""" diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/roles/__init__.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/roles/__init__.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/roles/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/roles/__init__.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,3 @@ +""" + :Requirement: 389-ds-base: Roles +""" diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/sasl/allowed_mechs_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/sasl/allowed_mechs_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/sasl/allowed_mechs_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/sasl/allowed_mechs_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -10,6 +10,7 @@ import pytest import os from lib389.topologies import topology_st +from lib389.utils import ds_is_older pytestmark = pytest.mark.tier1 @@ -178,6 +179,7 @@ @pytest.mark.bz1816854 @pytest.mark.ds50869 +@pytest.mark.xfail(ds_is_older('1.3.11', '1.4.3.6'), reason="May fail because of bz1816854") def test_config_set_few_mechs(topology_st): """Test that we can successfully set multiple values to nsslapd-allowed-sasl-mechanisms diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/sasl/regression_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/sasl/regression_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/sasl/regression_test.py 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/sasl/regression_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -48,7 +48,7 @@ log.info("\n######################### Check PEM files (%s, %s, %s)%s in %s ######################\n" % (mycacert, myservercert, myserverkey, notexist, confdir)) global cacert - cacert = '%s/%s.pem' % (confdir, mycacert) + cacert = f"{mycacert}.pem" if os.path.isfile(cacert): if notexist == "": log.info('%s is successfully generated.' % cacert) @@ -61,7 +61,7 @@ assert False else: log.info('%s is correctly not generated.' % cacert) - servercert = '%s/%s.pem' % (confdir, myservercert) + servercert = f"{myservercert}.pem" if os.path.isfile(servercert): if notexist == "": log.info('%s is successfully generated.' % servercert) @@ -74,7 +74,7 @@ assert False else: log.info('%s is correctly not generated.' % servercert) - serverkey = '%s/%s.pem' % (confdir, myserverkey) + serverkey = f"{myserverkey}.pem" if os.path.isfile(serverkey): if notexist == "": log.info('%s is successfully generated.' % serverkey) @@ -91,16 +91,16 @@ def relocate_pem_files(topology_m2): log.info("######################### Relocate PEM files on master1 ######################") - mycacert = 'MyCA' + certdir_prefix = "/dev/shm" + mycacert = os.path.join(certdir_prefix, "MyCA") topology_m2.ms["master1"].encryption.set('CACertExtractFile', mycacert) - myservercert = 'MyServerCert1' - myserverkey = 'MyServerKey1' + myservercert = os.path.join(certdir_prefix, "MyServerCert1") + myserverkey = os.path.join(certdir_prefix, "MyServerKey1") topology_m2.ms["master1"].rsa.apply_mods([(ldap.MOD_REPLACE, 'ServerCertExtractFile', myservercert), (ldap.MOD_REPLACE, 'ServerKeyExtractFile', myserverkey)]) log.info("##### restart master1") topology_m2.ms["master1"].restart() - m1confdir = topology_m2.ms["master1"].confdir - check_pems(m1confdir, mycacert, myservercert, myserverkey, "") + check_pems(certdir_prefix, mycacert, myservercert, myserverkey, "") @pytest.mark.ds47536 def test_openldap_no_nss_crypto(topology_m2): diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/setup_ds/dscreate_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/setup_ds/dscreate_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/setup_ds/dscreate_test.py 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/setup_ds/dscreate_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -54,6 +54,11 @@ return TopologyInstance(instance) def test_setup_ds_minimal_dry(topology): + # Unset PYTHONPATH to avoid mixing old CLI tools and new lib389 + tmp_env = os.environ + if "PYTHONPATH" in tmp_env: + del tmp_env["PYTHONPATH"] + # Create the setupDs lc = LogCapture() # Give it the right types. diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/setup_ds/remove_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/setup_ds/remove_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/setup_ds/remove_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/setup_ds/remove_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -14,6 +14,7 @@ from lib389.instance.remove import remove_ds_instance from lib389._constants import ReplicaRole from lib389.topologies import create_topology +from lib389.utils import ds_is_older pytestmark = pytest.mark.tier0 @@ -31,7 +32,7 @@ return topology - +@pytest.mark.skipif(ds_is_older('1.4.3'), reason="Backend split, lib389 supports only cn=bdb,cn=config...") @pytest.mark.parametrize("simple_allocate", (True, False)) def test_basic(topology_st, simple_allocate): """Check that all DS directories and systemd items were removed diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/stat/mmt_state_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/stat/mmt_state_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/stat/mmt_state_test.py 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/stat/mmt_state_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,361 +0,0 @@ -import os -import logging -import ldap -import pytest -from lib389.idm.user import UserAccounts -from lib389.topologies import topology_m2 as topo -from lib389._constants import * - -pytestmark = pytest.mark.tier1 - -DEBUGGING = os.getenv("DEBUGGING", default=False) -if DEBUGGING: - logging.getLogger(__name__).setLevel(logging.DEBUG) -else: - logging.getLogger(__name__).setLevel(logging.INFO) -log = logging.getLogger(__name__) - -BINVALUE1 = 'thedeadbeef1' -BINVALUE2 = 'thedeadbeef2' -BINVALUE3 = 'thedeadbeef3' - -USER_PROPERTIES = { - 'uid': 'state1usr', - 'cn': 'state1usr', - 'sn': 'state1usr', - 'uidNumber': '1001', - 'gidNumber': '2001', - 'userpassword': PASSWORD, - 'homeDirectory': '/home/testuser' -} - - -def _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr): - """Check if list of operational attributes present for a given entry""" - - log.info('Checking if operational attrs vucsn, adcsn and vdcsn present for: {}'.format(tuser)) - entry = topo.ms["master1"].search_s(tuser.dn, ldap.SCOPE_BASE, 'objectclass=*',['nscpentrywsi']) - if oper_attr: - for line in str(entry).split('\n'): - if attr_name + ';' in line: - if not 'DELETE' in oper_type: - assert any(attr in line for attr in exp_values) and oper_attr in line - else: - assert 'deleted' in line and oper_attr in line and attr_value in line - - -@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", - [('description', 'Test1usr1', 'ldap.MOD_ADD', ['Test1usr1'], 'vucsn'), - ('description', 'Test1usr2', 'ldap.MOD_ADD', ['Test1usr1', - 'Test1usr2'], 'vucsn'), - ('description', 'Test1usr3', 'ldap.MOD_ADD', - ['Test1usr1', 'Test1usr2', 'Test1usr3'], 'vucsn'), - ('description', 'Test1usr4', 'ldap.MOD_REPLACE', ['Test1usr4'], - 'adcsn'), - ('description', 'Test1usr4', 'ldap.MOD_DELETE', [], 'vdcsn')]) -def test_check_desc_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): - """Modify user's description attribute and check if description attribute is - added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. - - :id: f0830538-02cf-11e9-8be0-8c16451d917b - :parametrized: yes - :setup: Replication with two masters. - :steps: 1. Add user to Master1 without description attribute. - 2. Add description attribute to user. - 3. Check if only one description attribute exist. - 4. Check if operational attribute vucsn exist. - 5. Add second description attribute to user. - 6. Check if two description attributes exist. - 7. Check if operational attribute vucsn exist. - 8. Add third description attribute to user. - 9. Check if three description attributes exist. - 10. Check if operational attribute vucsn exist. - 11. Replace description attribute for the user. - 12. Check if only one description attribute exist. - 13. Check if operational attribute adcsn exist. - 14. Delete description attribute for the user. - 15. Check if no description attribute exist. - 16. Check if no operational attribute vdcsn exist. - :expectedresults: - 1. Add user to M1 should PASS. - 2. Adding description attribute should PASS - 3. Only one description attribute should be present. - 4. Vucsn attribute should be present. - 5. Adding a new description attribute should PASS - 6. Two description attribute should be present. - 7. Vucsn attribute should be present. - 8. Adding a new description attribute should PASS - 9. Three description attribute should be present. - 10. Vucsn attribute should be present. - 11. Replacing new description attribute should PASS - 12. Only one description attribute should be present. - 13. Adcsn attribute should be present. - 14. Deleting description attribute should PASS - 15. No description attribute should be present. - 16. Vdcsn attribute should be present. - """ - - test_entry = 'state1test' - log.info('Add user: {}'.format(test_entry)) - users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) - try: - tuser = users.get(test_entry) - except ldap.NO_SUCH_OBJECT: - USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) - tuser = users.create(properties=USER_PROPERTIES) - tuser.set(attr_name, attr_value, eval(oper_type)) - log.info('Check if list of description attrs present for: {}'.format(test_entry)) - assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) - - log.info('Checking for operational attributes') - _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) - - -@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", - [('cn', 'TestCN1', 'ldap.MOD_ADD', ['TestCN1', 'TestCNusr1'], 'vucsn'), - ('cn', 'TestCN2', 'ldap.MOD_ADD', ['TestCN1', - 'TestCN2', 'TestCNusr1'], 'vucsn'), - ('cn', 'TestnewCN3', 'ldap.MOD_REPLACE', ['TestnewCN3'], 'adcsn'), - ('cn', 'TestnewCN3', 'ldap.MOD_DELETE', None, None)]) -def test_check_cn_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): - """Modify user's cn attribute and check if cn attribute is added/modified/deleted and - operational attributes vucsn, adcsn and vdcsn are present. - - :id: 19614bae-02d0-11e9-a295-8c16451d917b - :parametrized: yes - :setup: Replication with two masters. - :steps: 1. Add user to Master1 with cn attribute. - 2. Add a new cn attribute to user. - 3. Check if two cn attributes exist. - 4. Check if operational attribute vucsn exist for each cn attribute. - 5. Add a new cn attribute to user. - 6. Check if three cn attributes exist. - 7. Check if operational attribute vucsn exist for each cn attribute. - 8. Replace cn attribute for the user. - 9. Check if only one cn attribute exist. - 10. Check if operational attribute adcsn exist. - 11. Delete cn attribute from user and check if it fails. - :expectedresults: - 1. Add user to M1 should PASS. - 2. Adding a new cn attribute should PASS - 3. Two cn attribute should be present. - 4. Vucsn attribute should be present. - 5. Adding a new cn attribute should PASS - 6. Three cn attribute should be present. - 7. Vucsn attribute should be present. - 8. Replacing new cn attribute should PASS - 9. Only one cn attribute should be present. - 10. Operational attribute adcsn should be present. - 11. Deleting cn attribute should fail with ObjectClass violation error. - """ - - test_entry = 'TestCNusr1' - log.info('Add user: {}'.format(test_entry)) - users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) - try: - tuser = users.get(test_entry) - except ldap.NO_SUCH_OBJECT: - USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) - tuser = users.create(properties=USER_PROPERTIES) - - if 'MOD_DELETE' in oper_type: - with pytest.raises(ldap.OBJECT_CLASS_VIOLATION): - tuser.set(attr_name, attr_value, eval(oper_type)) - else: - tuser.set(attr_name, attr_value, eval(oper_type)) - log.info('Check if list of cn attrs present for: {}'.format(test_entry)) - assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) - log.info('Checking for operational attributes') - _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) - - -@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", - [('preferredlanguage', 'Chinese', 'ldap.MOD_REPLACE', ['Chinese'], - 'vucsn'), - ('preferredlanguage', 'French', 'ldap.MOD_ADD', None, None), - ('preferredlanguage', 'German', 'ldap.MOD_REPLACE', ['German'], 'adcsn'), - ('preferredlanguage', 'German', 'ldap.MOD_DELETE', [], 'vdcsn')]) -def test_check_single_value_attr_state(topo, attr_name, attr_value, oper_type, - exp_values, oper_attr): - """Modify user's preferredlanguage attribute and check if preferredlanguage attribute is - added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. - - :id: 22fd645e-02d0-11e9-a9e4-8c16451d917b - :parametrized: yes - :setup: Replication with two masters. - :steps: 1. Add user to Master1 without preferredlanguage attribute. - 2. Add a new preferredlanguage attribute to user. - 3. Check if one preferredlanguage attributes exist. - 4. Check if operational attribute vucsn exist. - 5. Add a new preferredlanguage attribute for the user and check if its rejected. - 6. Replace preferredlanguage attribute for the user. - 7. Check if only one preferredlanguage attribute exist. - 8. Check if operational attribute adcsn exist with preferredlanguage. - :expectedresults: - 1. Add user to M1 should PASS. - 2. Adding a new preferredlanguage attribute should PASS - 3. Only one preferredlanguage attribute should be present. - 4. Vucsn attribute should be present. - 5. Adding a new preferredlanguage should fail with ObjectClass violation error. - 6. Replace preferredlanguage should PASS. - 7. Only one preferredlanguage attribute should be present. - 8. Operational attribute adcsn should be present with preferredlanguage. - """ - - test_entry = 'Langusr1' - log.info('Add user: {}'.format(test_entry)) - users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) - try: - tuser = users.get(test_entry) - except ldap.NO_SUCH_OBJECT: - USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) - tuser = users.create(properties=USER_PROPERTIES) - - if 'MOD_ADD' in oper_type: - with pytest.raises(ldap.OBJECT_CLASS_VIOLATION): - tuser.set(attr_name, attr_value, eval(oper_type)) - else: - tuser.set(attr_name, attr_value, eval(oper_type)) - log.info('Check if list of cn attrs present for: {}'.format(test_entry)) - assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) - log.info('Checking for operational attributes') - _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) - - -@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", - [('roomnumber;office', 'Tower1', 'ldap.MOD_ADD', ['Tower1'], 'vucsn'), - ('roomnumber;office', 'Tower2', 'ldap.MOD_ADD', ['Tower1', 'Tower2'], - 'vucsn'), - ('roomnumber;office', 'Tower3', 'ldap.MOD_ADD', ['Tower1', 'Tower2', - 'Tower3'], 'vucsn'), - ('roomnumber;office', 'Tower4', 'ldap.MOD_REPLACE', ['Tower4'], 'adcsn'), - ('roomnumber;office', 'Tower4', 'ldap.MOD_DELETE', [], 'vucsn')]) -def test_check_subtype_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): - """Modify user's roomnumber;office attribute subtype and check if roomnumber;office attribute - is added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. - - :id: 29ab87a4-02d0-11e9-b104-8c16451d917b - :parametrized: yes - :setup: Replication with two masters. - :steps: 1. Add user to Master1 without roomnumber;office attribute. - 2. Add roomnumber;office attribute to user. - 3. Check if only one roomnumber;office attribute exist. - 4. Check if operational attribute vucsn exist. - 5. Add second roomnumber;office attribute to user. - 6. Check if two roomnumber;office attributes exist. - 7. Check if operational attribute vucsn exist. - 8. Add third roomnumber;office attribute to user. - 9. Check if three roomnumber;office attributes exist. - 10. Check if operational attribute vucsn exist. - 11. Replace roomnumber;office attribute for the user. - 12. Check if only one roomnumber;office attribute exist. - 13. Check if operational attribute adcsn exist. - 14. Delete roomnumber;office attribute for the user. - 15. Check if no roomnumber;office attribute exist. - 16. Check if no operational attribute vdcsn exist. - :expectedresults: - 1. Add user to M1 should PASS. - 2. Adding roomnumber;office attribute should PASS - 3. Only one roomnumber;office attribute should be present. - 4. Vucsn attribute should be present. - 5. Adding a new roomnumber;office attribute should PASS - 6. Two roomnumber;office attribute should be present. - 7. Vucsn attribute should be present. - 8. Adding a new roomnumber;office attribute should PASS - 9. Three roomnumber;office attribute should be present. - 10. Vucsn attribute should be present. - 11. Replacing new roomnumber;office attribute should PASS - 12. Only one roomnumber;office attribute should be present. - 13. Adcsn attribute should be present. - 14. Deleting roomnumber;office attribute should PASS - 15. No roomnumber;office attribute should be present. - 16. Vdcsn attribute should be present. - """ - - test_entry = 'roomoffice1usr' - log.info('Add user: {}'.format(test_entry)) - users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) - try: - tuser = users.get(test_entry) - except ldap.NO_SUCH_OBJECT: - USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) - tuser = users.create(properties=USER_PROPERTIES) - - tuser.set(attr_name, attr_value, eval(oper_type)) - log.info('Check if list of roomnumber;office attributes are present for a given entry') - assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) - log.info('Checking if operational attributes are present for cn') - _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) - - -@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", - [('jpegphoto', BINVALUE1, 'ldap.MOD_ADD', [BINVALUE1], 'vucsn'), - ('jpegphoto', BINVALUE2, 'ldap.MOD_ADD', [BINVALUE1, BINVALUE2], - 'vucsn'), - ('jpegphoto', BINVALUE3, 'ldap.MOD_ADD', [BINVALUE1, BINVALUE2, - BINVALUE3], 'vucsn'), - ('jpegphoto', BINVALUE2, 'ldap.MOD_REPLACE', [BINVALUE2], 'adcsn'), - ('jpegphoto', BINVALUE2, 'ldap.MOD_DELETE', [], 'vdcsn')]) -def test_check_jpeg_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): - """Modify user's jpegphoto attribute and check if jpegphoto attribute is added/modified/deleted - and operational attributes vucsn, adcsn and vdcsn are present. - - :id: 312ac0d0-02d0-11e9-9d34-8c16451d917b - :parametrized: yes - :setup: Replication with two masters. - :steps: 1. Add user to Master1 without jpegphoto attribute. - 2. Add jpegphoto attribute to user. - 3. Check if only one jpegphoto attribute exist. - 4. Check if operational attribute vucsn exist. - 5. Add second jpegphoto attribute to user. - 6. Check if two jpegphoto attributes exist. - 7. Check if operational attribute vucsn exist. - 8. Add third jpegphoto attribute to user. - 9. Check if three jpegphoto attributes exist. - 10. Check if operational attribute vucsn exist. - 11. Replace jpegphoto attribute for the user. - 12. Check if only one jpegphoto attribute exist. - 13. Check if operational attribute adcsn exist. - 14. Delete jpegphoto attribute for the user. - 15. Check if no jpegphoto attribute exist. - 16. Check if no operational attribute vdcsn exist. - :expectedresults: - 1. Add user to M1 should PASS. - 2. Adding jpegphoto attribute should PASS - 3. Only one jpegphoto attribute should be present. - 4. Vucsn attribute should be present. - 5. Adding a new jpegphoto attribute should PASS - 6. Two jpegphoto attribute should be present. - 7. Vucsn attribute should be present. - 8. Adding a new jpegphoto attribute should PASS - 9. Three jpegphoto attribute should be present. - 10. Vucsn attribute should be present. - 11. Replacing new jpegphoto attribute should PASS - 12. Only one jpegphoto attribute should be present. - 13. Adcsn attribute should be present. - 14. Deleting jpegphoto attribute should PASS - 15. No jpegphoto attribute should be present. - 16. Vdcsn attribute should be present. - """ - - test_entry = 'testJpeg1usr' - log.info('Add user: {}'.format(test_entry)) - users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) - try: - tuser = users.get(test_entry) - except ldap.NO_SUCH_OBJECT: - USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) - tuser = users.create(properties=USER_PROPERTIES) - - tuser.set(attr_name, attr_value, eval(oper_type)) - log.info('Check if list of jpeg attributes are present for a given entry') - assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) - log.info('Checking if operational attributes are present for cn') - _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) - - -if __name__ == "__main__": - # Run isolated - # -s for DEBUG mode - CURRENT_FILE = os.path.realpath(__file__) - pytest.main("-s -v %s" % CURRENT_FILE) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/state/mmt_state_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/state/mmt_state_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/state/mmt_state_test.py 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/state/mmt_state_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -0,0 +1,361 @@ +import os +import logging +import ldap +import pytest +from lib389.idm.user import UserAccounts +from lib389.topologies import topology_m2 as topo +from lib389._constants import * + +pytestmark = pytest.mark.tier1 + +DEBUGGING = os.getenv("DEBUGGING", default=False) +if DEBUGGING: + logging.getLogger(__name__).setLevel(logging.DEBUG) +else: + logging.getLogger(__name__).setLevel(logging.INFO) +log = logging.getLogger(__name__) + +BINVALUE1 = 'thedeadbeef1' +BINVALUE2 = 'thedeadbeef2' +BINVALUE3 = 'thedeadbeef3' + +USER_PROPERTIES = { + 'uid': 'state1usr', + 'cn': 'state1usr', + 'sn': 'state1usr', + 'uidNumber': '1001', + 'gidNumber': '2001', + 'userpassword': PASSWORD, + 'homeDirectory': '/home/testuser' +} + + +def _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr): + """Check if list of operational attributes present for a given entry""" + + log.info('Checking if operational attrs vucsn, adcsn and vdcsn present for: {}'.format(tuser)) + entry = topo.ms["master1"].search_s(tuser.dn, ldap.SCOPE_BASE, 'objectclass=*',['nscpentrywsi']) + if oper_attr: + for line in str(entry).split('\n'): + if attr_name + ';' in line: + if not 'DELETE' in oper_type: + assert any(attr in line for attr in exp_values) and oper_attr in line + else: + assert 'deleted' in line and oper_attr in line and attr_value in line + + +@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", + [('description', 'Test1usr1', 'ldap.MOD_ADD', ['Test1usr1'], 'vucsn'), + ('description', 'Test1usr2', 'ldap.MOD_ADD', ['Test1usr1', + 'Test1usr2'], 'vucsn'), + ('description', 'Test1usr3', 'ldap.MOD_ADD', + ['Test1usr1', 'Test1usr2', 'Test1usr3'], 'vucsn'), + ('description', 'Test1usr4', 'ldap.MOD_REPLACE', ['Test1usr4'], + 'adcsn'), + ('description', 'Test1usr4', 'ldap.MOD_DELETE', [], 'vdcsn')]) +def test_check_desc_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): + """Modify user's description attribute and check if description attribute is + added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. + + :id: f0830538-02cf-11e9-8be0-8c16451d917b + :parametrized: yes + :setup: Replication with two masters. + :steps: 1. Add user to Master1 without description attribute. + 2. Add description attribute to user. + 3. Check if only one description attribute exist. + 4. Check if operational attribute vucsn exist. + 5. Add second description attribute to user. + 6. Check if two description attributes exist. + 7. Check if operational attribute vucsn exist. + 8. Add third description attribute to user. + 9. Check if three description attributes exist. + 10. Check if operational attribute vucsn exist. + 11. Replace description attribute for the user. + 12. Check if only one description attribute exist. + 13. Check if operational attribute adcsn exist. + 14. Delete description attribute for the user. + 15. Check if no description attribute exist. + 16. Check if no operational attribute vdcsn exist. + :expectedresults: + 1. Add user to M1 should PASS. + 2. Adding description attribute should PASS + 3. Only one description attribute should be present. + 4. Vucsn attribute should be present. + 5. Adding a new description attribute should PASS + 6. Two description attribute should be present. + 7. Vucsn attribute should be present. + 8. Adding a new description attribute should PASS + 9. Three description attribute should be present. + 10. Vucsn attribute should be present. + 11. Replacing new description attribute should PASS + 12. Only one description attribute should be present. + 13. Adcsn attribute should be present. + 14. Deleting description attribute should PASS + 15. No description attribute should be present. + 16. Vdcsn attribute should be present. + """ + + test_entry = 'state1test' + log.info('Add user: {}'.format(test_entry)) + users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) + try: + tuser = users.get(test_entry) + except ldap.NO_SUCH_OBJECT: + USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) + tuser = users.create(properties=USER_PROPERTIES) + tuser.set(attr_name, attr_value, eval(oper_type)) + log.info('Check if list of description attrs present for: {}'.format(test_entry)) + assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) + + log.info('Checking for operational attributes') + _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) + + +@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", + [('cn', 'TestCN1', 'ldap.MOD_ADD', ['TestCN1', 'TestCNusr1'], 'vucsn'), + ('cn', 'TestCN2', 'ldap.MOD_ADD', ['TestCN1', + 'TestCN2', 'TestCNusr1'], 'vucsn'), + ('cn', 'TestnewCN3', 'ldap.MOD_REPLACE', ['TestnewCN3'], 'adcsn'), + ('cn', 'TestnewCN3', 'ldap.MOD_DELETE', None, None)]) +def test_check_cn_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): + """Modify user's cn attribute and check if cn attribute is added/modified/deleted and + operational attributes vucsn, adcsn and vdcsn are present. + + :id: 19614bae-02d0-11e9-a295-8c16451d917b + :parametrized: yes + :setup: Replication with two masters. + :steps: 1. Add user to Master1 with cn attribute. + 2. Add a new cn attribute to user. + 3. Check if two cn attributes exist. + 4. Check if operational attribute vucsn exist for each cn attribute. + 5. Add a new cn attribute to user. + 6. Check if three cn attributes exist. + 7. Check if operational attribute vucsn exist for each cn attribute. + 8. Replace cn attribute for the user. + 9. Check if only one cn attribute exist. + 10. Check if operational attribute adcsn exist. + 11. Delete cn attribute from user and check if it fails. + :expectedresults: + 1. Add user to M1 should PASS. + 2. Adding a new cn attribute should PASS + 3. Two cn attribute should be present. + 4. Vucsn attribute should be present. + 5. Adding a new cn attribute should PASS + 6. Three cn attribute should be present. + 7. Vucsn attribute should be present. + 8. Replacing new cn attribute should PASS + 9. Only one cn attribute should be present. + 10. Operational attribute adcsn should be present. + 11. Deleting cn attribute should fail with ObjectClass violation error. + """ + + test_entry = 'TestCNusr1' + log.info('Add user: {}'.format(test_entry)) + users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) + try: + tuser = users.get(test_entry) + except ldap.NO_SUCH_OBJECT: + USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) + tuser = users.create(properties=USER_PROPERTIES) + + if 'MOD_DELETE' in oper_type: + with pytest.raises(ldap.OBJECT_CLASS_VIOLATION): + tuser.set(attr_name, attr_value, eval(oper_type)) + else: + tuser.set(attr_name, attr_value, eval(oper_type)) + log.info('Check if list of cn attrs present for: {}'.format(test_entry)) + assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) + log.info('Checking for operational attributes') + _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) + + +@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", + [('preferredlanguage', 'Chinese', 'ldap.MOD_REPLACE', ['Chinese'], + 'vucsn'), + ('preferredlanguage', 'French', 'ldap.MOD_ADD', None, None), + ('preferredlanguage', 'German', 'ldap.MOD_REPLACE', ['German'], 'adcsn'), + ('preferredlanguage', 'German', 'ldap.MOD_DELETE', [], 'vdcsn')]) +def test_check_single_value_attr_state(topo, attr_name, attr_value, oper_type, + exp_values, oper_attr): + """Modify user's preferredlanguage attribute and check if preferredlanguage attribute is + added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. + + :id: 22fd645e-02d0-11e9-a9e4-8c16451d917b + :parametrized: yes + :setup: Replication with two masters. + :steps: 1. Add user to Master1 without preferredlanguage attribute. + 2. Add a new preferredlanguage attribute to user. + 3. Check if one preferredlanguage attributes exist. + 4. Check if operational attribute vucsn exist. + 5. Add a new preferredlanguage attribute for the user and check if its rejected. + 6. Replace preferredlanguage attribute for the user. + 7. Check if only one preferredlanguage attribute exist. + 8. Check if operational attribute adcsn exist with preferredlanguage. + :expectedresults: + 1. Add user to M1 should PASS. + 2. Adding a new preferredlanguage attribute should PASS + 3. Only one preferredlanguage attribute should be present. + 4. Vucsn attribute should be present. + 5. Adding a new preferredlanguage should fail with ObjectClass violation error. + 6. Replace preferredlanguage should PASS. + 7. Only one preferredlanguage attribute should be present. + 8. Operational attribute adcsn should be present with preferredlanguage. + """ + + test_entry = 'Langusr1' + log.info('Add user: {}'.format(test_entry)) + users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) + try: + tuser = users.get(test_entry) + except ldap.NO_SUCH_OBJECT: + USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) + tuser = users.create(properties=USER_PROPERTIES) + + if 'MOD_ADD' in oper_type: + with pytest.raises(ldap.OBJECT_CLASS_VIOLATION): + tuser.set(attr_name, attr_value, eval(oper_type)) + else: + tuser.set(attr_name, attr_value, eval(oper_type)) + log.info('Check if list of cn attrs present for: {}'.format(test_entry)) + assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) + log.info('Checking for operational attributes') + _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) + + +@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", + [('roomnumber;office', 'Tower1', 'ldap.MOD_ADD', ['Tower1'], 'vucsn'), + ('roomnumber;office', 'Tower2', 'ldap.MOD_ADD', ['Tower1', 'Tower2'], + 'vucsn'), + ('roomnumber;office', 'Tower3', 'ldap.MOD_ADD', ['Tower1', 'Tower2', + 'Tower3'], 'vucsn'), + ('roomnumber;office', 'Tower4', 'ldap.MOD_REPLACE', ['Tower4'], 'adcsn'), + ('roomnumber;office', 'Tower4', 'ldap.MOD_DELETE', [], 'vucsn')]) +def test_check_subtype_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): + """Modify user's roomnumber;office attribute subtype and check if roomnumber;office attribute + is added/modified/deleted and operational attributes vucsn, adcsn and vdcsn are present. + + :id: 29ab87a4-02d0-11e9-b104-8c16451d917b + :parametrized: yes + :setup: Replication with two masters. + :steps: 1. Add user to Master1 without roomnumber;office attribute. + 2. Add roomnumber;office attribute to user. + 3. Check if only one roomnumber;office attribute exist. + 4. Check if operational attribute vucsn exist. + 5. Add second roomnumber;office attribute to user. + 6. Check if two roomnumber;office attributes exist. + 7. Check if operational attribute vucsn exist. + 8. Add third roomnumber;office attribute to user. + 9. Check if three roomnumber;office attributes exist. + 10. Check if operational attribute vucsn exist. + 11. Replace roomnumber;office attribute for the user. + 12. Check if only one roomnumber;office attribute exist. + 13. Check if operational attribute adcsn exist. + 14. Delete roomnumber;office attribute for the user. + 15. Check if no roomnumber;office attribute exist. + 16. Check if no operational attribute vdcsn exist. + :expectedresults: + 1. Add user to M1 should PASS. + 2. Adding roomnumber;office attribute should PASS + 3. Only one roomnumber;office attribute should be present. + 4. Vucsn attribute should be present. + 5. Adding a new roomnumber;office attribute should PASS + 6. Two roomnumber;office attribute should be present. + 7. Vucsn attribute should be present. + 8. Adding a new roomnumber;office attribute should PASS + 9. Three roomnumber;office attribute should be present. + 10. Vucsn attribute should be present. + 11. Replacing new roomnumber;office attribute should PASS + 12. Only one roomnumber;office attribute should be present. + 13. Adcsn attribute should be present. + 14. Deleting roomnumber;office attribute should PASS + 15. No roomnumber;office attribute should be present. + 16. Vdcsn attribute should be present. + """ + + test_entry = 'roomoffice1usr' + log.info('Add user: {}'.format(test_entry)) + users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) + try: + tuser = users.get(test_entry) + except ldap.NO_SUCH_OBJECT: + USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) + tuser = users.create(properties=USER_PROPERTIES) + + tuser.set(attr_name, attr_value, eval(oper_type)) + log.info('Check if list of roomnumber;office attributes are present for a given entry') + assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) + log.info('Checking if operational attributes are present for cn') + _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) + + +@pytest.mark.parametrize("attr_name, attr_value, oper_type, exp_values, oper_attr", + [('jpegphoto', BINVALUE1, 'ldap.MOD_ADD', [BINVALUE1], 'vucsn'), + ('jpegphoto', BINVALUE2, 'ldap.MOD_ADD', [BINVALUE1, BINVALUE2], + 'vucsn'), + ('jpegphoto', BINVALUE3, 'ldap.MOD_ADD', [BINVALUE1, BINVALUE2, + BINVALUE3], 'vucsn'), + ('jpegphoto', BINVALUE2, 'ldap.MOD_REPLACE', [BINVALUE2], 'adcsn'), + ('jpegphoto', BINVALUE2, 'ldap.MOD_DELETE', [], 'vdcsn')]) +def test_check_jpeg_attr_state(topo, attr_name, attr_value, oper_type, exp_values, oper_attr): + """Modify user's jpegphoto attribute and check if jpegphoto attribute is added/modified/deleted + and operational attributes vucsn, adcsn and vdcsn are present. + + :id: 312ac0d0-02d0-11e9-9d34-8c16451d917b + :parametrized: yes + :setup: Replication with two masters. + :steps: 1. Add user to Master1 without jpegphoto attribute. + 2. Add jpegphoto attribute to user. + 3. Check if only one jpegphoto attribute exist. + 4. Check if operational attribute vucsn exist. + 5. Add second jpegphoto attribute to user. + 6. Check if two jpegphoto attributes exist. + 7. Check if operational attribute vucsn exist. + 8. Add third jpegphoto attribute to user. + 9. Check if three jpegphoto attributes exist. + 10. Check if operational attribute vucsn exist. + 11. Replace jpegphoto attribute for the user. + 12. Check if only one jpegphoto attribute exist. + 13. Check if operational attribute adcsn exist. + 14. Delete jpegphoto attribute for the user. + 15. Check if no jpegphoto attribute exist. + 16. Check if no operational attribute vdcsn exist. + :expectedresults: + 1. Add user to M1 should PASS. + 2. Adding jpegphoto attribute should PASS + 3. Only one jpegphoto attribute should be present. + 4. Vucsn attribute should be present. + 5. Adding a new jpegphoto attribute should PASS + 6. Two jpegphoto attribute should be present. + 7. Vucsn attribute should be present. + 8. Adding a new jpegphoto attribute should PASS + 9. Three jpegphoto attribute should be present. + 10. Vucsn attribute should be present. + 11. Replacing new jpegphoto attribute should PASS + 12. Only one jpegphoto attribute should be present. + 13. Adcsn attribute should be present. + 14. Deleting jpegphoto attribute should PASS + 15. No jpegphoto attribute should be present. + 16. Vdcsn attribute should be present. + """ + + test_entry = 'testJpeg1usr' + log.info('Add user: {}'.format(test_entry)) + users = UserAccounts(topo.ms['master1'], DEFAULT_SUFFIX) + try: + tuser = users.get(test_entry) + except ldap.NO_SUCH_OBJECT: + USER_PROPERTIES.update(dict.fromkeys(['uid', 'cn'], test_entry)) + tuser = users.create(properties=USER_PROPERTIES) + + tuser.set(attr_name, attr_value, eval(oper_type)) + log.info('Check if list of jpeg attributes are present for a given entry') + assert sorted([i.decode() for i in tuser.get_attr_vals(attr_name)]) == sorted(exp_values) + log.info('Checking if operational attributes are present for cn') + _check_user_oper_attrs(topo, tuser, attr_name, attr_value, oper_type, exp_values, oper_attr) + + +if __name__ == "__main__": + # Run isolated + # -s for DEBUG mode + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s -v %s" % CURRENT_FILE) diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/syntax/mr_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/syntax/mr_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/syntax/mr_test.py 2020-04-16 12:56:51.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/syntax/mr_test.py 2020-05-29 20:19:44.000000000 +0000 @@ -1,8 +1,17 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2020 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- +# + import logging import pytest import os import ldap -from lib389.dbgen import dbgen +from lib389.dbgen import dbgen_users from lib389._constants import * from lib389.topologies import topology_st as topo from lib389._controls import SSSRequestControl @@ -33,7 +42,7 @@ log.info("Creating LDIF...") ldif_dir = topo.standalone.get_ldif_dir() ldif_file = os.path.join(ldif_dir, 'mr-crash.ldif') - dbgen(topo.standalone, 5, ldif_file, DEFAULT_SUFFIX) + dbgen_users(topo.standalone, 5, ldif_file, DEFAULT_SUFFIX) log.info("Importing LDIF...") topo.standalone.stop() diff -Nru 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/tls/ssl_version_test.py 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/tls/ssl_version_test.py --- 389-ds-base-1.4.3.6/dirsrvtests/tests/suites/tls/ssl_version_test.py 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/dirsrvtests/tests/suites/tls/ssl_version_test.py 2020-05-26 18:13:23.000000000 +0000 @@ -19,10 +19,12 @@ 1. Get current default range 2. Set sslVersionMin and verify it is applied after a restart 3. Set sslVersionMax and verify it is applied after a restart + 4. Sanity test all the min/max versions :expectedresults: 1. Success 2. Success 3. Success + 4. Success """ topo.standalone.enable_tls() @@ -47,6 +49,16 @@ max = enc.get_attr_val_utf8('sslVersionMax') assert max == default_min + # Sanity test all the min/max versions + for attr, versions in [('sslVersionMin', ['TLS1.0', 'TLS1.1', 'TLS1.2', 'TLS1.0']), + ('sslVersionMax', ['TLS1.0', 'TLS1.1', 'TLS1.2'])]: + for version in versions: + # Test that the setting is correctly applied after a restart + enc.replace(attr, version) + topo.standalone.restart() + current_val = enc.get_attr_val_utf8(attr) + assert current_val == version + if __name__ == '__main__': # Run isolated diff -Nru 389-ds-base-1.4.3.6/ldap/admin/src/defaults.inf.in 389-ds-base-1.4.4.3/ldap/admin/src/defaults.inf.in --- 389-ds-base-1.4.3.6/ldap/admin/src/defaults.inf.in 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/admin/src/defaults.inf.in 2020-05-29 20:19:44.000000000 +0000 @@ -58,7 +58,7 @@ audit_log = @localstatedir@/log/dirsrv/slapd-{instance_name}/audit error_log = @localstatedir@/log/dirsrv/slapd-{instance_name}/errors db_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/db -db_home_dir = /dev/shm/dirsrv/slapd-{instance_name} +db_home_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/db backup_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/bak ldif_dir = @localstatedir@/lib/dirsrv/slapd-{instance_name}/ldif diff -Nru 389-ds-base-1.4.3.6/ldap/admin/src/scripts/DSCreate.pm.in 389-ds-base-1.4.4.3/ldap/admin/src/scripts/DSCreate.pm.in --- 389-ds-base-1.4.3.6/ldap/admin/src/scripts/DSCreate.pm.in 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/admin/src/scripts/DSCreate.pm.in 2020-05-29 20:19:44.000000000 +0000 @@ -954,7 +954,7 @@ } if (!defined($inf->{slapd}->{db_home_dir})) { - $inf->{slapd}->{db_home_dir} = "/dev/shm/@PACKAGE_NAME@/slapd-$servid"; + $inf->{slapd}->{db_home_dir} = $inf->{slapd}->{db_dir}; } if (!defined($inf->{slapd}->{bak_dir})) { diff -Nru 389-ds-base-1.4.3.6/ldap/admin/src/scripts/ds-replcheck 389-ds-base-1.4.4.3/ldap/admin/src/scripts/ds-replcheck --- 389-ds-base-1.4.3.6/ldap/admin/src/scripts/ds-replcheck 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/admin/src/scripts/ds-replcheck 2020-05-26 18:13:23.000000000 +0000 @@ -1,7 +1,7 @@ #!/usr/bin/python3 # --- BEGIN COPYRIGHT BLOCK --- -# Copyright (C) 2018 Red Hat, Inc. +# Copyright (C) 2020 Red Hat, Inc. # All rights reserved. # # License: GPL (version 3 or any later version). @@ -21,10 +21,9 @@ import signal from ldif import LDIFRecordList from ldap.ldapobject import SimpleLDAPObject -from ldap.cidict import cidict from ldap.controls import SimplePagedResultsControl from lib389._entry import Entry -from lib389.utils import ensure_str, ensure_list_str, ensure_int +from lib389.utils import ensure_list_str, ensure_int VERSION = "2.0" RUV_FILTER = '(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))' @@ -185,11 +184,11 @@ report = True if 'nscpentrywsi' in entry.data: - found = False for val in entry.data['nscpentrywsi']: if val.lower().startswith(attr + ';'): if (opts['starttime'] - extract_time(val)) <= opts['lag']: report = False + break return report @@ -321,6 +320,9 @@ count = 0 ignore_list = ['conflictcsn', 'modifytimestamp', 'modifiersname'] val = "" + attr = "" + state_attr = "" + part_dn = "" result['entry'] = None result['conflict'] = None result['tombstone'] = False @@ -570,6 +572,7 @@ if val.lower().startswith(mattr + ';'): if not found: diff['diff'].append(" Master:") + diff['diff'].append(" - Value: %s" % (val.split(':')[1].lstrip())) diff['diff'].append(" - State Info: %s" % (val)) diff['diff'].append(" - Date: %s\n" % (time.ctime(extract_time(val)))) found = True @@ -588,6 +591,7 @@ if val.lower().startswith(mattr + ';'): if not found: diff['diff'].append(" Replica:") + diff['diff'].append(" - Value: %s" % (val.split(':')[1].lstrip())) diff['diff'].append(" - State Info: %s" % (val)) diff['diff'].append(" - Date: %s\n" % (time.ctime(extract_time(val)))) found = True @@ -654,7 +658,6 @@ rconflicts = [] rtombstones = 0 mtombstones = 0 - idx = 0 # Open LDIF files try: @@ -926,7 +929,7 @@ :return - True if suffix exists, otherwise False """ try: - master_basesuffix = ldapnode.search_s(suffix, ldap.SCOPE_BASE ) + ldapnode.search_s(suffix, ldap.SCOPE_BASE) except ldap.NO_SUCH_OBJECT: print("Error: Failed to validate suffix in {}. {} does not exist.".format(hostname, suffix)) return False @@ -968,12 +971,12 @@ replica = SimpleLDAPObject(ruri) # Set timeouts - master.set_option(ldap.OPT_NETWORK_TIMEOUT,5.0) - master.set_option(ldap.OPT_TIMEOUT,5.0) - replica.set_option(ldap.OPT_NETWORK_TIMEOUT,5.0) - replica.set_option(ldap.OPT_TIMEOUT,5.0) + master.set_option(ldap.OPT_NETWORK_TIMEOUT, opts['timeout']) + master.set_option(ldap.OPT_TIMEOUT, opts['timeout']) + replica.set_option(ldap.OPT_NETWORK_TIMEOUT, opts['timeout']) + replica.set_option(ldap.OPT_TIMEOUT, opts['timeout']) - # Setup Secure Conenction + # Setup Secure Connection if opts['certdir'] is not None: # Setup Master if opts['mprotocol'] != LDAPI: @@ -1003,7 +1006,7 @@ try: master.simple_bind_s(opts['binddn'], opts['bindpw']) except ldap.SERVER_DOWN as e: - print("Cannot connect to %r" % muri) + print(f"Cannot connect to {muri} ({str(e)})") sys.exit(1) except ldap.LDAPError as e: print("Error: Failed to authenticate to Master: ({}). " @@ -1014,7 +1017,7 @@ try: replica.simple_bind_s(opts['binddn'], opts['bindpw']) except ldap.SERVER_DOWN as e: - print("Cannot connect to %r" % ruri) + print(f"Cannot connect to {ruri} ({str(e)})") sys.exit(1) except ldap.LDAPError as e: print("Error: Failed to authenticate to Replica: ({}). " @@ -1218,7 +1221,6 @@ """ m_done = False r_done = False - done = False report = {} report['diff'] = [] report['m_missing'] = [] @@ -1257,15 +1259,22 @@ # Read the results and start comparing while not m_done or not r_done: - if not m_done: - m_rtype, m_rdata, m_rmsgid, m_rctrls = master.result3(master_msgid) - elif not r_done: - m_rdata = [] - - if not r_done: - r_rtype, r_rdata, r_rmsgid, r_rctrls = replica.result3(replica_msgid) - elif not m_done: - r_rdata = [] + try: + if not m_done: + m_rtype, m_rdata, m_rmsgid, m_rctrls = master.result3(master_msgid) + elif not r_done: + m_rdata = [] + except ldap.LDAPError as e: + print("Error: Problem getting the results from the master: %s", str(e)) + sys.exit(1) + try: + if not r_done: + r_rtype, r_rdata, r_rmsgid, r_rctrls = replica.result3(replica_msgid) + elif not m_done: + r_rdata = [] + except ldap.LDAPError as e: + print("Error: Problem getting the results from the replica: %s", str(e)) + sys.exit(1) # Convert entries mresult = convert_entries(m_rdata) @@ -1291,11 +1300,15 @@ ] if m_pctrls: if m_pctrls[0].cookie: - # Copy cookie from response control to request control - req_pr_ctrl.cookie = m_pctrls[0].cookie - master_msgid = master.search_ext(opts['suffix'], ldap.SCOPE_SUBTREE, - "(|(objectclass=*)(objectclass=ldapsubentry))", - ['*', 'createtimestamp', 'nscpentrywsi', 'conflictcsn', 'nsds5replconflict'], serverctrls=controls) + try: + # Copy cookie from response control to request control + req_pr_ctrl.cookie = m_pctrls[0].cookie + master_msgid = master.search_ext(opts['suffix'], ldap.SCOPE_SUBTREE, + "(|(objectclass=*)(objectclass=ldapsubentry))", + ['*', 'createtimestamp', 'nscpentrywsi', 'conflictcsn', 'nsds5replconflict'], serverctrls=controls) + except ldap.LDAPError as e: + print("Error: Problem searching the master: %s", str(e)) + sys.exit(1) else: m_done = True # No more pages available else: @@ -1311,11 +1324,15 @@ if r_pctrls: if r_pctrls[0].cookie: - # Copy cookie from response control to request control - req_pr_ctrl.cookie = r_pctrls[0].cookie - replica_msgid = replica.search_ext(opts['suffix'], ldap.SCOPE_SUBTREE, - "(|(objectclass=*)(objectclass=ldapsubentry))", - ['*', 'createtimestamp', 'nscpentrywsi', 'conflictcsn', 'nsds5replconflict'], serverctrls=controls) + try: + # Copy cookie from response control to request control + req_pr_ctrl.cookie = r_pctrls[0].cookie + replica_msgid = replica.search_ext(opts['suffix'], ldap.SCOPE_SUBTREE, + "(|(objectclass=*)(objectclass=ldapsubentry))", + ['*', 'createtimestamp', 'nscpentrywsi', 'conflictcsn', 'nsds5replconflict'], serverctrls=controls) + except ldap.LDAPError as e: + print("Error: Problem searching the replica: %s", str(e)) + sys.exit(1) else: r_done = True # No more pages available else: @@ -1426,6 +1443,9 @@ # prompt for password opts['bindpw'] = getpass.getpass('Enter password: ') + # lastly handle the timeout + opts['timeout'] = int(args.timeout) + return opts @@ -1553,6 +1573,8 @@ state_parser.add_argument('-y', '--pass-file', help='A text file containing the clear text password for the bind dn', dest='pass_file', default=None) state_parser.add_argument('-Z', '--cert-dir', help='The certificate database directory for secure connections', dest='certdir', default=None) + state_parser.add_argument('-t', '--timeout', help='The timeout for the LDAP connections. Default is no timeout.', + type=int, dest='timeout', default=-1) # Online mode online_parser = subparsers.add_parser('online', help="Compare two online replicas for differences") @@ -1577,6 +1599,8 @@ online_parser.add_argument('-p', '--page-size', help='The paged-search result grouping size (default 500 entries)', dest='pagesize', default=500) online_parser.add_argument('-o', '--out-file', help='The output file', dest='file', default=None) + online_parser.add_argument('-t', '--timeout', help='The timeout for the LDAP connections. Default is no timeout.', + type=int, dest='timeout', default=-1) # Offline LDIF mode offline_parser = subparsers.add_parser('offline', help="Compare two replication LDIF files for differences (LDIF file generated by 'db2ldif -r')") diff -Nru 389-ds-base-1.4.3.6/ldap/schema/01core389.ldif 389-ds-base-1.4.4.3/ldap/schema/01core389.ldif --- 389-ds-base-1.4.3.6/ldap/schema/01core389.ldif 2020-04-16 14:16:36.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/schema/01core389.ldif 2020-05-29 20:19:44.000000000 +0000 @@ -315,8 +315,9 @@ attributeTypes: ( 2.16.840.1.113730.3.1.2364 NAME 'nsds5replicaLastInitStatusJSON' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' ) attributeTypes: ( 2.16.840.1.113730.3.1.2365 NAME 'nsds5replicaLastUpdateStatusJSON' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' ) attributeTypes: ( 2.16.840.1.113730.3.1.2367 NAME 'nsslapd-libPath' DESC 'Rewriter shared library path' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' ) -attributeTypes: ( 2.16.840.1.113730.3.1.2368 NAME 'nsslapd-filterrewriter' DESC 'Filter rewriter function name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' ) -attributeTypes: ( 2.16.840.1.113730.3.1.2369 NAME 'nsslapd-returnedAttrRewriter' DESC 'Returned attribute rewriter function name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' ) +attributeTypes: ( 2.16.840.1.113730.3.1.2368 NAME 'nsslapd-filterrewriter' DESC 'Filter rewriter function name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' ) +attributeTypes: ( 2.16.840.1.113730.3.1.2369 NAME 'nsslapd-returnedAttrRewriter' DESC 'Returned attribute rewriter function name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' ) +attributeTypes: ( 2.16.840.1.113730.3.1.2370 NAME 'nsslapd-enable-upgrade-hash' DESC 'Upgrade password hash on bind' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' ) # # objectclasses # diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_config.c 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_config.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_config.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_config.c 2020-05-26 18:13:23.000000000 +0000 @@ -37,6 +37,7 @@ int acct_policy_load_config_startup(Slapi_PBlock *pb __attribute__((unused)), void *plugin_id) { + Slapi_PBlock *entry_pb = NULL; acctPluginCfg *newcfg; Slapi_Entry *config_entry = NULL; Slapi_DN *config_sdn = NULL; @@ -44,8 +45,7 @@ /* Retrieve the config entry */ config_sdn = slapi_sdn_new_normdn_byref(PLUGIN_CONFIG_DN); - rc = slapi_search_internal_get_entry(config_sdn, NULL, &config_entry, - plugin_id); + rc = slapi_search_get_entry(&entry_pb, config_sdn, NULL, &config_entry, plugin_id); slapi_sdn_free(&config_sdn); if (rc != LDAP_SUCCESS || config_entry == NULL) { @@ -60,7 +60,7 @@ rc = acct_policy_entry2config(config_entry, newcfg); config_unlock(); - slapi_entry_free(config_entry); + slapi_search_get_entry_done(&entry_pb); return (rc); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_plugin.c 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_plugin.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_plugin.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_plugin.c 2020-05-26 18:13:23.000000000 +0000 @@ -209,6 +209,7 @@ int acct_bind_preop(Slapi_PBlock *pb) { + Slapi_PBlock *entry_pb = NULL; const char *dn = NULL; Slapi_DN *sdn = NULL; Slapi_Entry *target_entry = NULL; @@ -236,8 +237,7 @@ goto done; } - ldrc = slapi_search_internal_get_entry(sdn, NULL, &target_entry, - plugin_id); + ldrc = slapi_search_get_entry(&entry_pb, sdn, NULL, &target_entry, plugin_id); /* There was a problem retrieving the entry */ if (ldrc != LDAP_SUCCESS) { @@ -275,7 +275,7 @@ slapi_send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, NULL, 0, NULL); } - slapi_entry_free(target_entry); + slapi_search_get_entry_done(&entry_pb); free_acctpolicy(&policy); @@ -293,6 +293,7 @@ int acct_bind_postop(Slapi_PBlock *pb) { + Slapi_PBlock *entry_pb = NULL; char *dn = NULL; int ldrc, tracklogin = 0; int rc = 0; /* Optimistic default */ @@ -327,8 +328,7 @@ covered by an account policy to decide whether we should track */ if (tracklogin == 0) { sdn = slapi_sdn_new_normdn_byref(dn); - ldrc = slapi_search_internal_get_entry(sdn, NULL, &target_entry, - plugin_id); + ldrc = slapi_search_get_entry(&entry_pb, sdn, NULL, &target_entry, plugin_id); if (ldrc != LDAP_SUCCESS) { slapi_log_err(SLAPI_LOG_ERR, POST_PLUGIN_NAME, @@ -355,7 +355,7 @@ slapi_send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, NULL, 0, NULL); } - slapi_entry_free(target_entry); + slapi_search_get_entry_done(&entry_pb); slapi_sdn_free(&sdn); @@ -370,11 +370,11 @@ static int acct_pre_op(Slapi_PBlock *pb, int modop) { + Slapi_PBlock *entry_pb = NULL; Slapi_DN *sdn = 0; Slapi_Entry *e = 0; Slapi_Mods *smods = 0; LDAPMod **mods; - int free_entry = 0; char *errstr = NULL; int ret = SLAPI_PLUGIN_SUCCESS; @@ -384,28 +384,25 @@ if (acct_policy_dn_is_config(sdn)) { /* Validate config changes, but don't apply them. - * This allows us to reject invalid config changes - * here at the pre-op stage. Applying the config - * needs to be done at the post-op stage. */ + * This allows us to reject invalid config changes + * here at the pre-op stage. Applying the config + * needs to be done at the post-op stage. */ if (LDAP_CHANGETYPE_ADD == modop) { slapi_pblock_get(pb, SLAPI_ADD_ENTRY, &e); - /* If the entry doesn't exist, just bail and - * let the server handle it. */ + /* If the entry doesn't exist, just bail and let the server handle it. */ if (e == NULL) { goto bail; } } else if (LDAP_CHANGETYPE_MODIFY == modop) { /* Fetch the entry being modified so we can - * create the resulting entry for validation. */ + * create the resulting entry for validation. */ if (sdn) { - slapi_search_internal_get_entry(sdn, 0, &e, get_identity()); - free_entry = 1; + slapi_search_get_entry(&entry_pb, sdn, 0, &e, get_identity()); } - /* If the entry doesn't exist, just bail and - * let the server handle it. */ + /* If the entry doesn't exist, just bail and let the server handle it. */ if (e == NULL) { goto bail; } @@ -418,7 +415,7 @@ /* Apply the mods to create the resulting entry. */ if (mods && (slapi_entry_apply_mods(e, mods) != LDAP_SUCCESS)) { /* The mods don't apply cleanly, so we just let this op go - * to let the main server handle it. */ + * to let the main server handle it. */ goto bailmod; } } else if (modop == LDAP_CHANGETYPE_DELETE) { @@ -439,8 +436,7 @@ } bail: - if (free_entry && e) - slapi_entry_free(e); + slapi_search_get_entry_done(&entry_pb); if (ret) { slapi_log_err(SLAPI_LOG_PLUGIN, PRE_PLUGIN_NAME, diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_util.c 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_util.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/acctpolicy/acct_util.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/acctpolicy/acct_util.c 2020-05-26 18:13:23.000000000 +0000 @@ -85,6 +85,7 @@ int get_acctpolicy(Slapi_PBlock *pb __attribute__((unused)), Slapi_Entry *target_entry, void *plugin_id, acctPolicy **policy) { + Slapi_PBlock *entry_pb = NULL; Slapi_DN *sdn = NULL; Slapi_Entry *policy_entry = NULL; Slapi_Attr *attr; @@ -123,8 +124,7 @@ } sdn = slapi_sdn_new_dn_byref(policy_dn); - ldrc = slapi_search_internal_get_entry(sdn, NULL, &policy_entry, - plugin_id); + ldrc = slapi_search_get_entry(&entry_pb, sdn, NULL, &policy_entry, plugin_id); slapi_sdn_free(&sdn); /* There should be a policy but it can't be retrieved; fatal error */ @@ -160,7 +160,7 @@ done: config_unlock(); slapi_ch_free_string(&policy_dn); - slapi_entry_free(policy_entry); + slapi_search_get_entry_done(&entry_pb); return (rc); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/acl/aclparse.c 389-ds-base-1.4.4.3/ldap/servers/plugins/acl/aclparse.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/acl/aclparse.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/acl/aclparse.c 2020-05-29 20:19:44.000000000 +0000 @@ -34,6 +34,10 @@ static int type_compare(Slapi_Filter *f, void *arg); static int acl_check_for_target_macro(aci_t *aci_item, char *value); static int get_acl_rights_as_int(char *strValue); + +/* Enforce strict aci syntax */ +#define STRICT_SYNTAX_CHECK 0 + /*************************************************************************** * * acl_parse @@ -306,15 +310,30 @@ if (NULL == tmpstr) { return ACL_SYNTAX_ERR; } + tmpstr++; + /* Consecutive equals are not allowed */ + if (*tmpstr == '=') { + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target filter has an invalid syntax, " + "do not use more than one '=' between the targetfilter keyword and its value: (%s)\n", + str); + return ACL_SYNTAX_ERR; + } __acl_strip_leading_space(&tmpstr); + /* The first character is expected to be a double quote */ + if (STRICT_SYNTAX_CHECK && *tmpstr != '"') { + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target filter has an invalid value (%s)\n", str); + return ACL_SYNTAX_ERR; + } + /* * Trim off enclosing quotes and enclosing * superfluous brackets. * The result has been duped so it can be kept. - */ - + */ tmpstr = __acl_trim_filterstr(tmpstr); f = slapi_str2filter(tmpstr); @@ -323,9 +342,10 @@ aci_item->targetFilterStr = tmpstr; } else if ((strncmp(str, aci_target_to, target_to_len) == 0) || (strncmp(str, aci_target_from, target_from_len) == 0)) { - /* This is important to make this test before aci_targetdn - * because aci_targetdn also match aci_target_to/aci_target_from - * */ + /* + * This is important to make this test before aci_targetdn + * because aci_targetdn also match aci_target_to/aci_target_from + */ char *tstr = NULL; size_t LDAP_URL_prefix_len = 0; size_t tmplen = 0; @@ -348,9 +368,24 @@ strncpy(s, single_space, 1); } if ((s = strchr(str, '=')) != NULL) { - value = s + 1; + s++; + if (*s == '=') { + /* Consecutive equals are not allowed */ + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target to/from has an invalid syntax, " + "do not use more than one '=' between the target to/from keyword and its value: (%s)\n", + str); + return ACL_SYNTAX_ERR; + } + value = s; __acl_strip_leading_space(&value); __acl_strip_trailing_space(value); + /* The first character is expected to be a double quote */ + if (STRICT_SYNTAX_CHECK && *value != '"') { + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target to/from has an invalid value (%s)\n", str); + return ACL_SYNTAX_ERR; + } len = strlen(value); /* strip double quotes */ if (*value == '"' && value[len - 1] == '"') { @@ -401,9 +436,24 @@ strncpy(s, single_space, 1); } if ((s = strchr(str, '=')) != NULL) { - value = s + 1; + s++; + if (*s == '=') { + /* Consecutive equals are not allowed */ + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target has an invalid syntax, " + "do not use more than one '=' between the target keyword and its value: (%s)\n", + str); + return ACL_SYNTAX_ERR; + } + value = s; __acl_strip_leading_space(&value); __acl_strip_trailing_space(value); + /* The first character is expected to be a double quote */ + if (STRICT_SYNTAX_CHECK && *value != '"') { + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__parse_aci - target has an invalid value (%s)\n", str); + return ACL_SYNTAX_ERR; + } len = strlen(value); /* strip double quotes */ if (*value == '"' && value[len - 1] == '"') { @@ -1501,14 +1551,22 @@ return ACL_SYNTAX_ERR; } s++; + if (*s == '=') { + /* Consecutive equals are not allowed */ + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__init_targetattr - targetattr has an invalid syntax, " + "do not use more than one '=' between the targetattr and its value: (%s)\n", + attr_val); + return ACL_SYNTAX_ERR; + } __acl_strip_leading_space(&s); __acl_strip_trailing_space(s); len = strlen(s); - /* Simple targetattr statements may not be quoted e.g. - targetattr=* or targetattr=userPassword - if it begins with a quote, it must end with one as well - */ + /* + * If it begins with a quote, it must end with one as well + */ if (*s == '"') { + if (s[len - 1] == '"') { s[len - 1] = '\0'; /* trim trailing quote */ } else { @@ -1526,6 +1584,11 @@ return ACL_SYNTAX_ERR; } s++; /* skip leading quote */ + } else if (STRICT_SYNTAX_CHECK) { + /* The first character is expected to be a double quote */ + slapi_log_err(SLAPI_LOG_ERR, plugin_name, + "__aclp__init_targetattr - targetattr has an invalid value (%s)\n", attr_val); + return ACL_SYNTAX_ERR; } str = s; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/automember/automember.c 389-ds-base-1.4.4.3/ldap/servers/plugins/automember/automember.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/automember/automember.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/automember/automember.c 2020-05-26 18:13:23.000000000 +0000 @@ -1629,13 +1629,12 @@ char *member_value = NULL; int rc = 0; Slapi_DN *group_sdn; - Slapi_Entry *group_entry = NULL; /* First thing check that the group still exists */ group_sdn = slapi_sdn_new_dn_byval(group_dn); - rc = slapi_search_internal_get_entry(group_sdn, NULL, &group_entry, automember_get_plugin_id()); + rc = slapi_search_internal_get_entry(group_sdn, NULL, NULL, automember_get_plugin_id()); slapi_sdn_free(&group_sdn); - if (rc != LDAP_SUCCESS || group_entry == NULL) { + if (rc != LDAP_SUCCESS) { if (rc == LDAP_NO_SUCH_OBJECT) { /* the automember group (default or target) does not exist, just skip this definition */ slapi_log_err(SLAPI_LOG_INFO, AUTOMEMBER_PLUGIN_SUBSYSTEM, @@ -1647,10 +1646,8 @@ "automember_update_member_value - group (default or target) can not be retrieved (%s) err=%d\n", group_dn, rc); } - slapi_entry_free(group_entry); return rc; } - slapi_entry_free(group_entry); /* If grouping_value is dn, we need to fetch the dn instead. */ if (slapi_attr_type_cmp(grouping_value, "dn", SLAPI_TYPE_CMP_EXACT) == 0) { @@ -1752,11 +1749,11 @@ static int automember_pre_op(Slapi_PBlock *pb, int modop) { + Slapi_PBlock *entry_pb = NULL; Slapi_DN *sdn = 0; Slapi_Entry *e = 0; Slapi_Mods *smods = 0; LDAPMod **mods; - int free_entry = 0; char *errstr = NULL; int ret = SLAPI_PLUGIN_SUCCESS; @@ -1784,8 +1781,7 @@ /* Fetch the entry being modified so we can * create the resulting entry for validation. */ if (sdn) { - slapi_search_internal_get_entry(sdn, 0, &e, automember_get_plugin_id()); - free_entry = 1; + slapi_search_get_entry(&entry_pb, sdn, 0, &e, automember_get_plugin_id()); } /* If the entry doesn't exist, just bail and @@ -1799,7 +1795,7 @@ smods = slapi_mods_new(); slapi_mods_init_byref(smods, mods); - /* Apply the mods to create the resulting entry. */ + /* Apply the mods to create the resulting entry. */ if (mods && (slapi_entry_apply_mods(e, mods) != LDAP_SUCCESS)) { /* The mods don't apply cleanly, so we just let this op go * to let the main server handle it. */ @@ -1831,8 +1827,7 @@ } bail: - if (free_entry && e) - slapi_entry_free(e); + slapi_search_get_entry_done(&entry_pb); if (ret) { slapi_log_err(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/dna/dna.c 389-ds-base-1.4.4.3/ldap/servers/plugins/dna/dna.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/dna/dna.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/dna/dna.c 2020-05-26 18:13:23.000000000 +0000 @@ -1178,7 +1178,6 @@ value = slapi_entry_attr_get_charptr(e, DNA_SHARED_CFG_DN); if (value) { - Slapi_Entry *shared_e = NULL; Slapi_DN *sdn = NULL; char *normdn = NULL; char *attrs[2]; @@ -1197,10 +1196,8 @@ /* We don't need attributes */ attrs[0] = "cn"; attrs[1] = NULL; - slapi_search_internal_get_entry(sdn, attrs, &shared_e, getPluginID()); - /* Make sure that the shared config entry exists. */ - if (!shared_e) { + if(slapi_search_internal_get_entry(sdn, attrs, NULL, getPluginID()) != LDAP_SUCCESS) { /* We didn't locate the shared config container entry. Log * a message and skip this config entry. */ slapi_log_err(SLAPI_LOG_ERR, DNA_PLUGIN_SUBSYSTEM, @@ -1210,9 +1207,6 @@ ret = DNA_FAILURE; slapi_sdn_free(&sdn); goto bail; - } else { - slapi_entry_free(shared_e); - shared_e = NULL; } normdn = (char *)slapi_sdn_get_dn(sdn); @@ -1539,6 +1533,7 @@ static int dna_load_host_port(void) { + Slapi_PBlock *pb = NULL; int status = DNA_SUCCESS; Slapi_Entry *e = NULL; Slapi_DN *config_dn = NULL; @@ -1554,7 +1549,7 @@ config_dn = slapi_sdn_new_ndn_byref("cn=config"); if (config_dn) { - slapi_search_internal_get_entry(config_dn, attrs, &e, getPluginID()); + slapi_search_get_entry(&pb, config_dn, attrs, &e, getPluginID()); slapi_sdn_free(&config_dn); } @@ -1562,8 +1557,8 @@ hostname = slapi_entry_attr_get_charptr(e, "nsslapd-localhost"); portnum = slapi_entry_attr_get_charptr(e, "nsslapd-port"); secureportnum = slapi_entry_attr_get_charptr(e, "nsslapd-secureport"); - slapi_entry_free(e); } + slapi_search_get_entry_done(&pb); if (!hostname || !portnum) { status = DNA_FAILURE; @@ -2876,6 +2871,7 @@ static int dna_is_replica_bind_dn(char *range_dn, char *bind_dn) { + Slapi_PBlock *entry_pb = NULL; char *replica_dn = NULL; Slapi_DN *replica_sdn = NULL; Slapi_DN *range_sdn = NULL; @@ -2912,8 +2908,7 @@ attrs[2] = 0; /* Find cn=replica entry via search */ - slapi_search_internal_get_entry(replica_sdn, attrs, &e, getPluginID()); - + slapi_search_get_entry(&entry_pb, replica_sdn, attrs, &e, getPluginID()); if (e) { /* Check if the passed in bind dn matches any of the replica bind dns. */ Slapi_Value *bind_dn_sv = slapi_value_new_string(bind_dn); @@ -2927,6 +2922,7 @@ attrs[0] = "member"; attrs[1] = "uniquemember"; attrs[2] = 0; + slapi_search_get_entry_done(&entry_pb); for (i = 0; bind_group_dn != NULL && bind_group_dn[i] != NULL; i++) { if (ret) { /* already found a member, just free group */ @@ -2934,14 +2930,14 @@ continue; } bind_group_sdn = slapi_sdn_new_normdn_passin(bind_group_dn[i]); - slapi_search_internal_get_entry(bind_group_sdn, attrs, &bind_group_entry, getPluginID()); + slapi_search_get_entry(&entry_pb, bind_group_sdn, attrs, &bind_group_entry, getPluginID()); if (bind_group_entry) { ret = slapi_entry_attr_has_syntax_value(bind_group_entry, "member", bind_dn_sv); if (ret == 0) { ret = slapi_entry_attr_has_syntax_value(bind_group_entry, "uniquemember", bind_dn_sv); } } - slapi_entry_free(bind_group_entry); + slapi_search_get_entry_done(&entry_pb); slapi_sdn_free(&bind_group_sdn); } slapi_ch_free((void **)&bind_group_dn); @@ -2956,7 +2952,6 @@ } done: - slapi_entry_free(e); slapi_sdn_free(&range_sdn); slapi_sdn_free(&replica_sdn); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/memberof/memberof.c 389-ds-base-1.4.4.3/ldap/servers/plugins/memberof/memberof.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/memberof/memberof.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/memberof/memberof.c 2020-05-26 18:13:23.000000000 +0000 @@ -884,7 +884,7 @@ pre_sdn = slapi_entry_get_sdn(pre_e); post_sdn = slapi_entry_get_sdn(post_e); } - + if (pre_sdn && post_sdn && slapi_sdn_compare(pre_sdn, post_sdn) == 0) { /* Regarding memberof plugin, this rename is a no-op * but it can be expensive to process it. So skip it @@ -1466,6 +1466,7 @@ int memberof_modop_one_replace_r(Slapi_PBlock *pb, MemberOfConfig *config, int mod_op, Slapi_DN *group_sdn, Slapi_DN *op_this_sdn, Slapi_DN *replace_with_sdn, Slapi_DN *op_to_sdn, memberofstringll *stack) { + Slapi_PBlock *entry_pb = NULL; int rc = 0; LDAPMod mod; LDAPMod replace_mod; @@ -1515,8 +1516,7 @@ } /* determine if this is a group op or single entry */ - slapi_search_internal_get_entry(op_to_sdn, config->groupattrs, - &e, memberof_get_plugin_id()); + slapi_search_get_entry(&entry_pb, op_to_sdn, config->groupattrs, &e, memberof_get_plugin_id()); if (!e) { /* In the case of a delete, we need to worry about the * missing entry being a nested group. There's a small @@ -1751,7 +1751,7 @@ bail: slapi_value_free(&to_dn_val); slapi_value_free(&this_dn_val); - slapi_entry_free(e); + slapi_search_get_entry_done(&entry_pb); return rc; } @@ -2368,6 +2368,7 @@ int memberof_is_direct_member(MemberOfConfig *config, Slapi_Value *groupdn, Slapi_Value *memberdn) { + Slapi_PBlock *pb = NULL; int rc = 0; Slapi_DN *sdn = 0; Slapi_Entry *group_e = 0; @@ -2376,8 +2377,8 @@ sdn = slapi_sdn_new_normdn_byref(slapi_value_get_string(groupdn)); - slapi_search_internal_get_entry(sdn, config->groupattrs, - &group_e, memberof_get_plugin_id()); + slapi_search_get_entry(&pb, sdn, config->groupattrs, + &group_e, memberof_get_plugin_id()); if (group_e) { /* See if memberdn is referred to by any of the group attributes. */ @@ -2388,9 +2389,8 @@ break; } } - - slapi_entry_free(group_e); } + slapi_search_get_entry_done(&pb); slapi_sdn_free(&sdn); return rc; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/mep/mep.c 389-ds-base-1.4.4.3/ldap/servers/plugins/mep/mep.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/mep/mep.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/mep/mep.c 2020-05-26 18:13:23.000000000 +0000 @@ -2165,9 +2165,8 @@ if (e && free_entry) { slapi_entry_free(e); } - - slapi_search_internal_get_entry(sdn, 0, &e, mep_get_plugin_id()); - free_entry = 1; + slapi_pblock_get(pb, SLAPI_ENTRY_PRE_OP, &e); + free_entry = 0; } if (e && mep_is_managed_entry(e)) { diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptconfig.c 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptconfig.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptconfig.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptconfig.c 2020-05-26 18:13:23.000000000 +0000 @@ -749,22 +749,22 @@ if (pam_passthru_check_suffix(cfg, bind_sdn) == LDAP_SUCCESS) { if (cfg->slapi_filter) { /* A filter is configured, so see if the bind entry is a match. */ + Slapi_PBlock *entry_pb = NULL; Slapi_Entry *test_e = NULL; /* Fetch the bind entry */ - slapi_search_internal_get_entry(bind_sdn, NULL, &test_e, - pam_passthruauth_get_plugin_identity()); + slapi_search_get_entry(&entry_pb, bind_sdn, NULL, &test_e, + pam_passthruauth_get_plugin_identity()); /* If the entry doesn't exist, just fall through to the main server code */ if (test_e) { /* Evaluate the filter. */ if (LDAP_SUCCESS == slapi_filter_test_simple(test_e, cfg->slapi_filter)) { /* This is a match. */ - slapi_entry_free(test_e); + slapi_search_get_entry_done(&entry_pb); goto done; } - - slapi_entry_free(test_e); + slapi_search_get_entry_done(&entry_pb); } } else { /* There is no filter to check, so this is a match. */ diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptimpl.c 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptimpl.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptimpl.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptimpl.c 2020-05-26 18:13:23.000000000 +0000 @@ -81,11 +81,12 @@ static char * derive_from_bind_entry(Slapi_PBlock *pb, const Slapi_DN *bindsdn, MyStrBuf *pam_id, char *map_ident_attr, int *locked) { + Slapi_PBlock *entry_pb = NULL; Slapi_Entry *entry = NULL; char *attrs[] = {NULL, NULL}; attrs[0] = map_ident_attr; - int rc = slapi_search_internal_get_entry((Slapi_DN *)bindsdn, attrs, &entry, - pam_passthruauth_get_plugin_identity()); + int32_t rc = slapi_search_get_entry(&entry_pb, (Slapi_DN *)bindsdn, attrs, &entry, + pam_passthruauth_get_plugin_identity()); if (rc != LDAP_SUCCESS) { slapi_log_err(SLAPI_LOG_ERR, PAM_PASSTHRU_PLUGIN_SUBSYSTEM, @@ -108,7 +109,7 @@ init_my_str_buf(pam_id, val); } - slapi_entry_free(entry); + slapi_search_get_entry_done(&entry_pb); return pam_id->str; } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptpreop.c 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptpreop.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/pam_passthru/pam_ptpreop.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/pam_passthru/pam_ptpreop.c 2020-05-26 18:13:23.000000000 +0000 @@ -526,6 +526,7 @@ static int pam_passthru_preop(Slapi_PBlock *pb, int modtype) { + Slapi_PBlock *entry_pb = NULL; Slapi_DN *sdn = NULL; Slapi_Entry *e = NULL; LDAPMod **mods; @@ -555,8 +556,8 @@ case LDAP_CHANGETYPE_MODIFY: /* Fetch the entry being modified so we can * create the resulting entry for validation. */ - slapi_search_internal_get_entry(sdn, 0, &e, - pam_passthruauth_get_plugin_identity()); + slapi_search_get_entry(&entry_pb, sdn, 0, &e, + pam_passthruauth_get_plugin_identity()); /* If the entry doesn't exist, just bail and * let the server handle it. */ @@ -576,9 +577,6 @@ /* Don't bail here, as we need to free the entry. */ } } - - /* Free the entry. */ - slapi_entry_free(e); break; case LDAP_CHANGETYPE_DELETE: case LDAP_CHANGETYPE_MODDN: @@ -591,6 +589,7 @@ } bail: + slapi_search_get_entry_done(&entry_pb); /* If we are refusing the operation, return the result to the client. */ if (ret) { slapi_send_ldap_result(pb, ret, NULL, returntext, 0, NULL); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl5_api.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl5_api.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl5_api.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl5_api.c 2020-05-26 18:13:23.000000000 +0000 @@ -497,6 +497,7 @@ _cl5Close(); s_cl5Desc.dbState = CL5_STATE_CLOSED; + rc = clcrypt_destroy(s_cl5Desc.clcrypt_handle); slapi_rwlock_unlock(s_cl5Desc.stLock); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl5_config.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl5_config.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl5_config.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl5_config.c 2020-05-26 18:13:23.000000000 +0000 @@ -131,6 +131,9 @@ /* slapi_ch_free_string accepts NULL pointer */ slapi_ch_free_string(&config->maxAge); slapi_ch_free_string(&config->dir); + slapi_ch_free_string(&config->symmetricKey); + slapi_ch_free_string(&config->dbconfig.encryptionAlgorithm); + slapi_ch_free_string(&config->dbconfig.symmetricKey); } } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl_crypt.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl_crypt.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl_crypt.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl_crypt.c 2020-05-26 18:13:23.000000000 +0000 @@ -71,6 +71,51 @@ /* * return values: 0 - success + * : -1 - error + * + * output value: out: non-NULL - cl encryption state private freed + * : NULL - failure + */ +int +clcrypt_destroy(void *clcrypt_handle) +{ + int rc = -1; + char *cookie = NULL; + Slapi_Backend *be = NULL; + back_info_crypt_destroy crypt_destroy = {0}; + + slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name, + "-> clcrypt_destroy\n"); + if (NULL == clcrypt_handle) { + /* Nothing to free */ + rc = 0; + goto bail; + } + crypt_destroy.state_priv = clcrypt_handle; + + be = slapi_get_first_backend(&cookie); + while (be) { + rc = slapi_back_ctrl_info(be, BACK_INFO_CRYPT_DESTROY, + (void *)&crypt_destroy); + if (LDAP_SUCCESS == rc) { + break; /* Successfully freed */ + } + be = slapi_get_next_backend(cookie); + } + slapi_ch_free((void **)&cookie); + if (LDAP_SUCCESS == rc) { + rc = 0; + } else { + rc = -1; + } +bail: + slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name, + "<- clcrypt_destroy (returning %d)\n", rc); + return rc; +} + +/* + * return values: 0 - success * : 1 - no encryption * : -1 - error * diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl_crypt.h 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl_crypt.h --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/cl_crypt.h 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/cl_crypt.h 2020-05-26 18:13:23.000000000 +0000 @@ -19,6 +19,7 @@ #include "cert.h" int clcrypt_init(const CL5DBConfig *config, void **clcrypt_handle); +int clcrypt_destroy(void *clcrypt_handle); int clcrypt_encrypt_value(void *clcrypt_handle, struct berval *in, struct berval **out); int clcrypt_decrypt_value(void *state_priv, struct berval *in, struct berval **out); #endif /* _CLCRYPT_H_ */ diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5.h 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5.h --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5.h 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5.h 2020-05-29 20:19:44.000000000 +0000 @@ -280,15 +280,14 @@ int multimaster_extop_NSDS50ReplicationEntry(Slapi_PBlock *pb); /* From repl_globals.c */ -extern char *attr_changenumber; -extern char *attr_targetdn; -extern char *attr_changetype; -extern char *attr_newrdn; -extern char *attr_deleteoldrdn; -extern char *attr_changes; -extern char *attr_newsuperior; -extern char *attr_changetime; -extern char *attr_dataversion; +extern char *repl_changenumber; +extern char *repl_targetdn; +extern char *repl_changetype; +extern char *repl_newrdn; +extern char *repl_deleteoldrdn; +extern char *repl_changes; +extern char *repl_newsuperior; +extern char *repl_changetime; extern char *attr_csn; extern char *changetype_add; extern char *changetype_delete; @@ -777,7 +776,7 @@ int replica_start_agreement(Replica *r, Repl_Agmt *ra); int windows_replica_start_agreement(Replica *r, Repl_Agmt *ra); -CSN *replica_generate_next_csn(Slapi_PBlock *pb, const CSN *basecsn); +int32_t replica_generate_next_csn(Slapi_PBlock *pb, const CSN *basecsn, CSN **opcsn); int replica_get_attr(Slapi_PBlock *pb, const char *type, void *value); /* mapping tree extensions manipulation */ @@ -812,6 +811,11 @@ char *replGen; } cleanruv_purge_data; +typedef struct _csngen_test_data +{ + Slapi_Task *task; +} csngen_test_data; + /* In repl5_replica_config.c */ int replica_config_init(void); void replica_config_destroy(void); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_replica.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_replica.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_replica.c 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_replica.c 2020-05-26 18:13:23.000000000 +0000 @@ -3931,11 +3931,9 @@ * A callback function registered as op->o_csngen_handler and * called by backend ops to generate opcsn. */ -CSN * -replica_generate_next_csn(Slapi_PBlock *pb, const CSN *basecsn) +int32_t +replica_generate_next_csn(Slapi_PBlock *pb, const CSN *basecsn, CSN **opcsn) { - CSN *opcsn = NULL; - Replica *replica = replica_get_replica_for_op(pb); if (NULL != replica) { Slapi_Operation *op; @@ -3946,17 +3944,26 @@ CSNGen *gen = (CSNGen *)object_get_data(gen_obj); if (NULL != gen) { /* The new CSN should be greater than the base CSN */ - csngen_new_csn(gen, &opcsn, PR_FALSE /* don't notify */); - if (csn_compare(opcsn, basecsn) <= 0) { - char opcsnstr[CSN_STRSIZE], basecsnstr[CSN_STRSIZE]; + if (csngen_new_csn(gen, opcsn, PR_FALSE /* don't notify */) != CSN_SUCCESS) { + /* Failed to generate CSN we must abort */ + object_release(gen_obj); + return -1; + } + if (csn_compare(*opcsn, basecsn) <= 0) { + char opcsnstr[CSN_STRSIZE]; + char basecsnstr[CSN_STRSIZE]; char opcsn2str[CSN_STRSIZE]; - csn_as_string(opcsn, PR_FALSE, opcsnstr); + csn_as_string(*opcsn, PR_FALSE, opcsnstr); csn_as_string(basecsn, PR_FALSE, basecsnstr); - csn_free(&opcsn); + csn_free(opcsn); csngen_adjust_time(gen, basecsn); - csngen_new_csn(gen, &opcsn, PR_FALSE /* don't notify */); - csn_as_string(opcsn, PR_FALSE, opcsn2str); + if (csngen_new_csn(gen, opcsn, PR_FALSE) != CSN_SUCCESS) { + /* Failed to generate CSN we must abort */ + object_release(gen_obj); + return -1; + } + csn_as_string(*opcsn, PR_FALSE, opcsn2str); slapi_log_err(SLAPI_LOG_WARNING, repl_plugin_name, "replica_generate_next_csn - " "opcsn=%s <= basecsn=%s, adjusted opcsn=%s\n", @@ -3966,14 +3973,14 @@ * Insert opcsn into the csn pending list. * This is the notify effect in csngen_new_csn(). */ - assign_csn_callback(opcsn, (void *)replica); + assign_csn_callback(*opcsn, (void *)replica); } object_release(gen_obj); } } } - return opcsn; + return 0; } /* diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_replica_config.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_replica_config.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_replica_config.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_replica_config.c 2020-05-29 20:19:44.000000000 +0000 @@ -50,6 +50,7 @@ static int replica_config_delete(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); static int replica_config_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); static int replica_cleanall_ruv_task(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, int *returncode, char *returntext, void *arg); +static int replica_csngen_test_task(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, int *returncode, char *returntext, void *arg); static int replica_config_change_type_and_id(Replica *r, const char *new_type, const char *new_id, char *returntext, int apply_mods); static int replica_config_change_updatedn(Replica *r, const LDAPMod *mod, char *returntext, int apply_mods); static int replica_config_change_updatedngroup(Replica *r, const LDAPMod *mod, char *returntext, int apply_mods); @@ -167,6 +168,17 @@ slapi_task_register_handler("cleanallruv", replica_cleanall_ruv_task); slapi_task_register_handler("abort cleanallruv", replica_cleanall_ruv_abort); + /* register the csngen_test task + * + * To start the test, create a task + * dn: cn=run the test,cn=csngen_test,cn=tasks,cn=config + * objectclass: top + * objectclass: extensibleobject + * cn: run the test + * ttl: 300 + */ + slapi_task_register_handler("csngen_test", replica_csngen_test_task); + return 0; } @@ -1370,6 +1382,61 @@ slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name, "cleanAllRUV_task - Finished successfully\n"); return LDAP_SUCCESS; } +/* This thread runs the tests of csn generator. + * It will log a set of csn generated while simulating local and remote time skews + * All csn should increase + */ +void +replica_csngen_test_thread(void *arg) +{ + csngen_test_data *data = (csngen_test_data *)arg; + int rc = 0; + if (data->task) { + slapi_task_inc_refcount(data->task); + slapi_log_err(SLAPI_LOG_INFO, repl_plugin_name, "replica_csngen_test_thread --> refcount incremented.\n"); + } + + /* defined in csngen.c */ + csngen_test(); + + if (data->task) { + slapi_task_finish(data->task, rc); + slapi_task_dec_refcount(data->task); + slapi_log_err(SLAPI_LOG_INFO, repl_plugin_name, "replica_csngen_test_thread <-- refcount incremented.\n"); + } +} + +/* It spawn a thread running the test of a csn generator */ +static int +replica_csngen_test_task(Slapi_PBlock *pb __attribute__((unused)), + Slapi_Entry *e, + Slapi_Entry *eAfter __attribute__((unused)), + int *returncode, + char *returntext, + void *arg __attribute__((unused))) +{ + Slapi_Task *task = NULL; + csngen_test_data *data; + PRThread *thread = NULL; + int rc = SLAPI_DSE_CALLBACK_OK; + + /* allocate new task now */ + task = slapi_new_task(slapi_entry_get_ndn(e)); + data = (csngen_test_data *)slapi_ch_calloc(1, sizeof(csngen_test_data)); + data->task = task; + + thread = PR_CreateThread(PR_USER_THREAD, replica_csngen_test_thread, + (void *)data, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, + PR_UNJOINABLE_THREAD, SLAPD_DEFAULT_THREAD_STACKSIZE); + if (thread == NULL) { + *returncode = LDAP_OPERATIONS_ERROR; + rc = SLAPI_DSE_CALLBACK_ERROR; + } + if (rc != SLAPI_DSE_CALLBACK_OK) { + slapi_task_finish(task, rc); + } + return rc; +} static int replica_cleanall_ruv_task(Slapi_PBlock *pb __attribute__((unused)), diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_tot_protocol.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_tot_protocol.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl5_tot_protocol.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl5_tot_protocol.c 2020-05-26 18:13:23.000000000 +0000 @@ -469,7 +469,8 @@ */ /* Get suffix */ Slapi_Entry *suffix = NULL; - rc = slapi_search_internal_get_entry(area_sdn, NULL, &suffix, repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION)); + Slapi_PBlock *suffix_pb = NULL; + rc = slapi_search_get_entry(&suffix_pb, area_sdn, NULL, &suffix, repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION)); if (rc) { slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name, "repl5_tot_run - Unable to " "get the suffix entry \"%s\".\n", @@ -517,7 +518,7 @@ LDAP_SCOPE_SUBTREE, "(parentid>=1)", NULL, 0, ctrls, NULL, repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), OP_FLAG_BULK_IMPORT); cb_data.num_entries = 0UL; - slapi_entry_free(suffix); + slapi_search_get_entry_done(&suffix_pb); } else { /* Original total update */ /* we need to provide managedsait control so that referral entries can diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl_globals.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl_globals.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/repl_globals.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/repl_globals.c 2020-05-26 18:13:23.000000000 +0000 @@ -48,15 +48,14 @@ char *changetype_modify = CHANGETYPE_MODIFY; char *changetype_modrdn = CHANGETYPE_MODRDN; char *changetype_moddn = CHANGETYPE_MODDN; -char *attr_changenumber = ATTR_CHANGENUMBER; -char *attr_targetdn = ATTR_TARGETDN; -char *attr_changetype = ATTR_CHANGETYPE; -char *attr_newrdn = ATTR_NEWRDN; -char *attr_deleteoldrdn = ATTR_DELETEOLDRDN; -char *attr_changes = ATTR_CHANGES; -char *attr_newsuperior = ATTR_NEWSUPERIOR; -char *attr_changetime = ATTR_CHANGETIME; -char *attr_dataversion = ATTR_DATAVERSION; +char *repl_changenumber = ATTR_CHANGENUMBER; +char *repl_targetdn = ATTR_TARGETDN; +char *repl_changetype = ATTR_CHANGETYPE; +char *repl_newrdn = ATTR_NEWRDN; +char *repl_deleteoldrdn = ATTR_DELETEOLDRDN; +char *repl_changes = ATTR_CHANGES; +char *repl_newsuperior = ATTR_NEWSUPERIOR; +char *repl_changetime = ATTR_CHANGETIME; char *attr_csn = ATTR_CSN; char *type_copyingFrom = TYPE_COPYINGFROM; char *type_copiedFrom = TYPE_COPIEDFROM; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/replutil.c 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/replutil.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/replication/replutil.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/replication/replutil.c 2020-05-26 18:13:23.000000000 +0000 @@ -64,14 +64,14 @@ { if (cleattrs[0] == NULL) { cleattrs[0] = type_objectclass; - cleattrs[1] = attr_changenumber; - cleattrs[2] = attr_targetdn; - cleattrs[3] = attr_changetype; - cleattrs[4] = attr_newrdn; - cleattrs[5] = attr_deleteoldrdn; - cleattrs[6] = attr_changes; - cleattrs[7] = attr_newsuperior; - cleattrs[8] = attr_changetime; + cleattrs[1] = repl_changenumber; + cleattrs[2] = repl_targetdn; + cleattrs[3] = repl_changetype; + cleattrs[4] = repl_newrdn; + cleattrs[5] = repl_deleteoldrdn; + cleattrs[6] = repl_changes; + cleattrs[7] = repl_newsuperior; + cleattrs[8] = repl_changetime; cleattrs[9] = NULL; } return cleattrs; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_cn.c 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_cn.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_cn.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_cn.c 2020-05-26 18:13:23.000000000 +0000 @@ -62,7 +62,7 @@ Slapi_Attr *chattr = NULL; sval = NULL; value = NULL; - if (slapi_entry_attr_find(e, attr_changenumber, &chattr) == 0) { + if (slapi_entry_attr_find(e, retrocl_changenumber, &chattr) == 0) { slapi_attr_first_value(chattr, &sval); if (NULL != sval) { value = slapi_value_get_berval(sval); @@ -79,7 +79,7 @@ chattr = NULL; sval = NULL; value = NULL; - if (slapi_entry_attr_find(e, attr_changetime, &chattr) == 0) { + if (slapi_entry_attr_find(e, retrocl_changetime, &chattr) == 0) { slapi_attr_first_value(chattr, &sval); if (NULL != sval) { value = slapi_value_get_berval(sval); @@ -134,7 +134,7 @@ cr.cr_time = 0; slapi_seq_callback(RETROCL_CHANGELOG_DN, SLAPI_SEQ_FIRST, - (char *)attr_changenumber, /* cast away const */ + (char *)retrocl_changenumber, /* cast away const */ NULL, NULL, 0, &cr, NULL, handle_cnum_result, handle_cnum_entry, NULL); @@ -144,7 +144,7 @@ slapi_ch_free((void **)&cr.cr_time); slapi_seq_callback(RETROCL_CHANGELOG_DN, SLAPI_SEQ_LAST, - (char *)attr_changenumber, /* cast away const */ + (char *)retrocl_changenumber, /* cast away const */ NULL, NULL, 0, &cr, NULL, handle_cnum_result, handle_cnum_entry, NULL); @@ -185,7 +185,7 @@ return NO_TIME; } slapi_seq_callback(RETROCL_CHANGELOG_DN, type, - (char *)attr_changenumber, /* cast away const */ + (char *)retrocl_changenumber, /* cast away const */ NULL, NULL, 0, &cr, NULL, handle_cnum_result, handle_cnum_entry, NULL); @@ -353,7 +353,7 @@ cr.cr_cnum = 0; cr.cr_time = 0; slapi_seq_callback(RETROCL_CHANGELOG_DN, SLAPI_SEQ_LAST, - (char *)attr_changenumber, /* cast away const */ + (char *)retrocl_changenumber, /* cast away const */ NULL, NULL, 0, &cr, NULL, handle_cnum_result, handle_cnum_entry, NULL); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl.h 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl.h --- 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl.h 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl.h 2020-05-26 18:13:23.000000000 +0000 @@ -94,17 +94,17 @@ extern char **retrocl_attributes; extern char **retrocl_aliases; -extern const char *attr_changenumber; -extern const char *attr_targetdn; -extern const char *attr_changetype; -extern const char *attr_newrdn; -extern const char *attr_newsuperior; -extern const char *attr_deleteoldrdn; -extern const char *attr_changes; -extern const char *attr_changetime; -extern const char *attr_objectclass; -extern const char *attr_nsuniqueid; -extern const char *attr_isreplicated; +extern const char *retrocl_changenumber; +extern const char *retrocl_targetdn; +extern const char *retrocl_changetype; +extern const char *retrocl_newrdn; +extern const char *retrocl_newsuperior; +extern const char *retrocl_deleteoldrdn; +extern const char *retrocl_changes; +extern const char *retrocl_changetime; +extern const char *retrocl_objectclass; +extern const char *retrocl_nsuniqueid; +extern const char *retrocl_isreplicated; extern PRLock *retrocl_internal_lock; extern Slapi_RWLock *retrocl_cn_lock; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_po.c 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_po.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_po.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_po.c 2020-05-26 18:13:23.000000000 +0000 @@ -25,17 +25,17 @@ /******************************/ -const char *attr_changenumber = "changenumber"; -const char *attr_targetdn = "targetdn"; -const char *attr_changetype = "changetype"; -const char *attr_newrdn = "newrdn"; -const char *attr_deleteoldrdn = "deleteoldrdn"; -const char *attr_changes = "changes"; -const char *attr_newsuperior = "newsuperior"; -const char *attr_changetime = "changetime"; -const char *attr_objectclass = "objectclass"; -const char *attr_nsuniqueid = "nsuniqueid"; -const char *attr_isreplicated = "isreplicated"; +const char *retrocl_changenumber = "changenumber"; +const char *retrocl_targetdn = "targetdn"; +const char *retrocl_changetype = "changetype"; +const char *retrocl_newrdn = "newrdn"; +const char *retrocl_deleteoldrdn = "deleteoldrdn"; +const char *retrocl_changes = "changes"; +const char *retrocl_newsuperior = "newsuperior"; +const char *retrocl_changetime = "changetime"; +const char *retrocl_objectclass = "objectclass"; +const char *retrocl_nsuniqueid = "nsuniqueid"; +const char *retrocl_isreplicated = "isreplicated"; /* * Function: make_changes_string @@ -185,7 +185,7 @@ changenum, dn); /* Construct the dn of this change record */ - edn = slapi_ch_smprintf("%s=%lu,%s", attr_changenumber, changenum, RETROCL_CHANGELOG_DN); + edn = slapi_ch_smprintf("%s=%lu,%s", retrocl_changenumber, changenum, RETROCL_CHANGELOG_DN); /* * Create the entry struct, and fill in fields common to all types @@ -214,7 +214,7 @@ attributeAlias = attributeName; } - if (strcasecmp(attributeName, attr_nsuniqueid) == 0) { + if (strcasecmp(attributeName, retrocl_nsuniqueid) == 0) { Slapi_Entry *entry = NULL; const char *uniqueId = NULL; @@ -236,7 +236,7 @@ extensibleObject = 1; - } else if (strcasecmp(attributeName, attr_isreplicated) == 0) { + } else if (strcasecmp(attributeName, retrocl_isreplicated) == 0) { int isReplicated = 0; char *attributeValue = NULL; @@ -298,17 +298,17 @@ sprintf(chnobuf, "%lu", changenum); val.bv_val = chnobuf; val.bv_len = strlen(chnobuf); - slapi_entry_add_values(e, attr_changenumber, vals); + slapi_entry_add_values(e, retrocl_changenumber, vals); /* Set the targetentrydn attribute */ val.bv_val = dn; val.bv_len = strlen(dn); - slapi_entry_add_values(e, attr_targetdn, vals); + slapi_entry_add_values(e, retrocl_targetdn, vals); /* Set the changeTime attribute */ val.bv_val = format_genTime(curtime); val.bv_len = strlen(val.bv_val); - slapi_entry_add_values(e, attr_changetime, vals); + slapi_entry_add_values(e, retrocl_changetime, vals); slapi_ch_free((void **)&val.bv_val); /* @@ -344,7 +344,7 @@ /* Set the changetype attribute */ val.bv_val = "delete"; val.bv_len = 6; - slapi_entry_add_values(e, attr_changetype, vals); + slapi_entry_add_values(e, retrocl_changetype, vals); } break; @@ -422,7 +422,7 @@ } else { return (1); } - slapi_entry_add_values(e, attr_changetype, vals); + slapi_entry_add_values(e, retrocl_changetype, vals); estr = slapi_entry2str(oe, &len); p = estr; @@ -435,7 +435,7 @@ } val.bv_val = p; val.bv_len = len - (p - estr); /* length + terminating \0 */ - slapi_entry_add_values(e, attr_changes, vals); + slapi_entry_add_values(e, retrocl_changes, vals); slapi_ch_free_string(&estr); return 0; } @@ -471,7 +471,7 @@ if (NULL != l) { val.bv_val = l->ls_buf; val.bv_len = l->ls_len + 1; /* string + terminating \0 */ - slapi_entry_add_values(e, attr_changes, vals); + slapi_entry_add_values(e, retrocl_changes, vals); lenstr_free(&l); } } @@ -511,12 +511,12 @@ val.bv_val = "modrdn"; val.bv_len = 6; - slapi_entry_add_values(e, attr_changetype, vals); + slapi_entry_add_values(e, retrocl_changetype, vals); if (newrdn) { val.bv_val = (char *)newrdn; /* cast away const */ val.bv_len = strlen(newrdn); - slapi_entry_add_values(e, attr_newrdn, vals); + slapi_entry_add_values(e, retrocl_newrdn, vals); } if (deloldrdn == 0) { @@ -526,12 +526,12 @@ val.bv_val = "TRUE"; val.bv_len = 4; } - slapi_entry_add_values(e, attr_deleteoldrdn, vals); + slapi_entry_add_values(e, retrocl_deleteoldrdn, vals); if (newsuperior) { val.bv_val = (char *)newsuperior; /* cast away const */ val.bv_len = strlen(newsuperior); - slapi_entry_add_values(e, attr_newsuperior, vals); + slapi_entry_add_values(e, retrocl_newsuperior, vals); } if (NULL != ldm) { @@ -540,7 +540,7 @@ if (l->ls_len) { val.bv_val = l->ls_buf; val.bv_len = l->ls_len; - slapi_entry_add_values(e, attr_changes, vals); + slapi_entry_add_values(e, retrocl_changes, vals); } lenstr_free(&l); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_trim.c 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_trim.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/retrocl/retrocl_trim.c 2020-01-20 18:15:14.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/retrocl/retrocl_trim.c 2020-05-26 18:13:23.000000000 +0000 @@ -49,15 +49,15 @@ get_cleattrs(void) { if (cleattrs[0] == NULL) { - cleattrs[0] = attr_objectclass; - cleattrs[1] = attr_changenumber; - cleattrs[2] = attr_targetdn; - cleattrs[3] = attr_changetype; - cleattrs[4] = attr_newrdn; - cleattrs[5] = attr_deleteoldrdn; - cleattrs[6] = attr_changes; - cleattrs[7] = attr_newsuperior; - cleattrs[8] = attr_changetime; + cleattrs[0] = retrocl_objectclass; + cleattrs[1] = retrocl_changenumber; + cleattrs[2] = retrocl_targetdn; + cleattrs[3] = retrocl_changetype; + cleattrs[4] = retrocl_newrdn; + cleattrs[5] = retrocl_deleteoldrdn; + cleattrs[6] = retrocl_changes; + cleattrs[7] = retrocl_newsuperior; + cleattrs[8] = retrocl_changetime; cleattrs[9] = NULL; } return cleattrs; @@ -81,7 +81,7 @@ char *dnbuf; int delrc; - dnbuf = slapi_ch_smprintf("%s=%ld, %s", attr_changenumber, cnum, + dnbuf = slapi_ch_smprintf("%s=%ld, %s", retrocl_changenumber, cnum, RETROCL_CHANGELOG_DN); pb = slapi_pblock_new(); slapi_delete_internal_set_pb(pb, dnbuf, NULL /*controls*/, NULL /* uniqueid */, @@ -154,7 +154,7 @@ if (NULL != e) { Slapi_Value *sval = NULL; const struct berval *val = NULL; - rc = slapi_entry_attr_find(e, attr_changetime, &attr); + rc = slapi_entry_attr_find(e, retrocl_changetime, &attr); /* Bug 624442: Logic checking for lack of timestamp was reversed. */ if (0 != rc || slapi_attr_first_value(attr, &sval) == -1 || @@ -174,14 +174,14 @@ /* * Function: get_changetime * Arguments: cnum - number of change record to retrieve - * Returns: Taking the attr_changetime of the 'cnum' entry, + * Returns: Taking the retrocl_changetime of the 'cnum' entry, * it converts it into time_t (parse_localTime) and returns this time value. * It returns 0 in the following cases: - * - changerecord entry has not attr_changetime + * - changerecord entry has not retrocl_changetime * - attr_changetime attribute has no value * - attr_changetime attribute value is empty * - * Description: Retrieve attr_changetime ("changetime") from a changerecord whose number is "cnum". + * Description: Retrieve retrocl_changetime ("changetime") from a changerecord whose number is "cnum". */ static time_t get_changetime(changeNumber cnum, int *err) @@ -198,7 +198,7 @@ } crtp->crt_nentries = crtp->crt_err = 0; crtp->crt_time = 0; - PR_snprintf(fstr, sizeof(fstr), "%s=%ld", attr_changenumber, cnum); + PR_snprintf(fstr, sizeof(fstr), "%s=%ld", retrocl_changenumber, cnum); pb = slapi_pblock_new(); slapi_search_internal_set_pb(pb, RETROCL_CHANGELOG_DN, diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/statechange/statechange.c 389-ds-base-1.4.4.3/ldap/servers/plugins/statechange/statechange.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/statechange/statechange.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/statechange/statechange.c 2020-05-26 18:13:23.000000000 +0000 @@ -40,7 +40,7 @@ #define SCN_PLUGIN_SUBSYSTEM "statechange-plugin" /* used for logging */ static void *api[5]; -static Slapi_Mutex *buffer_lock = 0; +static Slapi_RWLock *buffer_lock = 0; static PRUint64 g_plugin_started = 0; /* @@ -139,7 +139,7 @@ api[3] = (void *)_statechange_unregister_all; api[4] = (void *)_statechange_vattr_cache_invalidator_callback; - if (0 == (buffer_lock = slapi_new_mutex())) /* we never free this mutex */ + if (0 == (buffer_lock = slapi_new_rwlock())) { /* badness */ slapi_log_err(SLAPI_LOG_ERR, SCN_PLUGIN_SUBSYSTEM, "statechange_start - Failed to create lock\n"); @@ -179,7 +179,9 @@ slapi_counter_destroy(&op_counter); slapi_apib_unregister(StateChange_v1_0_GUID); - slapi_destroy_mutex(buffer_lock); + if (buffer_lock) { + slapi_destroy_rwlock(buffer_lock); + } buffer_lock = NULL; slapi_log_err(SLAPI_LOG_TRACE, SCN_PLUGIN_SUBSYSTEM, "<-- statechange_close\n"); @@ -239,7 +241,7 @@ slapi_log_err(SLAPI_LOG_TRACE, SCN_PLUGIN_SUBSYSTEM, "--> statechange_post_op\n"); /* evaluate this operation against the notification entries */ - slapi_lock_mutex(buffer_lock); + slapi_rwlock_rdlock(buffer_lock); if (head) { slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); if (NULL == sdn) { @@ -289,7 +291,7 @@ } while (notify && notify != head); } bail: - slapi_unlock_mutex(buffer_lock); + slapi_rwlock_unlock(buffer_lock); slapi_log_err(SLAPI_LOG_TRACE, SCN_PLUGIN_SUBSYSTEM, "<-- statechange_post_op\n"); return SLAPI_PLUGIN_SUCCESS; /* always succeed */ @@ -337,7 +339,7 @@ } item->func = func; - slapi_lock_mutex(buffer_lock); + slapi_rwlock_wrlock(buffer_lock); if (head == NULL) { head = item; head->next = head; @@ -348,7 +350,7 @@ head->prev = item; item->prev->next = item; } - slapi_unlock_mutex(buffer_lock); + slapi_rwlock_unlock(buffer_lock); slapi_ch_free_string(&writable_filter); ret = SLAPI_PLUGIN_SUCCESS; @@ -370,7 +372,7 @@ return ret; } - slapi_lock_mutex(buffer_lock); + slapi_rwlock_wrlock(buffer_lock); if ((func = statechange_find_notify(dn, filter, thefunc))) { func->prev->next = func->next; @@ -391,7 +393,7 @@ slapi_ch_free((void **)&func); } - slapi_unlock_mutex(buffer_lock); + slapi_rwlock_unlock(buffer_lock); slapi_counter_decrement(op_counter); return ret; @@ -409,7 +411,7 @@ return; } - slapi_lock_mutex(buffer_lock); + slapi_rwlock_wrlock(buffer_lock); if (notify) { do { @@ -440,7 +442,7 @@ } while (notify != start_notify && notify != NULL); } - slapi_unlock_mutex(buffer_lock); + slapi_rwlock_unlock(buffer_lock); slapi_counter_decrement(op_counter); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/sync/sync.h 389-ds-base-1.4.4.3/ldap/servers/plugins/sync/sync.h --- 389-ds-base-1.4.3.6/ldap/servers/plugins/sync/sync.h 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/sync/sync.h 2020-05-29 20:19:44.000000000 +0000 @@ -24,6 +24,7 @@ #define SYNC_PLUGIN_SUBSYSTEM "content-sync-plugin" #define SYNC_PREOP_DESC "content-sync-preop-subplugin" #define SYNC_POSTOP_DESC "content-sync-postop-subplugin" +#define SYNC_INT_POSTOP_DESC "content-sync-int-postop-subplugin" #define OP_FLAG_SYNC_PERSIST 0x01 diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/sync/sync_init.c 389-ds-base-1.4.4.3/ldap/servers/plugins/sync/sync_init.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/sync/sync_init.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/sync/sync_init.c 2020-05-29 20:19:44.000000000 +0000 @@ -14,6 +14,7 @@ static int sync_close(Slapi_PBlock *pb); static int sync_preop_init(Slapi_PBlock *pb); static int sync_postop_init(Slapi_PBlock *pb); +static int sync_internal_postop_init(Slapi_PBlock *pb); int sync_init(Slapi_PBlock *pb) @@ -78,6 +79,22 @@ } } + if (rc == 0) { + char *plugin_type = "internalpostoperation"; + /* the config change checking post op */ + if (slapi_register_plugin(plugin_type, + 1, /* Enabled */ + "sync_init", /* this function desc */ + sync_internal_postop_init, /* init func for post op */ + SYNC_INT_POSTOP_DESC, /* plugin desc */ + NULL, + plugin_identity)) { + slapi_log_err(SLAPI_LOG_ERR, SYNC_PLUGIN_SUBSYSTEM, + "sync_init - Failed to register internal postop plugin\n"); + rc = 1; + } + } + return (rc); } @@ -105,6 +122,17 @@ return (rc); } +static int +sync_internal_postop_init(Slapi_PBlock *pb) +{ + int rc; + rc = slapi_pblock_set(pb, SLAPI_PLUGIN_INTERNAL_POST_ADD_FN, (void *)sync_add_persist_post_op); + rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN, (void *)sync_del_persist_post_op); + rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN, (void *)sync_mod_persist_post_op); + rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN, (void *)sync_modrdn_persist_post_op); + return (rc); +} + /* sync_start -------------- diff -Nru 389-ds-base-1.4.3.6/ldap/servers/plugins/uiduniq/uid.c 389-ds-base-1.4.4.3/ldap/servers/plugins/uiduniq/uid.c --- 389-ds-base-1.4.3.6/ldap/servers/plugins/uiduniq/uid.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/plugins/uiduniq/uid.c 2020-05-26 18:13:23.000000000 +0000 @@ -1254,6 +1254,7 @@ static int preop_modrdn(Slapi_PBlock *pb) { + Slapi_PBlock *entry_pb = NULL; int result = LDAP_SUCCESS; Slapi_Entry *e = NULL; Slapi_Value *sv_requiredObjectClass = NULL; @@ -1351,7 +1352,7 @@ /* Get the entry that is being renamed so we can make a dummy copy * of what it will look like after the rename. */ - err = slapi_search_internal_get_entry(sdn, NULL, &e, plugin_identity); + err = slapi_search_get_entry(&entry_pb, sdn, NULL, &e, plugin_identity); if (err != LDAP_SUCCESS) { result = uid_op_error(35); /* We want to return a no such object error if the target doesn't exist. */ @@ -1371,24 +1372,24 @@ /* - * Check if it has the required object class - */ + * Check if it has the required object class + */ if (requiredObjectClass && !slapi_entry_attr_has_syntax_value(e, SLAPI_ATTR_OBJECTCLASS, sv_requiredObjectClass)) { break; } /* - * Find any unique attribute data in the new RDN - */ + * Find any unique attribute data in the new RDN + */ for (i = 0; attrNames && attrNames[i]; i++) { err = slapi_entry_attr_find(e, attrNames[i], &attr); if (!err) { /* - * Passed all the requirements - this is an operation we - * need to enforce uniqueness on. Now find all parent entries - * with the marker object class, and do a search for each one. - */ + * Passed all the requirements - this is an operation we + * need to enforce uniqueness on. Now find all parent entries + * with the marker object class, and do a search for each one. + */ if (NULL != markerObjectClass) { /* Subtree defined by location of marker object class */ result = findSubtreeAndSearch(slapi_entry_get_sdn(e), attrNames, attr, NULL, @@ -1407,8 +1408,8 @@ END /* Clean-up */ slapi_value_free(&sv_requiredObjectClass); - if (e) - slapi_entry_free(e); + + slapi_search_get_entry_done(&entry_pb); if (result) { slapi_log_err(SLAPI_LOG_PLUGIN, plugin_name, diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c 2020-04-16 14:16:36.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c 2020-05-29 20:19:44.000000000 +0000 @@ -6074,6 +6074,11 @@ &(crypt_init->state_priv)); break; } + case BACK_INFO_CRYPT_DESTROY: { + back_info_crypt_destroy *crypt_init = (back_info_crypt_destroy *)info; + rc = back_crypt_destroy(crypt_init->state_priv); + break; + } case BACK_INFO_CRYPT_ENCRYPT_VALUE: { back_info_crypt_value *crypt_value = (back_info_crypt_value *)info; rc = back_crypt_encrypt_value(crypt_value->state_priv, crypt_value->in, diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/instance.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/instance.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/instance.c 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/instance.c 2020-05-29 20:19:44.000000000 +0000 @@ -231,7 +231,7 @@ /* ldbm_instance_config_add_index_entry(inst, 2, argv); */ e = ldbm_instance_init_config_entry(LDBM_PSEUDO_ATTR_DEFAULT, "none", 0, 0, 0); - attr_index_config(be, "ldbm index init", 0, e, 1, 0); + attr_index_config(be, "ldbm index init", 0, e, 1, 0, NULL); slapi_entry_free(e); if (!entryrdn_get_noancestorid()) { @@ -240,7 +240,7 @@ * but we still want to use the attr index file APIs. */ e = ldbm_instance_init_config_entry(LDBM_ANCESTORID_STR, "eq", 0, 0, 0); - attr_index_config(be, "ldbm index init", 0, e, 1, 0); + attr_index_config(be, "ldbm index init", 0, e, 1, 0, NULL); slapi_entry_free(e); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_add.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_add.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_add.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_add.c 2020-05-26 18:13:23.000000000 +0000 @@ -645,7 +645,13 @@ * Current op is a user request. Opcsn will be assigned * if the dn is in an updatable replica. */ - opcsn = entry_assign_operation_csn(pb, e, parententry ? parententry->ep_entry : NULL); + if (entry_assign_operation_csn(pb, e, parententry ? parententry->ep_entry : NULL, &opcsn) != 0) { + slapi_log_err(SLAPI_LOG_ERR, "ldbm_back_add", + "failed to generate add CSN for entry (%s), aborting operation\n", + slapi_entry_get_dn(e)); + ldap_result_code = LDAP_OPERATIONS_ERROR; + goto error_return; + } } if (opcsn != NULL) { entry_set_csn(e, opcsn); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_attr.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_attr.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_attr.c 2019-10-18 17:12:19.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_attr.c 2020-05-29 20:19:44.000000000 +0000 @@ -633,6 +633,18 @@ return rc; } +/* + * Function that process index attributes and modifies attrinfo structure + * + * Called while adding default indexes, during db2index execution and + * when we add/modify/delete index config entry + * + * If char *err_buf is not NULL, it will additionally print all error messages to STDERR + * It is used when we add/modify/delete index config entry, so the user would have a better verbose + * + * returns -1, 1 on a failure + * 0 on success + */ int attr_index_config( backend *be, @@ -640,7 +652,8 @@ int lineno, Slapi_Entry *e, int init __attribute__((unused)), - int indextype_none) + int indextype_none, + char *err_buf) { ldbm_instance *inst = (ldbm_instance *)be->be_instance_info; int j = 0; @@ -662,6 +675,7 @@ slapi_attr_first_value(attr, &sval); attrValue = slapi_value_get_berval(sval); } else { + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, "Error: missing indexing arguments\n"); slapi_log_err(SLAPI_LOG_ERR, "attr_index_config", "Missing indexing arguments\n"); return -1; } @@ -705,6 +719,10 @@ } a->ai_indexmask = INDEX_OFFLINE; /* note that the index isn't available */ } else { + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: %s: line %d: unknown index type \"%s\" (ignored) in entry (%s), " + "valid index types are \"pres\", \"eq\", \"approx\", or \"sub\"\n", + fname, lineno, attrValue->bv_val, slapi_entry_get_dn(e)); slapi_log_err(SLAPI_LOG_ERR, "attr_index_config", "%s: line %d: unknown index type \"%s\" (ignored) in entry (%s), " "valid index types are \"pres\", \"eq\", \"approx\", or \"sub\"\n", @@ -715,6 +733,7 @@ } if (hasIndexType == 0) { /* indexType missing, error out */ + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, "Error: missing index type\n"); slapi_log_err(SLAPI_LOG_ERR, "attr_index_config", "Missing index type\n"); attrinfo_delete(&a); return -1; @@ -873,16 +892,26 @@ slapi_ch_free((void **)&official_rules); } } - if ((return_value = attr_index_idlistsize_config(e, a, myreturntext))) { + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: %s: Failed to parse idscanlimit info: %d:%s\n", + fname, return_value, myreturntext); slapi_log_err(SLAPI_LOG_ERR, "attr_index_config", "%s: Failed to parse idscanlimit info: %d:%s\n", fname, return_value, myreturntext); + if (err_buf != NULL) { + /* we are inside of a callback, we shouldn't allow malformed attributes in index entries */ + attrinfo_delete(&a); + return return_value; + } } /* initialize the IDL code's private data */ return_value = idl_init_private(be, a); if (0 != return_value) { /* fatal error, exit */ + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: %s: line %d:Fatal Error: Failed to initialize attribute structure\n", + fname, lineno); slapi_log_err(SLAPI_LOG_CRIT, "attr_index_config", "%s: line %d:Fatal Error: Failed to initialize attribute structure\n", fname, lineno); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_attrcrypt.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_attrcrypt.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_attrcrypt.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_attrcrypt.c 2020-05-26 18:13:23.000000000 +0000 @@ -1118,6 +1118,14 @@ return ret; } +int +back_crypt_destroy(void *handle) +{ + attrcrypt_state_private *state_priv = (attrcrypt_state_private *)handle; + _back_crypt_cleanup_private(&state_priv); + return 0; +} + /* * return values: 0 - success * : -1 - error diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_delete.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_delete.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_delete.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_delete.c 2020-05-26 18:13:23.000000000 +0000 @@ -464,7 +464,14 @@ * by entry_assign_operation_csn() if the dn is in an * updatable replica. */ - opcsn = entry_assign_operation_csn ( pb, e->ep_entry, NULL ); + if (entry_assign_operation_csn(pb, e->ep_entry, NULL, &opcsn) != 0) { + slapi_log_err(SLAPI_LOG_ERR, "ldbm_back_delete", + "failed to generate delete CSN for entry (%s), aborting operation\n", + slapi_entry_get_dn(e->ep_entry)); + retval = -1; + ldap_result_code = LDAP_OPERATIONS_ERROR; + goto error_return; + } } if (opcsn != NULL) { if (!is_fixup_operation) { diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_index_config.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_index_config.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_index_config.c 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_index_config.c 2020-05-29 20:19:44.000000000 +0000 @@ -25,26 +25,34 @@ #define INDEXTYPE_NONE 1 static int -ldbm_index_parse_entry(ldbm_instance *inst, Slapi_Entry *e, const char *trace_string, char **index_name) +ldbm_index_parse_entry(ldbm_instance *inst, Slapi_Entry *e, const char *trace_string, char **index_name, char *err_buf) { Slapi_Attr *attr; const struct berval *attrValue; Slapi_Value *sval; + char *edn = slapi_entry_get_dn(e); /* Get the name of the attribute to index which will be the value * of the cn attribute. */ if (slapi_entry_attr_find(e, "cn", &attr) != 0) { - slapi_log_err(SLAPI_LOG_ERR, "ldbm_index_parse_entry", "Malformed index entry %s\n", - slapi_entry_get_dn(e)); + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s\n", + edn); + slapi_log_err(SLAPI_LOG_ERR, + "ldbm_index_parse_entry", "Malformed index entry %s\n", + edn); return LDAP_OPERATIONS_ERROR; } slapi_attr_first_value(attr, &sval); attrValue = slapi_value_get_berval(sval); if (NULL == attrValue->bv_val || 0 == attrValue->bv_len) { + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s -- empty index name\n", + edn); slapi_log_err(SLAPI_LOG_ERR, "ldbm_index_parse_entry", "Malformed index entry %s -- empty index name\n", - slapi_entry_get_dn(e)); + edn); return LDAP_OPERATIONS_ERROR; } @@ -59,16 +67,19 @@ attrValue = slapi_value_get_berval(sval); if (NULL == attrValue->bv_val || attrValue->bv_len == 0) { /* missing the index type, error out */ - slapi_log_err(SLAPI_LOG_ERR, - "ldbm_index_parse_entry", "Malformed index entry %s -- empty nsIndexType\n", - slapi_entry_get_dn(e)); + slapi_create_errormsg(err_buf, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s -- empty nsIndexType\n", + edn); + slapi_log_err(SLAPI_LOG_ERR, "ldbm_index_parse_entry", + "Malformed index entry %s -- empty nsIndexType\n", + edn); slapi_ch_free_string(index_name); return LDAP_OPERATIONS_ERROR; } } /* ok the entry is good to process, pass it to attr_index_config */ - if (attr_index_config(inst->inst_be, (char *)trace_string, 0, e, 0, 0)) { + if (attr_index_config(inst->inst_be, (char *)trace_string, 0, e, 0, 0, err_buf)) { slapi_ch_free_string(index_name); return LDAP_OPERATIONS_ERROR; } @@ -92,7 +103,7 @@ ldbm_instance *inst = (ldbm_instance *)arg; returntext[0] = '\0'; - *returncode = ldbm_index_parse_entry(inst, e, "from ldbm instance init", NULL); + *returncode = ldbm_index_parse_entry(inst, e, "from ldbm instance init", NULL, NULL); if (*returncode == LDAP_SUCCESS) { return SLAPI_DSE_CALLBACK_OK; } else { @@ -117,7 +128,7 @@ char *index_name = NULL; returntext[0] = '\0'; - *returncode = ldbm_index_parse_entry(inst, e, "from DSE add", &index_name); + *returncode = ldbm_index_parse_entry(inst, e, "from DSE add", &index_name, returntext); if (*returncode == LDAP_SUCCESS) { struct attrinfo *ai = NULL; /* if the index is a "system" index, we assume it's being added by @@ -179,7 +190,7 @@ slapi_attr_first_value(attr, &sval); attrValue = slapi_value_get_berval(sval); - attr_index_config(inst->inst_be, "From DSE delete", 0, e, 0, INDEXTYPE_NONE); + attr_index_config(inst->inst_be, "From DSE delete", 0, e, 0, INDEXTYPE_NONE, returntext); ainfo_get(inst->inst_be, attrValue->bv_val, &ainfo); if (NULL == ainfo) { @@ -213,14 +224,19 @@ Slapi_Value *sval; const struct berval *attrValue; struct attrinfo *ainfo = NULL; + char *edn = slapi_entry_get_dn(e); + char *edn_after = slapi_entry_get_dn(entryAfter); returntext[0] = '\0'; *returncode = LDAP_SUCCESS; if (slapi_entry_attr_find(entryAfter, "cn", &attr) != 0) { + slapi_create_errormsg(returntext, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s - missing cn attribute\n", + edn_after); slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_index_config_modify_callback", "Malformed index entry %s - missing cn attribute\n", - slapi_entry_get_dn(entryAfter)); + edn_after); *returncode = LDAP_OBJECT_CLASS_VIOLATION; return SLAPI_DSE_CALLBACK_ERROR; } @@ -228,31 +244,40 @@ attrValue = slapi_value_get_berval(sval); if (NULL == attrValue->bv_val || 0 == attrValue->bv_len) { + slapi_create_errormsg(returntext, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s - missing index name\n", + edn); slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_index_config_modify_callback", "Malformed index entry %s, missing index name\n", - slapi_entry_get_dn(e)); + edn); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } ainfo_get(inst->inst_be, attrValue->bv_val, &ainfo); if (NULL == ainfo) { + slapi_create_errormsg(returntext, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s - missing cn attribute info\n", + edn); slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_index_config_modify_callback", "Malformed index entry %s - missing cn attribute info\n", - slapi_entry_get_dn(e)); + edn); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } if (slapi_entry_attr_find(entryAfter, "nsIndexType", &attr) != 0) { + slapi_create_errormsg(returntext, SLAPI_DSE_RETURNTEXT_SIZE, + "Error: malformed index entry %s - missing nsIndexType attribute\n", + edn_after); slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_index_config_modify_callback", "Malformed index entry %s - missing nsIndexType attribute\n", - slapi_entry_get_dn(entryAfter)); + edn_after); *returncode = LDAP_OBJECT_CLASS_VIOLATION; return SLAPI_DSE_CALLBACK_ERROR; } - if (attr_index_config(inst->inst_be, "from DSE modify", 0, entryAfter, 0, 0)) { + if (attr_index_config(inst->inst_be, "from DSE modify", 0, entryAfter, 0, 0, returntext)) { *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -364,7 +389,7 @@ ainfo_get(inst->inst_be, index_name, &ai); } if (!ai) { - rc = ldbm_index_parse_entry(inst, e, "from DSE add", &index_name); + rc = ldbm_index_parse_entry(inst, e, "from DSE add", &index_name, NULL); } if (rc == LDAP_SUCCESS) { /* Assume the caller knows if it is OK to go online immediately */ diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_modify.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_modify.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_modify.c 2020-01-20 18:15:14.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_modify.c 2020-05-26 18:13:23.000000000 +0000 @@ -598,12 +598,18 @@ goto error_return; } opcsn = operation_get_csn(operation); - if (NULL == opcsn && operation->o_csngen_handler) { + if (opcsn == NULL && operation->o_csngen_handler) { /* * Current op is a user request. Opcsn will be assigned * if the dn is in an updatable replica. */ - opcsn = entry_assign_operation_csn(pb, e->ep_entry, NULL); + if (entry_assign_operation_csn(pb, e->ep_entry, NULL, &opcsn) != 0) { + slapi_log_err(SLAPI_LOG_ERR, "ldbm_back_modify", + "failed to generate modify CSN for entry (%s), aborting operation\n", + slapi_entry_get_dn(e->ep_entry)); + ldap_result_code = LDAP_OPERATIONS_ERROR; + goto error_return; + } } if (opcsn) { entry_set_maxcsn(e->ep_entry, opcsn); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c 2020-03-20 02:55:15.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c 2020-05-26 18:13:23.000000000 +0000 @@ -543,7 +543,13 @@ * Current op is a user request. Opcsn will be assigned * if the dn is in an updatable replica. */ - opcsn = entry_assign_operation_csn(pb, e->ep_entry, parententry ? parententry->ep_entry : NULL); + if (entry_assign_operation_csn(pb, e->ep_entry, parententry ? parententry->ep_entry : NULL, &opcsn) != 0) { + slapi_log_err(SLAPI_LOG_ERR, "ldbm_back_modrdn", + "failed to generate modrdn CSN for entry (%s), aborting operation\n", + slapi_entry_get_dn(e->ep_entry)); + ldap_result_code = LDAP_OPERATIONS_ERROR; + goto error_return; + } } if (opcsn != NULL) { entry_set_maxcsn(e->ep_entry, opcsn); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldif2ldbm.c 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldif2ldbm.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/ldif2ldbm.c 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/ldif2ldbm.c 2020-05-29 20:19:44.000000000 +0000 @@ -291,7 +291,7 @@ } } - attr_index_config(be, "from db2index()", 0, e, 0, 0); + attr_index_config(be, "from db2index()", 0, e, 0, 0, NULL); slapi_entry_free(e); return (0); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h --- 389-ds-base-1.4.3.6/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h 2020-05-29 20:19:44.000000000 +0000 @@ -24,7 +24,7 @@ void ainfo_get(backend *be, char *type, struct attrinfo **at); void attr_masks(backend *be, char *type, int *indexmask, int *syntaxmask); void attr_masks_ex(backend *be, char *type, int *indexmask, int *syntaxmask, struct attrinfo **at); -int attr_index_config(backend *be, char *fname, int lineno, Slapi_Entry *e, int init, int none); +int attr_index_config(backend *be, char *fname, int lineno, Slapi_Entry *e, int init, int none, char *err_buf); int db2index_add_indexed_attr(backend *be, char *attrString); int ldbm_compute_init(void); void attrinfo_deletetree(ldbm_instance *inst); @@ -610,6 +610,7 @@ int ldbm_instance_attrcrypt_config_modify_callback(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); int back_crypt_init(Slapi_Backend *be, const char *dn, const char *encAlgorithm, void **handle); +int back_crypt_destroy(void *handle); int back_crypt_encrypt_value(void *handle, struct berval *in, struct berval **out); int back_crypt_decrypt_value(void *handle, struct berval *in, struct berval **out); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/csngen.c 389-ds-base-1.4.4.3/ldap/servers/slapd/csngen.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/csngen.c 2020-04-13 17:04:14.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/csngen.c 2020-05-29 20:19:44.000000000 +0000 @@ -164,6 +164,7 @@ int csngen_new_csn(CSNGen *gen, CSN **csn, PRBool notify) { + struct timespec now = {0}; int rc = CSN_SUCCESS; time_t cur_time; int delta; @@ -179,12 +180,25 @@ return CSN_MEMORY_ERROR; } - slapi_rwlock_wrlock(gen->lock); + if ((rc = slapi_clock_gettime(&now)) != 0) { + /* Failed to get system time, we must abort */ + slapi_log_err(SLAPI_LOG_ERR, "csngen_new_csn", + "Failed to get system time (%s)\n", + slapd_system_strerror(rc)); + return CSN_TIME_ERROR; + } + cur_time = now.tv_sec; - cur_time = slapi_current_utc_time(); + slapi_rwlock_wrlock(gen->lock); /* check if the time should be adjusted */ delta = cur_time - gen->state.sampled_time; + if (delta > _SEC_PER_DAY || delta < (-1 * _SEC_PER_DAY)) { + /* We had a jump larger than a day */ + slapi_log_err(SLAPI_LOG_INFO, "csngen_new_csn", + "Detected large jump in CSN time. Delta: %d (current time: %ld vs previous time: %ld)\n", + delta, cur_time, gen->state.sampled_time); + } if (delta > 0) { rc = _csngen_adjust_local_time(gen, cur_time); if (rc != CSN_SUCCESS) { @@ -247,9 +261,32 @@ } /* this function should be called when a remote CSN for the same part of - the dit becomes known to the server (for instance, as part of RUV during - replication session. In response, the generator would adjust its notion - of time so that it does not generate smaller csns */ + * the dit becomes known to the server (for instance, as part of RUV during + * replication session. In response, the generator would adjust its notion + * of time so that it does not generate smaller csns + * + * The following counters are updated + * - when a new csn is generated + * - when csngen is adjusted (beginning of a incoming (extop) or outgoing + * (inc_protocol) session) + * + * sampled_time: It takes the value of current system time. + * + * remote offset: it is updated when 'csn' argument is ahead of the next csn + * that the csn generator will generate. It is the MAX jump ahead, it is not + * cumulative counter (e.g. if remote_offset=7 and 'csn' is 5sec ahead + * remote_offset stays the same. The jump ahead (5s) pour into the local offset. + * It is not clear of the interest of this counter. It gives an indication of + * the maximum jump ahead but not much. + * + * local offset: it is increased if + * - system time is going backward (compare sampled_time) + * - if 'csn' argument is ahead of csn that the csn generator would generate + * AND diff('csn', csngen.new_csn) < remote_offset + * then the diff "pour" into local_offset + * It is decreased as the clock is ticking, local offset is "consumed" as + * sampled_time progresses. + */ int csngen_adjust_time(CSNGen *gen, const CSN *csn) { @@ -286,7 +323,7 @@ (CSN_SUCCESS != (rc = _csngen_adjust_local_time(gen, cur_time)))) { /* _csngen_adjust_local_time will log error */ slapi_rwlock_unlock(gen->lock); - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_DEBUG); return rc; } @@ -312,7 +349,7 @@ "Adjustment limit exceeded; value - %ld, limit - %ld\n", remote_offset, (long)CSN_MAX_TIME_ADJUST); slapi_rwlock_unlock(gen->lock); - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_DEBUG); return CSN_LIMIT_EXCEEDED; } } else if (remote_offset > 0) { /* still need to account for this */ @@ -421,16 +458,16 @@ /* debugging function */ void -csngen_dump_state(const CSNGen *gen) +csngen_dump_state(const CSNGen *gen, int severity) { if (gen) { slapi_rwlock_rdlock(gen->lock); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "CSN generator's state:\n"); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "\treplica id: %d\n", gen->state.rid); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "\tsampled time: %ld\n", gen->state.sampled_time); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "\tlocal offset: %ld\n", gen->state.local_offset); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "\tremote offset: %ld\n", gen->state.remote_offset); - slapi_log_err(SLAPI_LOG_DEBUG, "csngen_dump_state", "\tsequence number: %d\n", gen->state.seq_num); + slapi_log_err(severity, "csngen_dump_state", "CSN generator's state:\n"); + slapi_log_err(severity, "csngen_dump_state", "\treplica id: %d\n", gen->state.rid); + slapi_log_err(severity, "csngen_dump_state", "\tsampled time: %ld\n", gen->state.sampled_time); + slapi_log_err(severity, "csngen_dump_state", "\tlocal offset: %ld\n", gen->state.local_offset); + slapi_log_err(severity, "csngen_dump_state", "\tremote offset: %ld\n", gen->state.remote_offset); + slapi_log_err(severity, "csngen_dump_state", "\tsequence number: %d\n", gen->state.seq_num); slapi_rwlock_unlock(gen->lock); } } @@ -445,7 +482,7 @@ CSNGen *gen = csngen_new(255, NULL); slapi_log_err(SLAPI_LOG_DEBUG, "csngen_test", "staring csn generator test ..."); - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_INFO); rc = _csngen_start_test_threads(gen); if (rc == 0) { @@ -453,7 +490,7 @@ } _csngen_stop_test_threads(); - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_INFO); slapi_log_err(SLAPI_LOG_DEBUG, "csngen_test", "csn generator test is complete..."); } @@ -783,7 +820,7 @@ "Failed to adjust generator's time; csn error - %d\n", rc); } - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_INFO); } csn_free(&csn); @@ -811,7 +848,7 @@ * g_sampled_time -= slapi_rand () % 100; */ - csngen_dump_state(gen); + csngen_dump_state(gen, SLAPI_LOG_INFO); } PR_AtomicDecrement(&s_thread_count); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/daemon.c 389-ds-base-1.4.4.3/ldap/servers/slapd/daemon.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/daemon.c 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/daemon.c 2020-05-29 20:19:44.000000000 +0000 @@ -1916,18 +1916,13 @@ char *root_dn = config_get_ldapi_root_dn(); if (root_dn) { + Slapi_PBlock *entry_pb = NULL; Slapi_DN *edn = slapi_sdn_new_dn_byref( slapi_dn_normalize(root_dn)); Slapi_Entry *e = 0; /* root might be locked too! :) */ - ret = slapi_search_internal_get_entry( - edn, 0, - &e, - (void *)plugin_get_default_component_id() - - ); - + ret = slapi_search_get_entry(&entry_pb, edn, 0, &e, (void *)plugin_get_default_component_id()); if (0 == ret && e) { ret = slapi_check_account_lock( 0, /* pb not req */ @@ -1955,7 +1950,7 @@ root_map_free: /* root_dn consumed by bind creds set */ slapi_sdn_free(&edn); - slapi_entry_free(e); + slapi_search_get_entry_done(&entry_pb); ret = 0; } } @@ -2189,6 +2184,7 @@ (void)SIGNAL(SIGUSR2, set_shutdown); #endif (void)SIGNAL(SIGTERM, set_shutdown); + (void)SIGNAL(SIGINT, set_shutdown); (void)SIGNAL(SIGHUP, set_shutdown); #endif /* HPUX */ return 0; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/entrywsi.c 389-ds-base-1.4.4.3/ldap/servers/slapd/entrywsi.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/entrywsi.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/entrywsi.c 2020-05-26 18:13:23.000000000 +0000 @@ -224,13 +224,12 @@ slapi_rdn_free(&rdn); } -CSN * -entry_assign_operation_csn(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *parententry) +int32_t +entry_assign_operation_csn(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *parententry, CSN **opcsn) { Slapi_Operation *op; const CSN *basecsn = NULL; const CSN *parententry_dncsn = NULL; - CSN *opcsn = NULL; slapi_pblock_get(pb, SLAPI_OPERATION, &op); @@ -252,14 +251,16 @@ basecsn = parententry_dncsn; } } - opcsn = op->o_csngen_handler(pb, basecsn); + if(op->o_csngen_handler(pb, basecsn, opcsn) != 0) { + return -1; + } - if (NULL != opcsn) { - operation_set_csn(op, opcsn); + if (*opcsn) { + operation_set_csn(op, *opcsn); } } - return opcsn; + return 0; } /* diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/libglobs.c 389-ds-base-1.4.4.3/ldap/servers/slapd/libglobs.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/libglobs.c 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/libglobs.c 2020-05-29 20:19:44.000000000 +0000 @@ -2390,11 +2390,23 @@ { int retVal = LDAP_SUCCESS; slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig(); + /* + * LDAPI file path length is limited by sizeof((*ports_info.i_listenaddr)->local.path)) + * which is set in main.c inside of "#if defined(ENABLE_LDAPI)" block + * ports_info.i_listenaddr is sizeof(PRNetAddr) and our required sizes is 8 bytes less + */ + size_t result_size = sizeof(PRNetAddr) - 8; if (config_value_is_null(attrname, value, errorbuf, 0)) { return LDAP_OPERATIONS_ERROR; } + if (strlen(value) >= result_size) { + slapi_create_errormsg(errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: \"%s\" is invalid, its length must be less than %d", + attrname, value, result_size); + return LDAP_OPERATIONS_ERROR; + } + if (apply) { CFG_LOCK_WRITE(slapdFrontendConfig); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/modify.c 389-ds-base-1.4.4.3/ldap/servers/slapd/modify.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/modify.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/modify.c 2020-05-26 18:13:23.000000000 +0000 @@ -592,6 +592,7 @@ static void op_shared_modify(Slapi_PBlock *pb, int pw_change, char *old_pw) { + Slapi_PBlock *entry_pb = NULL; Slapi_Backend *be = NULL; Slapi_Entry *pse; Slapi_Entry *referral; @@ -723,7 +724,7 @@ * 2. If yes, then if the mods contain any passwdpolicy specific attributes. * 3. If yes, then it invokes corrosponding checking function. */ - if (!repl_op && !internal_op && normdn && (e = get_entry(pb, normdn))) { + if (!repl_op && !internal_op && normdn && slapi_search_get_entry(&entry_pb, sdn, NULL, &e, NULL) == LDAP_SUCCESS) { Slapi_Value target; slapi_value_init(&target); slapi_value_set_string(&target, "passwordpolicy"); @@ -1072,7 +1073,7 @@ slapi_entry_free(epre); slapi_entry_free(epost); } - slapi_entry_free(e); + slapi_search_get_entry_done(&entry_pb); if (be) slapi_be_Unlock(be); @@ -1202,12 +1203,13 @@ if (!internal_op) { /* slapi_acl_check_mods needs an array of LDAPMods, but * we're really only interested in the one password mod. */ + Slapi_PBlock *entry_pb = NULL; LDAPMod *mods[2]; mods[0] = mod; mods[1] = NULL; /* We need to actually fetch the target here to use for ACI checking. */ - slapi_search_internal_get_entry(&sdn, NULL, &e, (void *)plugin_get_default_component_id()); + slapi_search_get_entry(&entry_pb, &sdn, NULL, &e, NULL); /* Create a bogus entry with just the target dn if we were unable to * find the actual entry. This will only be used for checking the ACIs. */ @@ -1238,9 +1240,12 @@ } send_ldap_result(pb, res, NULL, errtxt, 0, NULL); slapi_ch_free_string(&errtxt); + slapi_search_get_entry_done(&entry_pb); rc = -1; goto done; } + /* done with slapi entry e */ + slapi_search_get_entry_done(&entry_pb); /* * If this mod is being performed by a password administrator/rootDN, @@ -1353,7 +1358,6 @@ valuearray_free(&values); done: - slapi_entry_free(e); slapi_sdn_done(&sdn); slapi_ch_free_string(&proxydn); slapi_ch_free_string(&proxystr); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/operation.c 389-ds-base-1.4.4.3/ldap/servers/slapd/operation.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/operation.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/operation.c 2020-05-26 18:13:23.000000000 +0000 @@ -150,8 +150,8 @@ /* We can't get rid of this til we remove the operation stack. */ memset(o, 0, sizeof(Slapi_Operation)); o->o_ber = ber; - o->o_msgid = -1; - o->o_tag = LBER_DEFAULT; + o->o_msgid = -1; /* if changed please update start-tls that test this value */ + o->o_tag = LBER_DEFAULT; /* if changed please update start-tls that test this value */ o->o_status = SLAPI_OP_STATUS_PROCESSING; slapi_sdn_init(&(o->o_sdn)); o->o_authtype = NULL; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/plugin_internal_op.c 389-ds-base-1.4.4.3/ldap/servers/slapd/plugin_internal_op.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/plugin_internal_op.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/plugin_internal_op.c 2020-05-26 18:13:23.000000000 +0000 @@ -882,3 +882,51 @@ int_search_pb = NULL; return rc; } + +int32_t +slapi_search_get_entry(Slapi_PBlock **pb, Slapi_DN *dn, char **attrs, Slapi_Entry **ret_entry, void *component_identity) +{ + Slapi_Entry **entries = NULL; + int32_t rc = 0; + void *component = component_identity; + + if (ret_entry) { + *ret_entry = NULL; + } + + if (component == NULL) { + component = (void *)plugin_get_default_component_id(); + } + + if (*pb == NULL) { + *pb = slapi_pblock_new(); + } + slapi_search_internal_set_pb(*pb, slapi_sdn_get_dn(dn), LDAP_SCOPE_BASE, + "(|(objectclass=*)(objectclass=ldapsubentry))", + attrs, 0, NULL, NULL, component, 0 ); + slapi_search_internal_pb(*pb); + slapi_pblock_get(*pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); + if (LDAP_SUCCESS == rc) { + slapi_pblock_get(*pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries); + if (NULL != entries && NULL != entries[0]) { + /* Only need to dup the entry if the caller passed ret_entry in. */ + if (ret_entry) { + *ret_entry = entries[0]; + } + } else { + rc = LDAP_NO_SUCH_OBJECT; + } + } + + return rc; +} + +void +slapi_search_get_entry_done(Slapi_PBlock **pb) +{ + if (pb && *pb) { + slapi_free_search_results_internal(*pb); + slapi_pblock_destroy(*pb); + *pb = NULL; + } +} diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/protect_db.c 389-ds-base-1.4.4.3/ldap/servers/slapd/protect_db.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/protect_db.c 2019-10-18 17:12:20.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/protect_db.c 2020-05-26 18:13:23.000000000 +0000 @@ -251,7 +251,19 @@ * didn't put it there */ continue; } - if (is_process_up(pid)) { + if (pid == getpid()) { + /* + * We have re-used our pid number, and we are now checking for ourself! + * + * pagure: https://pagure.io/389-ds-base/issue/50989 + * + * This situation is common in containers, where the process name space means we + * may be checking ourself, and have low pids that get re-used. Worse, we cant + * actually check the pid of any other instance in a different container. + * So at the very least in THIS case, we ignore it, since we are the pid + * that has the lock, and it's probably a left over from a bad startup. + */ + } else if (is_process_up(pid)) { result = (long)pid; } else { PR_snprintf(file_name, MAXPATHLEN, "%s/%s", dir_name, entry->name); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/resourcelimit.c 389-ds-base-1.4.4.3/ldap/servers/slapd/resourcelimit.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/resourcelimit.c 2019-10-18 17:12:20.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/resourcelimit.c 2020-05-26 18:13:23.000000000 +0000 @@ -305,22 +305,17 @@ int reslimit_update_from_dn(Slapi_Connection *conn, Slapi_DN *dn) { - Slapi_Entry *e; + Slapi_PBlock *pb = NULL; + Slapi_Entry *e = NULL; int rc; - e = NULL; if (dn != NULL) { - char **attrs = reslimit_get_registered_attributes(); - (void)slapi_search_internal_get_entry(dn, attrs, &e, reslimit_componentid); + slapi_search_get_entry(&pb, dn, attrs, &e, reslimit_componentid); charray_free(attrs); } - rc = reslimit_update_from_entry(conn, e); - - if (NULL != e) { - slapi_entry_free(e); - } + slapi_search_get_entry_done(&pb); return (rc); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/schema.c 389-ds-base-1.4.4.3/ldap/servers/slapd/schema.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/schema.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/schema.c 2020-05-26 18:13:23.000000000 +0000 @@ -341,6 +341,7 @@ static void schema_load_repl_policy(const char *dn, repl_schema_policy_t *replica) { + Slapi_PBlock *pb = NULL; Slapi_DN sdn; Slapi_Entry *entry = NULL; schema_item_t *schema_item, *next; @@ -369,8 +370,7 @@ /* Load the replication policy of the schema */ slapi_sdn_init_dn_byref(&sdn, dn); - if (slapi_search_internal_get_entry(&sdn, NULL, &entry, plugin_get_default_component_id()) == LDAP_SUCCESS) { - + if (slapi_search_get_entry(&pb, &sdn, NULL, &entry, plugin_get_default_component_id()) == LDAP_SUCCESS) { /* fill the policies (accept/reject) regarding objectclass */ schema_policy_add_action(entry, ATTR_SCHEMA_UPDATE_OBJECTCLASS_ACCEPT, &replica->objectclasses); schema_policy_add_action(entry, ATTR_SCHEMA_UPDATE_OBJECTCLASS_REJECT, &replica->objectclasses); @@ -378,9 +378,8 @@ /* fill the policies (accept/reject) regarding attribute */ schema_policy_add_action(entry, ATTR_SCHEMA_UPDATE_ATTRIBUTE_ACCEPT, &replica->attributes); schema_policy_add_action(entry, ATTR_SCHEMA_UPDATE_ATTRIBUTE_REJECT, &replica->attributes); - - slapi_entry_free(entry); } + slapi_search_get_entry_done(&pb); slapi_sdn_done(&sdn); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/slap.h 389-ds-base-1.4.4.3/ldap/servers/slapd/slap.h --- 389-ds-base-1.4.3.6/ldap/servers/slapd/slap.h 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/slap.h 2020-05-29 20:19:44.000000000 +0000 @@ -1480,7 +1480,7 @@ typedef void (*result_handler)(struct conn *, struct op *, int, char *, char *, int, struct berval **); typedef int (*search_entry_handler)(Slapi_Backend *, struct conn *, struct op *, struct slapi_entry *); typedef int (*search_referral_handler)(Slapi_Backend *, struct conn *, struct op *, struct berval **); -typedef CSN *(*csngen_handler)(Slapi_PBlock *pb, const CSN *basecsn); +typedef int32_t *(*csngen_handler)(Slapi_PBlock *pb, const CSN *basecsn, CSN **opcsn); typedef int (*replica_attr_handler)(Slapi_PBlock *pb, const char *type, void **value); /* diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi2nspr.c 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi2nspr.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi2nspr.c 2019-10-18 17:12:20.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi2nspr.c 2020-05-26 18:13:23.000000000 +0000 @@ -182,6 +182,31 @@ } Slapi_RWLock * +slapi_new_rwlock_prio(int32_t prio_writer) +{ +#ifdef USE_POSIX_RWLOCKS + pthread_rwlock_t *rwlock = NULL; + pthread_rwlockattr_t attr; + + pthread_rwlockattr_init(&attr); + if (prio_writer) { + pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); + } else { + pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_READER_NP); + } + + rwlock = (pthread_rwlock_t *)slapi_ch_malloc(sizeof(pthread_rwlock_t)); + if (rwlock) { + pthread_rwlock_init(rwlock, &attr); + } + + return ((Slapi_RWLock *)rwlock); +#else + return ((Slapi_RWLock *)PR_NewRWLock(PR_RWLOCK_RANK_NONE, "slapi_rwlock")); +#endif +} + +Slapi_RWLock * slapi_new_rwlock(void) { #ifdef USE_POSIX_RWLOCKS diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi-plugin.h 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi-plugin.h --- 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi-plugin.h 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi-plugin.h 2020-05-29 20:19:44.000000000 +0000 @@ -5972,7 +5972,7 @@ /* * slapi_search_internal_get_entry() finds an entry given a dn. It returns - * an LDAP error code (LDAP_SUCCESS if all goes well). + * an LDAP error code (LDAP_SUCCESS if all goes well). Caller must free ret_entry */ int slapi_search_internal_get_entry(Slapi_DN *dn, char **attrlist, Slapi_Entry **ret_entry, void *caller_identity); @@ -6087,6 +6087,22 @@ int slapi_notify_condvar(Slapi_CondVar *cvar, int notify_all); /** + * Creates a new read/write lock + * If prio_writer the rwlock gives priority on writers + * else it give priority on readers (default) + * + * \return A pointer to a \c Slapi_RWLock + * + * \note Free the returned lock by calling slapi_destroy_rwlock() when finished + * + * \see slapi_destroy_rwlock() + * \see slapi_rwlock_rdlock() + * \see slapi_rwlock_wrlock() + * \see slapi_rwlock_unlock() + */ +Slapi_RWLock *slapi_new_rwlock_prio(int32_t prio_writer); + +/** * Creates a new read/write lock. * * \return A pointer to a \c Slapi_RWLock @@ -6728,6 +6744,14 @@ time_t slapi_current_time(void) __attribute__((deprecated)); /** + * Get the system time and check for errors. Return + * + * \param tp - a timespec struct where the system time is set + * \return result code, upon success tp is set to the system time + */ +int32_t slapi_clock_gettime(struct timespec *tp); + +/** * Returns the current system time as a hr clock relative to uptime * This means the clock is not affected by timezones * which can normally cause issues with timers. Additionally, this @@ -7727,6 +7751,7 @@ * * \note Implemented cmd: * BACK_INFO_CRYPT_INIT - Initialize cipher (info: back_info_crypt_init) + * BACK_INFO_CRYPT_DESTROY - Free allocated during init data (info: back_info_crypt_destroy) * BACK_INFO_CRYPT_ENCRYPT_VALUE - Encrypt the given value (info: back_info_crypt_value) * BACK_INFO_CRYPT_DECRYPT_VALUE - Decrypt the given value (info: back_info_crypt_value) */ @@ -7740,6 +7765,7 @@ BACK_INFO_INDEXPAGESIZE, /* Get the index page size */ BACK_INFO_DBENV_OPENFLAGS, /* Get the dbenv openflags */ BACK_INFO_CRYPT_INIT, /* Ctrl: clcrypt_init */ + BACK_INFO_CRYPT_DESTROY, /* Ctrl: clcrypt_destroy */ BACK_INFO_CRYPT_ENCRYPT_VALUE, /* Ctrl: clcrypt_encrypt_value */ BACK_INFO_CRYPT_DECRYPT_VALUE, /* Ctrl: clcrypt_decrypt_value */ BACK_INFO_DIRECTORY, /* Get the directory path */ @@ -7766,6 +7792,12 @@ }; typedef struct _back_info_crypt_init back_info_crypt_init; +struct _back_info_crypt_destroy +{ + void *state_priv; /* a structure to free */ +}; +typedef struct _back_info_crypt_destroy back_info_crypt_destroy; + struct _back_info_crypt_value { void *state_priv; /* input */ @@ -8280,6 +8312,27 @@ /* helper function */ const char * slapi_fetch_attr(Slapi_Entry *e, const char *attrname, char *default_val); +/** + * Get a Slapi_Entry via an internal search. The caller then needs to call + * slapi_get_entry_done() to free any resources allocated to get the entry + * + * \param pb - slapi_pblock pointer (the function will allocate if necessary) + * \param dn - Slapi_DN of the entry to retrieve + * \param attrs - char list of attributes to get + * \param ret_entry - pointer to a Slapi_entry wer the returned entry is stored + * \param component_identity - plugin component + * + * \return - ldap result code + */ +int32_t slapi_search_get_entry(Slapi_PBlock **pb, Slapi_DN *dn, char **attrs, Slapi_Entry **ret_entry, void *component_identity); + +/** + * Free the resources allocated by slapi_search_get_entry() + * + * \param pb - slapi_pblock pointer + */ +void slapi_search_get_entry_done(Slapi_PBlock **pb); + #ifdef __cplusplus } #endif diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi-private.h 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi-private.h --- 389-ds-base-1.4.3.6/ldap/servers/slapd/slapi-private.h 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/slapi-private.h 2020-05-29 20:19:44.000000000 +0000 @@ -233,7 +233,8 @@ CSN_INVALID_PARAMETER, /* invalid function argument */ CSN_INVALID_FORMAT, /* invalid state format */ CSN_LDAP_ERROR, /* LDAP operation failed */ - CSN_NSPR_ERROR /* NSPR API failure */ + CSN_NSPR_ERROR, /* NSPR API failure */ + CSN_TIME_ERROR /* Error generating new CSN due to clock failure */ }; typedef struct csngen CSNGen; @@ -272,7 +273,7 @@ void csngen_unregister_callbacks(CSNGen *gen, void *cookie); /* debugging function */ -void csngen_dump_state(const CSNGen *gen); +void csngen_dump_state(const CSNGen *gen, int severity); /* this function tests csn generator */ void csngen_test(void); @@ -326,7 +327,7 @@ void set_attr_to_protected_list(char *attr, int flag); /* entrywsi.c */ -CSN *entry_assign_operation_csn(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *parententry); +int32_t entry_assign_operation_csn(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *parententry, CSN **opcsn); const CSN *entry_get_maxcsn(const Slapi_Entry *entry); void entry_set_maxcsn(Slapi_Entry *entry, const CSN *csn); const CSN *entry_get_dncsn(const Slapi_Entry *entry); diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/ssl.c 389-ds-base-1.4.4.3/ldap/servers/slapd/ssl.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/ssl.c 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/ssl.c 2020-05-29 20:19:44.000000000 +0000 @@ -1373,7 +1373,7 @@ val, emin); (*rval) = enabledNSSVersions.min; } else { - (*rval) = CURRENT_DEFAULT_SSL_VERSION; + (*rval) = SSL_LIBRARY_VERSION_TLS_1_0; } } else { if (enabledNSSVersions.max < CURRENT_DEFAULT_SSL_VERSION) { @@ -1384,7 +1384,7 @@ val, emax); (*rval) = enabledNSSVersions.max; } else { - (*rval) = CURRENT_DEFAULT_SSL_VERSION; + (*rval) = SSL_LIBRARY_VERSION_TLS_1_0; } } } else if (tlsv < 1.2f) { /* TLS1.1 */ diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/start_tls_extop.c 389-ds-base-1.4.4.3/ldap/servers/slapd/start_tls_extop.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/start_tls_extop.c 2020-04-11 13:19:50.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/start_tls_extop.c 2020-05-26 18:13:23.000000000 +0000 @@ -188,11 +188,31 @@ /* Check whether the Start TLS request can be accepted. */ if (connection_operations_pending(conn, pb_op, 1 /* check for ops where result not yet sent */)) { - slapi_log_err(SLAPI_LOG_PLUGIN, "start_tls", - "Other operations are still pending on the connection.\n"); - ldaprc = LDAP_OPERATIONS_ERROR; - ldapmsg = "Other operations are still pending on the connection."; - goto unlock_and_return; + for (Operation *op = conn->c_ops; op != NULL; op = op->o_next) { + if (op == pb_op) { + continue; + } + if ((op->o_msgid == -1) && (op->o_tag == LBER_DEFAULT)) { + /* while processing start-tls extop we also received a new incoming operation + * As this operation will not processed until start-tls completes. + * Be fair do not consider this operation as a pending one + */ + slapi_log_err(SLAPI_LOG_CONNS, "start_tls", + "New incoming operation blocked by start-tls, Continue start-tls (conn=%"PRIu64").\n", + conn->c_connid); + continue; + } else { + /* It is problematic, this pending operation is processed and + * start-tls can push new network layer while the operation + * send result. Safest to abort start-tls + */ + slapi_log_err(SLAPI_LOG_CONNS, "start_tls", + "Other operations are still pending on the connection.\n"); + ldaprc = LDAP_OPERATIONS_ERROR; + ldapmsg = "Other operations are still pending on the connection."; + goto unlock_and_return; + } + } } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/time.c 389-ds-base-1.4.4.3/ldap/servers/slapd/time.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/time.c 2020-04-13 17:04:14.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/time.c 2020-05-26 18:13:23.000000000 +0000 @@ -61,6 +61,25 @@ return 0; } +/* + * Check if the time function returns an error. If so return the errno + */ +int32_t +slapi_clock_gettime(struct timespec *tp) +{ + int32_t rc = 0; + + PR_ASSERT(tp && tp->tv_nsec == 0 && tp->tv_sec == 0); + + if (clock_gettime(CLOCK_REALTIME, tp) != 0) { + rc = errno; + } + + PR_ASSERT(rc == 0); + + return rc; +} + time_t current_time(void) { @@ -69,7 +88,7 @@ * but this should be removed in favour of the * more accurately named slapi_current_utc_time */ - struct timespec now; + struct timespec now = {0}; clock_gettime(CLOCK_REALTIME, &now); return now.tv_sec; } @@ -83,7 +102,7 @@ struct timespec slapi_current_rel_time_hr(void) { - struct timespec now; + struct timespec now = {0}; clock_gettime(CLOCK_MONOTONIC, &now); return now; } @@ -91,7 +110,7 @@ struct timespec slapi_current_utc_time_hr(void) { - struct timespec ltnow; + struct timespec ltnow = {0}; clock_gettime(CLOCK_REALTIME, <now); return ltnow; } @@ -99,7 +118,7 @@ time_t slapi_current_utc_time(void) { - struct timespec ltnow; + struct timespec ltnow = {0}; clock_gettime(CLOCK_REALTIME, <now); return ltnow.tv_sec; } @@ -108,8 +127,8 @@ slapi_timestamp_utc_hr(char *buf, size_t bufsize) { PR_ASSERT(bufsize >= SLAPI_TIMESTAMP_BUFSIZE); - struct timespec ltnow; - struct tm utctm; + struct timespec ltnow = {0}; + struct tm utctm = {0}; clock_gettime(CLOCK_REALTIME, <now); gmtime_r(&(ltnow.tv_sec), &utctm); strftime(buf, bufsize, "%Y%m%d%H%M%SZ", &utctm); @@ -140,7 +159,7 @@ { long tz; - struct tm *tmsp, tms; + struct tm *tmsp, tms = {0}; char tbuf[*bufsize]; char sign; /* make sure our buffer will be big enough. Need at least 29 */ @@ -191,7 +210,7 @@ { long tz; - struct tm *tmsp, tms; + struct tm *tmsp, tms = {0}; char tbuf[*bufsize]; char sign; /* make sure our buffer will be big enough. Need at least 39 */ @@ -278,7 +297,7 @@ if (expire->tv_sec == 0 && expire->tv_nsec == 0) { return TIMER_CONTINUE; } - struct timespec now; + struct timespec now = {0}; clock_gettime(CLOCK_MONOTONIC, &now); if (now.tv_sec > expire->tv_sec || (expire->tv_sec == now.tv_sec && now.tv_sec > expire->tv_nsec)) { @@ -293,7 +312,7 @@ in the syntax of a generalizedTime, except without the time zone. */ { char *into; - struct tm t; + struct tm t = {0}; localtime_r(&from, &t); @@ -362,7 +381,7 @@ in the syntax of a generalizedTime. */ { char *into; - struct tm t; + struct tm t = {0}; gmtime_r(&from, &t); into = slapi_ch_malloc(SLAPI_TIMESTAMP_BUFSIZE); @@ -382,7 +401,7 @@ read_genTime(struct berval *from) { struct tm t = {0}; - time_t retTime; + time_t retTime = {0}; time_t diffsec = 0; int i, gflag = 0, havesec = 0; diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/tools/dbscan.c 389-ds-base-1.4.4.3/ldap/servers/slapd/tools/dbscan.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/tools/dbscan.c 2020-04-16 13:49:07.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/tools/dbscan.c 2020-05-26 18:13:23.000000000 +0000 @@ -1133,7 +1133,7 @@ DBC *cursor = NULL; char *filename = NULL; DBT key = {0}, data = {0}; - int ret; + int ret = 0; char *find_key = NULL; uint32_t entry_id = 0xffffffff; int c; @@ -1210,23 +1210,27 @@ ret = db_env_create(&env, 0); if (ret != 0) { printf("Can't create dbenv: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } ret = env->open(env, NULL, DB_CREATE | DB_INIT_MPOOL | DB_PRIVATE, 0); if (ret != 0) { printf("Can't open dbenv: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } ret = db_create(&db, env, 0); if (ret != 0) { printf("Can't create db handle: %d\n", ret); - exit(1); + ret = 1; + goto done; } ret = db->open(db, NULL, filename, NULL, DB_UNKNOWN, DB_RDONLY, 0); if (ret != 0) { printf("Can't open db file '%s': %s\n", filename, db_strerror(ret)); - exit(1); + ret = 1; + goto done; } /* cursor through the db */ @@ -1234,16 +1238,19 @@ ret = db->cursor(db, NULL, &cursor, 0); if (ret != 0) { printf("Can't create db cursor: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } ret = cursor->c_get(cursor, &key, &data, DB_FIRST); if (ret == DB_NOTFOUND) { printf("Empty database!\n"); - exit(0); + ret = 0; + goto done; } if (ret != 0) { printf("Can't get first cursor: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } if (find_key) { @@ -1256,7 +1263,8 @@ ret = db->get(db, NULL, &key, &data, 0); if (ret != 0) { printf("Can't find key '%s'\n", find_key); - exit(1); + ret = 1; + goto done; } } if (file_type & ENTRYRDNINDEXTYPE) { @@ -1266,7 +1274,8 @@ if (ret != 0) { printf("Can't set cursor to returned item: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } do { display_item(cursor, &key, &data); @@ -1282,7 +1291,8 @@ if (ret != 0) { printf("Can't set cursor to returned item: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } display_item(cursor, &key, &data); key.size = 0; @@ -1299,31 +1309,15 @@ ret = cursor->c_get(cursor, &key, &data, DB_NEXT); if ((ret != 0) && (ret != DB_NOTFOUND)) { printf("Bizarre error: %s\n", db_strerror(ret)); - exit(1); + ret = 1; + goto done; } } + /* Success! Setting the return code to 0 */ + ret = 0; } } - if (key.data) { - free(key.data); - } - if (data.data) { - free(data.data); - } - - ret = cursor->c_close(cursor); - if (ret != 0) { - printf("Can't close the cursor (?!): %s\n", db_strerror(ret)); - exit(1); - } - - ret = db->close(db, 0); - if (ret != 0) { - printf("Unable to close db file: %s\n", db_strerror(ret)); - exit(1); - } - if (display_mode & SHOWSUMMARY) { if (allids_cnt > 0) { @@ -1359,11 +1353,30 @@ } } - ret = env->close(env, 0); - if (ret != 0) { - printf("Unable to shutdown libdb: %s\n", db_strerror(ret)); - exit(1); +done: + if (key.data) { + free(key.data); } - - return 0; + if (data.data) { + free(data.data); + } + if (cursor) { + if (cursor->c_close(cursor) != 0) { + printf("Can't close the cursor (?!): %s\n", db_strerror(1)); + return 1; + } + } + if (db) { + if (db->close(db, 0) != 0) { + printf("Unable to close db file: %s\n", db_strerror(1)); + return 1; + } + } + if (env) { + if (env->close(env, 0) != 0) { + printf("Unable to shutdown libdb: %s\n", db_strerror(1)); + return 1; + } + } + return ret; } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/util.c 389-ds-base-1.4.4.3/ldap/servers/slapd/util.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/util.c 2020-04-16 13:58:39.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/util.c 2020-05-29 20:19:44.000000000 +0000 @@ -471,7 +471,7 @@ void replace_char(char *str, char c, char c2) { - for (size_t i = 0; (str != NULL) && (str[i] != NULL); i++) { + for (size_t i = 0; (str != NULL) && (str[i] != '\0'); i++) { if (c == str[i]) { str[i] = c2; } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/valueset.c 389-ds-base-1.4.4.3/ldap/servers/slapd/valueset.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/valueset.c 2019-10-18 17:12:20.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/valueset.c 2020-05-26 18:13:23.000000000 +0000 @@ -801,6 +801,10 @@ } } } else { + /* empty valueset - reset the vs->num so that further + * checking will not abort + */ + vs->num = 0; slapi_valueset_done(vs); } diff -Nru 389-ds-base-1.4.3.6/ldap/servers/slapd/vattr.c 389-ds-base-1.4.4.3/ldap/servers/slapd/vattr.c --- 389-ds-base-1.4.3.6/ldap/servers/slapd/vattr.c 2020-03-26 18:56:32.000000000 +0000 +++ 389-ds-base-1.4.4.3/ldap/servers/slapd/vattr.c 2020-05-26 18:13:23.000000000 +0000 @@ -1996,7 +1996,7 @@ return ENOMEM; } - the_map->lock = slapi_new_rwlock(); + the_map->lock = slapi_new_rwlock_prio(1 /* priority on writers */); if (NULL == the_map) { slapd_nasty(sourcefile, 3, 0); return ENOMEM; diff -Nru 389-ds-base-1.4.3.6/Makefile.am 389-ds-base-1.4.4.3/Makefile.am --- 389-ds-base-1.4.3.6/Makefile.am 2020-04-16 14:16:44.000000000 +0000 +++ 389-ds-base-1.4.4.3/Makefile.am 2020-05-29 20:43:44.000000000 +0000 @@ -1159,7 +1159,7 @@ librewriters_la_LDFLAGS = $(AM_LDFLAGS) librewriters_la_CPPFLAGS = $(AM_CPPFLAGS) $(REWRITERS_INCLUDES) $(DSPLUGIN_CPPFLAGS) -librewriters_la_LIBADD = $(NSS_LINK) $(NSPR_LINK) +librewriters_la_LIBADD = libslapd.la $(NSS_LINK) $(NSPR_LINK) #------------------------ # libsvrcore diff -Nru 389-ds-base-1.4.3.6/rpm/389-ds-base.spec.in 389-ds-base-1.4.4.3/rpm/389-ds-base.spec.in --- 389-ds-base-1.4.3.6/rpm/389-ds-base.spec.in 2020-04-16 14:16:36.000000000 +0000 +++ 389-ds-base-1.4.4.3/rpm/389-ds-base.spec.in 2020-05-29 20:19:44.000000000 +0000 @@ -4,7 +4,7 @@ %global bundle_jemalloc __BUNDLE_JEMALLOC__ %if %{bundle_jemalloc} %global jemalloc_name jemalloc -%global jemalloc_ver 5.2.0 +%global jemalloc_ver 5.2.1 %endif # This is used in certain builds to help us know if it has extra features. @@ -289,7 +289,7 @@ Group: Development/Libraries Requires: krb5-workstation Requires: openssl -# This is for /usr/bin/c_rehash tool +# This is for /usr/bin/c_rehash tool, only needed for openssl < 1.1.0 Requires: openssl-perl Requires: iproute Requires: python%{python3_pkgversion} @@ -367,12 +367,30 @@ %endif %if %{bundle_jemalloc} +# Override page size, bz #1545539 +# 4K +%ifarch %ix86 %arm x86_64 s390x +%define lg_page --with-lg-page=12 +%endif + +# 64K +%ifarch ppc64 ppc64le aarch64 +%define lg_page --with-lg-page=16 +%endif + +# Override huge page size on aarch64 +# 2M instead of 512M +%ifarch aarch64 +%define lg_hugepage --with-lg-hugepage=21 +%endif + # Build jemalloc pushd ../%{jemalloc_name}-%{jemalloc_ver} %configure \ --libdir=%{_libdir}/%{pkgname}/lib \ - --bindir=%{_libdir}/%{pkgname}/bin -make + --bindir=%{_libdir}/%{pkgname}/bin \ + --enable-prof %{lg_page} %{lg_hugepage} +make %{?_smp_mflags} popd %endif @@ -430,8 +448,8 @@ mkdir -p $RPM_BUILD_ROOT/var/log/%{pkgname} mkdir -p $RPM_BUILD_ROOT/var/lib/%{pkgname} -mkdir -p $RPM_BUILD_ROOT/var/lock/%{pkgname} -mkdir -p $RPM_BUILD_ROOT/dev/shm/%{pkgname} +mkdir -p $RPM_BUILD_ROOT/var/lock/%{pkgname} \ + && chmod 770 $RPM_BUILD_ROOT/var/lock/%{pkgname} # for systemd mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemd/system/%{groupname}.wants @@ -637,7 +655,6 @@ %{_prefix}/lib/sysctl.d/* %dir %{_localstatedir}/lib/%{pkgname} %dir %{_localstatedir}/log/%{pkgname} -%dir /dev/shm/%{pkgname} %ghost %dir %{_localstatedir}/lock/%{pkgname} %exclude %{_sbindir}/ldap-agent* %exclude %{_mandir}/man1/ldap-agent.1.gz @@ -1038,20 +1055,20 @@ Ticket #196 RFE: Interpret IPV6 addresses for ACIs, replication, and chaining Ticket #218 RFE - Make RIP working with Replicated Entries Ticket #328 make sure all internal search filters are properly escaped -Ticket #329 389-admin build fails on F-18 with new apache +Ticket #329 389-admin build fails on F-18 with new apache Ticket #344 deadlock in replica_write_ruv Ticket #351 use betxn plugins by default Ticket #352 make cos, roles, views betxn aware Ticket #356 logconv.pl - RFE - track bind info Ticket #365 Audit log - clear text password in user changes Ticket #370 Opening merge qualifier CoS entry using RHDS console changes the entry. -Ticket #372 Setting nsslapd-listenhost or nsslapd-securelistenhost breaks ACI processing -Ticket #386 Overconsumption of memory with large cachememsize and heavy use of ldapmodify -Ticket #402 unhashedTicket #userTicket #password in entry extension -Ticket #408 Create a normalized dn cache -Ticket #453 db2index with -tattrname:type,type fails -Ticket #461 fix build problem with mozldap c sdk -Ticket #462 add test for include file mntent.h +Ticket #372 Setting nsslapd-listenhost or nsslapd-securelistenhost breaks ACI processing +Ticket #386 Overconsumption of memory with large cachememsize and heavy use of ldapmodify +Ticket #402 unhashedTicket #userTicket #password in entry extension +Ticket #408 Create a normalized dn cache +Ticket #453 db2index with -tattrname:type,type fails +Ticket #461 fix build problem with mozldap c sdk +Ticket #462 add test for include file mntent.h Ticket #463 different parameters of getmntent in Solaris * Tue Sep 25 2012 Rich Megginson - 1.2.11.15-1 diff -Nru 389-ds-base-1.4.3.6/src/cockpit/389-console/cockpit_dist/index.js 389-ds-base-1.4.4.3/src/cockpit/389-console/cockpit_dist/index.js --- 389-ds-base-1.4.3.6/src/cockpit/389-console/cockpit_dist/index.js 1970-01-01 00:00:00.000000000 +0000 +++ 389-ds-base-1.4.4.3/src/cockpit/389-console/cockpit_dist/index.js 2020-05-29 20:45:12.000000000 +0000 @@ -0,0 +1,230934 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/array/from.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/array/from.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/array/from */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/from.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/array/is-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/is-array.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/assign.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/assign.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/assign */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/assign.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/create.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/create.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/create.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/define-property.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/define-property.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/define-property */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/define-property.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/entries.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/entries.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/entries */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/entries.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptor.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptor.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/get-own-property-descriptor */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/get-own-property-descriptor.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/keys.js": +/*!********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/keys.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/keys.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/object/values.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/object/values.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/object/values */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/values.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/parse-int.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/parse-int.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/parse-int */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/parse-int.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/symbol.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/symbol.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/symbol */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/index.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js": +/*!************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/symbol/iterator */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/iterator.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/core-js/weak-map.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/core-js/weak-map.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! core-js/library/fn/weak-map */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/weak-map.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/esm/assertThisInitialized.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/esm/assertThisInitialized.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _assertThisInitialized; }); +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/esm/extends.js": +/*!********************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/esm/extends.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _extends; }); +/* harmony import */ var _core_js_object_assign__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core-js/object/assign */ "./node_modules/@babel/runtime-corejs2/core-js/object/assign.js"); +/* harmony import */ var _core_js_object_assign__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_core_js_object_assign__WEBPACK_IMPORTED_MODULE_0__); + +function _extends() { + _extends = _core_js_object_assign__WEBPACK_IMPORTED_MODULE_0___default.a || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/esm/inheritsLoose.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/esm/inheritsLoose.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _inheritsLoose; }); +/* harmony import */ var _core_js_object_create__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core-js/object/create */ "./node_modules/@babel/runtime-corejs2/core-js/object/create.js"); +/* harmony import */ var _core_js_object_create__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_core_js_object_create__WEBPACK_IMPORTED_MODULE_0__); + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = _core_js_object_create__WEBPACK_IMPORTED_MODULE_0___default()(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/esm/objectWithoutPropertiesLoose.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/esm/objectWithoutPropertiesLoose.js ***! + \*****************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _objectWithoutPropertiesLoose; }); +/* harmony import */ var _core_js_object_keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core-js/object/keys */ "./node_modules/@babel/runtime-corejs2/core-js/object/keys.js"); +/* harmony import */ var _core_js_object_keys__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_core_js_object_keys__WEBPACK_IMPORTED_MODULE_0__); + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + + var sourceKeys = _core_js_object_keys__WEBPACK_IMPORTED_MODULE_0___default()(source); + + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/extends.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/extends.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _Object$assign = __webpack_require__(/*! ../core-js/object/assign */ "./node_modules/@babel/runtime-corejs2/core-js/object/assign.js"); + +function _extends() { + module.exports = _extends = _Object$assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +module.exports = _extends; + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/interopRequireWildcard.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/interopRequireWildcard.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _Object$getOwnPropertyDescriptor = __webpack_require__(/*! ../core-js/object/get-own-property-descriptor */ "./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptor.js"); + +var _Object$defineProperty = __webpack_require__(/*! ../core-js/object/define-property */ "./node_modules/@babel/runtime-corejs2/core-js/object/define-property.js"); + +var _typeof = __webpack_require__(/*! ../helpers/typeof */ "./node_modules/@babel/runtime-corejs2/helpers/typeof.js"); + +var _WeakMap = __webpack_require__(/*! ../core-js/weak-map */ "./node_modules/@babel/runtime-corejs2/core-js/weak-map.js"); + +function _getRequireWildcardCache() { + if (typeof _WeakMap !== "function") return null; + var cache = new _WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + _Object$defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +module.exports = _interopRequireWildcard; + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/helpers/typeof.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/helpers/typeof.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _Symbol$iterator = __webpack_require__(/*! ../core-js/symbol/iterator */ "./node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js"); + +var _Symbol = __webpack_require__(/*! ../core-js/symbol */ "./node_modules/@babel/runtime-corejs2/core-js/symbol.js"); + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof _Symbol === "function" && typeof _Symbol$iterator === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof _Symbol === "function" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +module.exports = _typeof; + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/from.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/from.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.string.iterator */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../../modules/es6.array.from */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.from.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Array.from; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/is-array.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/is-array.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.array.is-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.is-array.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Array.isArray; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/assign.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/assign.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.object.assign */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.assign.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object.assign; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/create.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/create.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.object.create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.create.js"); +var $Object = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object; +module.exports = function create(P, D) { + return $Object.create(P, D); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/define-property.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/define-property.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.object.define-property */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.define-property.js"); +var $Object = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object; +module.exports = function defineProperty(it, key, desc) { + return $Object.defineProperty(it, key, desc); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/entries.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/entries.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es7.object.entries */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.entries.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object.entries; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/get-own-property-descriptor.js": +/*!*******************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/get-own-property-descriptor.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.object.get-own-property-descriptor */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js"); +var $Object = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object; +module.exports = function getOwnPropertyDescriptor(it, key) { + return $Object.getOwnPropertyDescriptor(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/keys.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/keys.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.object.keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.keys.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object.keys; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/values.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/values.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es7.object.values */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.values.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Object.values; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/parse-int.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/parse-int.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.parse-int */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.parse-int.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").parseInt; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/index.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/index.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.symbol */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.symbol.js"); +__webpack_require__(/*! ../../modules/es6.object.to-string */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js"); +__webpack_require__(/*! ../../modules/es7.symbol.async-iterator */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.async-iterator.js"); +__webpack_require__(/*! ../../modules/es7.symbol.observable */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.observable.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").Symbol; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/iterator.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/iterator.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es6.string.iterator */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../../modules/web.dom.iterable */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js"); +module.exports = __webpack_require__(/*! ../../modules/_wks-ext */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js").f('iterator'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/weak-map.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/weak-map.js ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js"); +__webpack_require__(/*! ../modules/web.dom.iterable */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js"); +__webpack_require__(/*! ../modules/es6.weak-map */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.weak-map.js"); +__webpack_require__(/*! ../modules/es7.weak-map.of */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.of.js"); +__webpack_require__(/*! ../modules/es7.weak-map.from */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.from.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").WeakMap; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function () { /* empty */ }; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-includes.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-includes.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// false -> Array#indexOf +// true -> Array#includes +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-absolute-index.js"); +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-methods.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-methods.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js"); +var asc = __webpack_require__(/*! ./_array-species-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-create.js"); +module.exports = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || asc; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IObject(O); + var f = ctx(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-constructor.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-constructor.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('species'); + +module.exports = function (original) { + var C; + if (isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-create.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-create.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) +var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-species-constructor.js"); + +module.exports = function (original, length) { + return new (speciesConstructor(original))(length); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('toStringTag'); +// ES3 wrong here +var ARG = cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +module.exports = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection-weak.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection-weak.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js"); +var getWeak = __webpack_require__(/*! ./_meta */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js").getWeak; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js"); +var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-methods.js"); +var $has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_validate-collection.js"); +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); +}; +var UncaughtFrozenStore = function () { + this.a = []; +}; +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); +}; +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); + return data && $has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); + return data && $has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js").f; +var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-methods.js")(0); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js"); + +module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + redefineAll(C.prototype, methods); + meta.NEED = true; + } else { + C = wrapper(function (target, iterable) { + anInstance(target, C, NAME, '_c'); + target._c = new Base(); + if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target); + }); + each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) { + var IS_ADDER = KEY == 'add' || KEY == 'set'; + if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) { + anInstance(this, C, KEY); + if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false; + var result = this._c[KEY](a === 0 ? 0 : a, b); + return IS_ADDER ? this : result; + }); + }); + IS_WEAK || dP(C.prototype, 'size', { + get: function () { + return this._c.size; + } + }); + } + + setToStringTag(C, NAME); + + O[NAME] = C; + $export($export.G + $export.W + $export.F, O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.6.11' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_create-property.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_create-property.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"); + +module.exports = function (object, index, value) { + if (index in object) $defineProperty.f(object, index, createDesc(0, value)); + else object[index] = value; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// optional / simple context binding +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js"); +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var document = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js").document; +// typeof document.createElement is 'object' in old IE +var is = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return is ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-keys.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-keys.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all enumerable object keys, includes symbols +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js"); +module.exports = function (it) { + var result = getKeys(it); + var getSymbols = gOPS.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = pIE.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var IS_WRAP = type & $export.W; + var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports[PROTOTYPE]; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]; + var key, own, out; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + if (own && has(exports, key)) continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function (C) { + var F = function (a, b, c) { + if (this instanceof C) { + switch (arguments.length) { + case 0: return new C(); + case 1: return new C(a); + case 2: return new C(a, b); + } return new C(a, b, c); + } return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% + if (IS_PROTO) { + (exports.virtual || (exports.virtual = {}))[key] = out; + // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% + if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out); + } + } +}; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js"); +var BREAK = {}; +var RETURN = {}; +var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = call(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"); +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js") ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js").document; +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js")('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js"); +// eslint-disable-next-line no-prototype-builtins +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return cof(it) == 'String' ? it.split('') : Object(it); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('iterator'); +var ArrayProto = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.2 IsArray(argument) +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js"); +module.exports = Array.isArray || function isArray(arg) { + return cof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// call something on iterator step with safe closing on error +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +module.exports = function (iterator, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) anObject(ret.call(iterator)); + throw e; + } +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-create.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-create.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js"); +var descriptor = __webpack_require__(/*! ./_property-desc */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js"); +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +__webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('iterator'), function () { return this; }); + +module.exports = function (Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + ' Iterator'); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"); +var $iterCreate = __webpack_require__(/*! ./_iter-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-create.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gpo.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-detect.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-detect.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function () { SAFE_CLOSING = true; }; + // eslint-disable-next-line no-throw-literal + Array.from(riter, function () { throw 2; }); +} catch (e) { /* empty */ } + +module.exports = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-step.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-step.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (done, value) { + return { value: value, done: !!done }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = true; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var META = __webpack_require__(/*! ./_uid */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js")('meta'); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var setDesc = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js").f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !__webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js")(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-assign.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-assign.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.2.1 Object.assign(target, source, ...) +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js"); +var $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !$assign || __webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js")(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = gOPS.f; + var isEnum = pIE.f; + while (aLen > index) { + var S = IObject(arguments[index++]); + var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var dPs = __webpack_require__(/*! ./_object-dps */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dps.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js")('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = __webpack_require__(/*! ./_dom-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js")('iframe'); + var i = enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + __webpack_require__(/*! ./_html */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js").appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js"); +var dP = Object.defineProperty; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dps.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dps.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); + +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) dP.f(O, P = keys[i++], Properties[P]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js"); +var gOPD = Object.getOwnPropertyDescriptor; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = toIObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn-ext.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn-ext.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js").f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return $keys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gpo.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gpo.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js")('IE_PROTO'); +var ObjectProto = Object.prototype; + +module.exports = Object.getPrototypeOf || function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-includes.js")(false); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js")('IE_PROTO'); + +module.exports = function (object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = {}.propertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// most Object methods by ES6 should accept primitives +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"); +module.exports = function (KEY, exec) { + var fn = (core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-to-array.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-to-array.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var isEnum = __webpack_require__(/*! ./_object-pie */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js").f; +module.exports = function (isEntries) { + return function (it) { + var O = toIObject(it); + var keys = getKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || isEnum.call(O, key)) { + result.push(isEntries ? [key, O[key]] : O[key]); + } + } + return result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_parse-int.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_parse-int.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseInt = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js").parseInt; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-trim.js").trim; +var ws = __webpack_require__(/*! ./_string-ws */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-ws.js"); +var hex = /^[-+]?0[xX]/; + +module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { + var string = $trim(String(str), 3); + return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); +module.exports = function (target, src, safe) { + for (var key in src) { + if (safe && target[key]) target[key] = src[key]; + else hide(target, key, src[key]); + } return target; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-from.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-from.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-setmap-offrom/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js"); + +module.exports = function (COLLECTION) { + $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) { + var mapFn = arguments[1]; + var mapping, A, n, cb; + aFunction(this); + mapping = mapFn !== undefined; + if (mapping) aFunction(mapFn); + if (source == undefined) return new this(); + A = []; + if (mapping) { + n = 0; + cb = ctx(mapFn, arguments[2], 2); + forOf(source, false, function (nextItem) { + A.push(cb(nextItem, n++)); + }); + } else { + forOf(source, false, A.push, A); + } + return new this(A); + } }); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-of.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-of.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-setmap-offrom/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); + +module.exports = function (COLLECTION) { + $export($export.S, COLLECTION, { of: function of() { + var length = arguments.length; + var A = new Array(length); + while (length--) A[length] = arguments[length]; + return new this(A); + } }); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var def = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js").f; +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('toStringTag'); + +module.exports = function (it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js")('keys'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"); +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(/*! ./_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __webpack_require__(/*! ./_library */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-at.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-at.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js"); +// true -> String#at +// false -> String#codePointAt +module.exports = function (TO_STRING) { + return function (that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-trim.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-trim.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"); +var spaces = __webpack_require__(/*! ./_string-ws */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-ws.js"); +var space = '[' + spaces + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = fails(function () { + return !!spaces[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; + if (ALIAS) exp[ALIAS] = fn; + $export($export.P + $export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +module.exports = exporter; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-ws.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-ws.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-absolute-index.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-absolute-index.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js"); +module.exports = function (it) { + return IObject(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.15 ToLength +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"); +var min = Math.min; +module.exports = function (it) { + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.13 ToObject(argument) +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js"); +module.exports = function (it) { + return Object(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var px = Math.random(); +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_validate-collection.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_validate-collection.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +module.exports = function (it, TYPE) { + if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js"); +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js"); +var defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js").f; +module.exports = function (name) { + var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports.f = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ./_shared */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js")('wks'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"); +var Symbol = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js").Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('iterator'); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"); +module.exports = __webpack_require__(/*! ./_core */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js").getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.from.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.from.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_create-property.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js"); + +$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-detect.js")(function (iter) { Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = getIterFn(O); + var length, result, step, iterator; + if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = toLength(O.length); + for (result = new C(length); length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.is-array.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.is-array.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.2.2 / 15.4.3.2 Array.isArray(arg) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); + +$export($export.S, 'Array', { isArray: __webpack_require__(/*! ./_is-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js") }); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.iterator.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.iterator.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-step.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = __webpack_require__(/*! ./_iter-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) { + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return step(1); + } + if (kind == 'keys') return step(0, index); + if (kind == 'values') return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.assign.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.assign.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.1 Object.assign(target, source) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); + +$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-assign.js") }); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.create.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.create.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +$export($export.S, 'Object', { create: __webpack_require__(/*! ./_object-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js") }); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.define-property.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.define-property.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js"), 'Object', { defineProperty: __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js").f }); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js": +/*!****************************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js ***! + \****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js").f; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js")('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(toIObject(it), key); + }; +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.keys.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.keys.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 Object.keys(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js")('keys', function () { + return function keys(it) { + return $keys(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.parse-int.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.parse-int.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_parse-int.js"); +// 18.2.5 parseInt(string, radix) +$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-at.js")(true); + +// 21.1.3.27 String.prototype[@@iterator]() +__webpack_require__(/*! ./_iter-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js")(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.symbol.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.symbol.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// ECMAScript 6 symbols shim +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js"); +var META = __webpack_require__(/*! ./_meta */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js").KEY; +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"); +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js"); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js"); +var wksDefine = __webpack_require__(/*! ./_wks-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js"); +var enumKeys = __webpack_require__(/*! ./_enum-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-keys.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"); +var _create = __webpack_require__(/*! ./_object-create */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js"); +var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn-ext.js"); +var $GOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js"); +var $GOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js"); +var $DP = __webpack_require__(/*! ./_object-dp */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"); +var gOPD = $GOPD.f; +var dP = $DP.f; +var gOPN = gOPNExt.f; +var $Symbol = global.Symbol; +var $JSON = global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE = 'prototype'; +var HIDDEN = wks('_hidden'); +var TO_PRIMITIVE = wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var OPSymbols = shared('op-symbols'); +var ObjectProto = Object[PROTOTYPE]; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; +var QObject = global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = DESCRIPTORS && $fails(function () { + return _create(dP({}, 'a', { + get: function () { return dP(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD(ObjectProto, key); + if (protoDesc) delete ObjectProto[key]; + dP(it, key, D); + if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); +} : dP; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto) $defineProperty(OPSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _create(D, { enumerable: createDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _create(it) : $defineProperties(_create(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = toPrimitive(key, true)); + if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIObject(it); + key = toPrimitive(key, true); + if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; + var D = gOPD(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN(toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto; + var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto) $set.call(OPSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + }; + if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return this._k; + }); + + $GOPD.f = $getOwnPropertyDescriptor; + $DP.f = $defineProperty; + __webpack_require__(/*! ./_object-gopn */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames; + __webpack_require__(/*! ./_object-pie */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js").f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; + + if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js")) { + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + wksExt.f = function (name) { + return wrap(wks(name)); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); + +for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); + +$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +$export($export.S + $export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +setToStringTag(global.JSON, 'JSON', true); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.weak-map.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.weak-map.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-methods.js")(0); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js"); +var assign = __webpack_require__(/*! ./_object-assign */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-assign.js"); +var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection-weak.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_validate-collection.js"); +var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_validate-collection.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var WEAK_MAP = 'WeakMap'; +var getWeak = meta.getWeak; +var isExtensible = Object.isExtensible; +var uncaughtFrozenStore = weak.ufstore; +var InternalMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return weak.def(validate(this, WEAK_MAP), key, value); + } +}; + +// 23.3 WeakMap Objects +var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); + +// IE11 WeakMap frozen keys fix +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = weak.getConstructor(wrapper, WEAK_MAP); + assign(InternalMap.prototype, methods); + meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); +} + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.entries.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.entries.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-object-values-entries +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var $entries = __webpack_require__(/*! ./_object-to-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-to-array.js")(true); + +$export($export.S, 'Object', { + entries: function entries(it) { + return $entries(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.values.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.object.values.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-object-values-entries +var $export = __webpack_require__(/*! ./_export */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js"); +var $values = __webpack_require__(/*! ./_object-to-array */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-to-array.js")(false); + +$export($export.S, 'Object', { + values: function values(it) { + return $values(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.async-iterator.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.async-iterator.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_wks-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js")('asyncIterator'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.observable.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.observable.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_wks-define */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js")('observable'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.from.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.from.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from +__webpack_require__(/*! ./_set-collection-from */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-from.js")('WeakMap'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.of.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.weak-map.of.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of +__webpack_require__(/*! ./_set-collection-of */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-collection-of.js")('WeakMap'); + + +/***/ }), + +/***/ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./es6.array.iterator */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.iterator.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"); +var TO_STRING_TAG = __webpack_require__(/*! ./_wks */ "./node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js")('toStringTag'); + +var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + + 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + + 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + + 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + + 'TextTrackList,TouchList').split(','); + +for (var i = 0; i < DOMIterables.length; i++) { + var NAME = DOMIterables[i]; + var Collection = global[NAME]; + var proto = Collection && Collection.prototype; + if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = Iterators.Array; +} + + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _extends; }); +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _inheritsLoose; }); +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _objectWithoutPropertiesLoose; }); +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/extends.js": +/*!********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/extends.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _extends() { + module.exports = _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +module.exports = _extends; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/contains.js": +/*!***************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/contains.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return contains; }); +function contains(parent, child) { + // $FlowFixMe: hasOwnProperty doesn't seem to work in tests + var isShadow = Boolean(child.getRootNode && child.getRootNode().host); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (isShadow) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getBorders.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getBorders.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBorders; }); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + + +function toNumber(cssValue) { + return parseFloat(cssValue) || 0; +} + +function getBorders(element) { + var computedStyle = Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__["isHTMLElement"])(element) ? Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element) : {}; + return { + top: toNumber(computedStyle.borderTopWidth), + right: toNumber(computedStyle.borderRightWidth), + bottom: toNumber(computedStyle.borderBottomWidth), + left: toNumber(computedStyle.borderLeftWidth) + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBoundingClientRect; }); +function getBoundingClientRect(element) { + var rect = element.getBoundingClientRect(); + return { + width: rect.width, + height: rect.height, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + left: rect.left, + x: rect.left, + y: rect.top + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getClippingRect; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _getViewportRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getViewportRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js"); +/* harmony import */ var _getDocumentRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js"); +/* harmony import */ var _listScrollParents_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); +/* harmony import */ var _getOffsetParent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getDecorations_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getDecorations.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDecorations.js"); +/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); +/* harmony import */ var _utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); + + + + + + + + + + + + + +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === _enums_js__WEBPACK_IMPORTED_MODULE_0__["viewport"] ? Object(_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_11__["default"])(Object(_getViewportRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) : Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isHTMLElement"])(clippingParent) ? Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__["default"])(clippingParent) : Object(_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_11__["default"])(Object(_getDocumentRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element))); +} // A "clipping parent" is an overflowable container with the characteristic of +// clipping (or hiding) overflowing elements with a position different from +// `initial` + + +function getClippingParents(element) { + var clippingParents = Object(_listScrollParents_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element).position) >= 0; + var clipperElement = canEscapeClipping && Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isHTMLElement"])(element) ? Object(_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element) : element; + + if (!Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isElement"])(clipperElement)) { + return []; + } // $FlowFixMe: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isElement"])(clippingParent) && Object(_contains_js__WEBPACK_IMPORTED_MODULE_10__["default"])(clippingParent, clipperElement); + }); +} // Gets the maximum area that the element is visible in due to any number of +// clipping parents + + +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + var decorations = Object(_getDecorations_js__WEBPACK_IMPORTED_MODULE_9__["default"])(Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isHTMLElement"])(clippingParent) ? clippingParent : Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element)); + accRect.top = Math.max(rect.top + decorations.top, accRect.top); + accRect.right = Math.min(rect.right - decorations.right, accRect.right); + accRect.bottom = Math.min(rect.bottom - decorations.bottom, accRect.bottom); + accRect.left = Math.max(rect.left + decorations.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCompositeRect; }); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getNodeScroll_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getNodeScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); + + + + + + // Returns the composite rect of an element relative to its offsetParent. +// Composite means it takes into account transforms as well as layout. + +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var documentElement; + var rect = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrVirtualElement); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (!isFixed) { + if (Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent) !== 'body') { + scroll = Object(_getNodeScroll_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent); + } + + if (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(offsetParent)) { + offsets = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(offsetParent); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement = Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(offsetParent)) { + offsets.x = Object(_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_4__["default"])(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getComputedStyle; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +function getComputedStyle(element) { + return Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element).getComputedStyle(element); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDecorations.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getDecorations.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDecorations; }); +/* harmony import */ var _getBorders_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBorders.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBorders.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); + + + + // Borders + scrollbars + +function getDecorations(element) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element); + var borders = Object(_getBorders_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var isHTML = Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element) === 'html'; + var winScrollBarX = Object(_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); + var x = element.clientWidth + borders.right; + var y = element.clientHeight + borders.bottom; // HACK: + // document.documentElement.clientHeight on iOS reports the height of the + // viewport including the bottom bar, even if the bottom bar isn't visible. + // If the difference between window innerHeight and html clientHeight is more + // than 50, we assume it's a mobile bottom bar and ignore scrollbars. + // * A 50px thick scrollbar is likely non-existent (macOS is 15px and Windows + // is about 17px) + // * The mobile bar is 114px tall + + if (isHTML && win.innerHeight - element.clientHeight > 50) { + y = win.innerHeight - borders.bottom; + } + + return { + top: isHTML ? 0 : element.clientTop, + right: // RTL scrollbar (scrolling containers only) + element.clientLeft > borders.left ? borders.right : // LTR scrollbar + isHTML ? win.innerWidth - x - winScrollBarX : element.offsetWidth - x, + bottom: isHTML ? win.innerHeight - y : element.offsetHeight - y, + left: isHTML ? winScrollBarX : element.clientLeft + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDocumentElement; }); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + +function getDocumentElement(element) { + // $FlowFixMe: assume body is always available + return (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__["isElement"])(element) ? element.ownerDocument : element.document).documentElement; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDocumentRect; }); +/* harmony import */ var _getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCompositeRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); + + + + +function getDocumentRect(element) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element); + var winScroll = Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); + var documentRect = Object(_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element), win); + documentRect.height = Math.max(documentRect.height, win.innerHeight); + documentRect.width = Math.max(documentRect.width, win.innerWidth); + documentRect.x = -winScroll.scrollLeft; + documentRect.y = -winScroll.scrollTop; + return documentRect; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getHTMLElementScroll; }); +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getLayoutRect; }); +// Returns the layout rect of an element relative to its offsetParent. Layout +// means it doesn't take into account transforms. +function getLayoutRect(element) { + return { + x: element.offsetLeft, + y: element.offsetTop, + width: element.offsetWidth, + height: element.offsetHeight + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js": +/*!******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getNodeName; }); +function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getNodeScroll; }); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHTMLElementScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js"); + + + + +function getNodeScroll(node) { + if (node === Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node) || !Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_2__["isHTMLElement"])(node)) { + return Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node); + } else { + return Object(_getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node); + } +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getOffsetParent; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _isTableElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isTableElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js"); + + + + + + +function getTrueOffsetParent(element) { + if (!Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(element) || // https://github.com/popperjs/popper-core/issues/837 + Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).position === 'fixed') { + return null; + } + + return element.offsetParent; +} + +function getOffsetParent(element) { + var window = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var offsetParent = getTrueOffsetParent(element); // Find the nearest non-table offsetParent + + while (offsetParent && Object(_isTableElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent)) { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent) === 'body' && Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent).position === 'static') { + return window; + } + + return offsetParent || window; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getParentNode; }); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); + + +function getParentNode(element) { + if (Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element) === 'html') { + return element; + } + + return (// $FlowFixMe: this is a quicker (but less type safe) way to save quite some bytes from the bundle + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || // DOM Element detected + // $FlowFixMe: need a better way to handle this... + element.host || // ShadowRoot detected + // $FlowFixMe: HTMLElement is a Node + Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element) // fallback + + ); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getScrollParent; }); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + + + +function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node)) >= 0) { + // $FlowFixMe: assume body is always available + return node.ownerDocument.body; + } + + if (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(node)) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) { + return node; + } + } + + return getScrollParent(Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node)); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getViewportRect; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +function getViewportRect(element) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var visualViewport = win.visualViewport; + var width = win.innerWidth; + var height = win.innerHeight; // We don't know which browsers have buggy or odd implementations of this, so + // for now we're only applying it to iOS to fix the keyboard issue. + // Investigation required + + if (visualViewport && /iPhone|iPod|iPad/.test(navigator.platform)) { + width = visualViewport.width; + height = visualViewport.height; + } + + return { + width: width, + height: height, + x: 0, + y: 0 + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js": +/*!****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getWindow; }); +/*:: import type { Window } from '../types'; */ + +/*:: declare function getWindow(node: Node | Window): Window; */ +function getWindow(node) { + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView : window; + } + + return node; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getWindowScroll; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +function getWindowScroll(node) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getWindowScrollBarX; }); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); + + + +function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)).left + Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).scrollLeft; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js ***! + \*****************************************************************/ +/*! exports provided: isElement, isHTMLElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return isElement; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHTMLElement", function() { return isHTMLElement; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +/*:: declare function isElement(node: mixed): boolean %checks(node instanceof + Element); */ + +function isElement(node) { + var OwnElement = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +/*:: declare function isHTMLElement(node: mixed): boolean %checks(node instanceof + HTMLElement); */ + + +function isHTMLElement(node) { + var OwnElement = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isTableElement; }); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); + +function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) >= 0; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js": +/*!************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return listScrollParents; }); +/* harmony import */ var _getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js"); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + + + + +function listScrollParents(element, list) { + if (list === void 0) { + list = []; + } + + var scrollParent = Object(_getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var isBody = Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(scrollParent) === 'body'; + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_1__["default"])(target))); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/enums.js": +/*!**************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/enums.js ***! + \**************************************************/ +/*! exports provided: top, bottom, right, left, auto, basePlacements, start, end, clippingParents, viewport, popper, reference, variationPlacements, placements, beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite, modifierPhases */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "top", function() { return top; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bottom", function() { return bottom; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "right", function() { return right; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "left", function() { return left; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auto", function() { return auto; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basePlacements", function() { return basePlacements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "start", function() { return start; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "end", function() { return end; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clippingParents", function() { return clippingParents; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "viewport", function() { return viewport; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "popper", function() { return popper; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reference", function() { return reference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "variationPlacements", function() { return variationPlacements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "placements", function() { return placements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeRead", function() { return beforeRead; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "read", function() { return read; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterRead", function() { return afterRead; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeMain", function() { return beforeMain; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "main", function() { return main; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterMain", function() { return afterMain; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeWrite", function() { return beforeWrite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "write", function() { return write; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterWrite", function() { return afterWrite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modifierPhases", function() { return modifierPhases; }); +var top = 'top'; +var bottom = 'bottom'; +var right = 'right'; +var left = 'left'; +var auto = 'auto'; +var basePlacements = [top, bottom, right, left]; +var start = 'start'; +var end = 'end'; +var clippingParents = 'clippingParents'; +var viewport = 'viewport'; +var popper = 'popper'; +var reference = 'reference'; +var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); // modifiers that need to read the DOM + +var beforeRead = 'beforeRead'; +var read = 'read'; +var afterRead = 'afterRead'; // pure-logic modifiers + +var beforeMain = 'beforeMain'; +var main = 'main'; +var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + +var beforeWrite = 'beforeWrite'; +var write = 'write'; +var afterWrite = 'afterWrite'; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/index.js": +/*!**************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/index.js ***! + \**************************************************/ +/*! exports provided: top, bottom, right, left, auto, basePlacements, start, end, clippingParents, viewport, popper, reference, variationPlacements, placements, beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite, modifierPhases, popperGenerator, createPopper */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return popperGenerator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return createPopper; }); +/* harmony import */ var _dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-utils/getCompositeRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dom-utils/listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/orderModifiers.js */ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js"); +/* harmony import */ var _utils_debounce_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/debounce.js */ "./node_modules/@popperjs/core/lib/utils/debounce.js"); +/* harmony import */ var _utils_validateModifiers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/validateModifiers.js */ "./node_modules/@popperjs/core/lib/utils/validateModifiers.js"); +/* harmony import */ var _utils_uniqueBy_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/uniqueBy.js */ "./node_modules/@popperjs/core/lib/utils/uniqueBy.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/mergeByName.js */ "./node_modules/@popperjs/core/lib/utils/mergeByName.js"); +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "top", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["top"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bottom", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["bottom"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "right", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["right"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "left", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["left"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auto", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["auto"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basePlacements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["basePlacements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "start", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["start"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "end", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["end"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clippingParents", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["clippingParents"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "viewport", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["viewport"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popper", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["popper"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reference", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["reference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variationPlacements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["variationPlacements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "placements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["placements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeRead", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["beforeRead"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "read", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["read"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterRead", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["afterRead"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeMain", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["beforeMain"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "main", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["main"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterMain", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["afterMain"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeWrite", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["beforeWrite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "write", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["write"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterWrite", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["afterWrite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "modifierPhases", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_12__["modifierPhases"]; }); + + + + + + + + + + + + + + + +var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; +var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; +var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' +}; + +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); +} + +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, {}, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(options) { + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, {}, state.options, {}, options); + state.scrollParents = { + reference: Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_11__["isElement"])(reference) ? Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(reference) : reference.contextElement ? Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(reference.contextElement) : [], + popper: Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = Object(_utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_10__["default"])([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + // if one of the modifiers is invalid for any reason + + if (true) { + var modifiers = Object(_utils_uniqueBy_js__WEBPACK_IMPORTED_MODULE_8__["default"])([].concat(orderedModifiers, state.options.modifiers), function (_ref) { + var name = _ref.name; + return name; + }); + Object(_utils_validateModifiers_js__WEBPACK_IMPORTED_MODULE_7__["default"])(modifiers); + + if (Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_9__["default"])(state.options.placement) === _enums_js__WEBPACK_IMPORTED_MODULE_12__["auto"]) { + var flipModifier = state.orderedModifiers.find(function (_ref2) { + var name = _ref2.name; + return name === 'flip'; + }); + + if (!flipModifier) { + console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); + } + } + + var _getComputedStyle = Object(_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(popper), + marginTop = _getComputedStyle.marginTop, + marginRight = _getComputedStyle.marginRight, + marginBottom = _getComputedStyle.marginBottom, + marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can + // cause bugs with positioning, so we'll warn the consumer + + + if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { + return parseFloat(margin); + })) { + console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); + } + } + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: Object(_dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(reference, Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper), state.options.strategy === 'fixed'), + popper: Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + var __debug_loops__ = 0; + + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (true) { + __debug_loops__ += 1; + + if (__debug_loops__ > 100) { + console.error(INFINITE_LOOP_ERROR); + break; + } + } + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: Object(_utils_debounce_js__WEBPACK_IMPORTED_MODULE_6__["default"])(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; +} +var createPopper = /*#__PURE__*/popperGenerator(); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/arrow.js": +/*!************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/arrow.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); +/* harmony import */ var _utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); +/* harmony import */ var _utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + + + + + + + + + +function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.placement); + var axis = Object(_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(basePlacement); + var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_8__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_8__["right"]].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = state.modifiersData[name + "#persistent"].padding; + var arrowRect = Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arrowElement); + var minProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_8__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_8__["left"]; + var maxProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_8__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_8__["right"]; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = state.elements.arrow && Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(state.elements.arrow); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_5__["default"])(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); +} + +function effect(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element, + _options$padding = options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (!Object(_dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.elements.popper, arrowElement)) { + if (true) { + console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); + } + + return; + } + + state.elements.arrow = arrowElement; + state.modifiersData[name + "#persistent"] = { + padding: Object(_utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_6__["default"])(typeof padding !== 'number' ? padding : Object(_utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_7__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_8__["basePlacements"])) + }; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js ***! + \********************************************************************/ +/*! exports provided: mapToStyles, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapToStyles", function() { return mapToStyles; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); + + + + + + +var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' +}; // Round the offsets to the nearest suitable subpixel based on the DPR. +// Zooming can change the DPR, but it seems to report a value that will +// cleanly divide the values into the appropriate subpixels. + +function roundOffsets(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: Math.round(x * dpr) / dpr || 0, + y: Math.round(y * dpr) / dpr || 0 + }; +} + +function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive; + + var _roundOffsets = roundOffsets(offsets), + x = _roundOffsets.x, + y = _roundOffsets.y; + + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + var sideY = _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"]; + var win = window; + + if (adaptive) { + var offsetParent = Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper); + + if (offsetParent === Object(_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper)) { + offsetParent = Object(_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper); + } // $FlowFixMe: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + /*:: offsetParent = (offsetParent: Element); */ + + + if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"]) { + sideY = _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"]; + y -= offsetParent.clientHeight - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]) { + sideX = _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; + x -= offsetParent.clientWidth - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); +} + +function computeStyles(_ref3) { + var state = _ref3.state, + options = _ref3.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive; + + if (true) { + var transitionProperty = Object(_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state.elements.popper).transitionProperty || ''; + + if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { + return transitionProperty.indexOf(property) >= 0; + })) { + console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); + } + } + + var commonStyles = { + placement: Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, {}, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, {}, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +var passive = { + passive: true +}; + +function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = Object(_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/flip.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/flip.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getOppositePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getOppositeVariationPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/computeAutoPlacement.js */ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); + + + + + + + + +function getExpandedFallbackPlacements(placement) { + if (Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["auto"]) { + return []; + } + + var oppositePlacement = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + return [Object(_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(placement), oppositePlacement, Object(_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(oppositePlacement)]; +} + +function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["auto"] ? Object(_utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement); + + var isStartVariation = Object(_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_6__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["start"]; + var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["right"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["left"] : isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["top"]; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(mainVariationSide); + } + + var altVariationSide = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(mainVariationSide); + var checks = [overflow[_basePlacement] <= 0, overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0]; + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/hide.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/hide.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); + + + +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} + +function isAnySideFullyClipped(overflow) { + return [_enums_js__WEBPACK_IMPORTED_MODULE_0__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]].some(function (side) { + return overflow[side] >= 0; + }); +} + +function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { + elementContext: 'reference' + }); + var popperAltOverflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/offset.js": +/*!*************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/offset.js ***! + \*************************************************************/ +/*! exports provided: distanceAndSkiddingToXY, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distanceAndSkiddingToXY", function() { return distanceAndSkiddingToXY; }); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + +function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + var invertDistance = [_enums_js__WEBPACK_IMPORTED_MODULE_1__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_1__["top"]].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [_enums_js__WEBPACK_IMPORTED_MODULE_1__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_1__["right"]].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} + +function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = _enums_js__WEBPACK_IMPORTED_MODULE_1__["placements"].reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); + + +function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = Object(_utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getAltAxis.js */ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js"); +/* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); + + + + + + + + + + + +function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_7__["default"])(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state.placement); + var variation = Object(_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_8__["default"])(state.placement); + var isBasePlacement = !variation; + var mainAxis = Object(_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(basePlacement); + var altAxis = Object(_utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis) { + var mainSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + var altSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min = popperOffsets[mainAxis] + overflow[mainSide]; + var max = popperOffsets[mainAxis] - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_0__["start"] ? referenceRect[len] : popperRect[len]; + var maxLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_0__["start"] ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : Object(_utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_9__["default"])(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; + var arrowOffsetParent = state.elements.arrow && Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; + var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; + var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; + var preventedOffset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(tether ? Math.min(min, tetherMin) : min, offset, tether ? Math.max(max, tetherMax) : max); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _mainSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + + var _altSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; + + var _offset = popperOffsets[altAxis]; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var _preventedOffset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_min, _offset, _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/popper-base.js": +/*!********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/popper-base.js ***! + \********************************************************/ +/*! exports provided: createPopper, popperGenerator, detectOverflow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/@popperjs/core/lib/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return _index_js__WEBPACK_IMPORTED_MODULE_0__["createPopper"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return _index_js__WEBPACK_IMPORTED_MODULE_0__["popperGenerator"]; }); + +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "detectOverflow", function() { return _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); + + + +// eslint-disable-next-line import/no-unused-modules + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return computeAutoPlacement; }); +/* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); + + + + + +/*:: type OverflowsMap = { [ComputedPlacement]: number }; */ + +/*;; type OverflowsMap = { [key in ComputedPlacement]: number }; */ +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_1__["placements"] : _options$allowedAutoP; + var variation = Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + var placements = (variation ? flipVariations ? _enums_js__WEBPACK_IMPORTED_MODULE_1__["variationPlacements"] : _enums_js__WEBPACK_IMPORTED_MODULE_1__["variationPlacements"].filter(function (placement) { + return Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === variation; + }) : _enums_js__WEBPACK_IMPORTED_MODULE_1__["basePlacements"]).filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); // $FlowFixMe: Flow seems to have problems with two array unions... + + var overflows = placements.reduce(function (acc, placement) { + acc[placement] = Object(_detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[Object(_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/computeOffsets.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return computeOffsets; }); +/* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + + + +function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? Object(_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) : null; + var variation = placement ? Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["top"]: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["bottom"]: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["right"]: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["left"]: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? Object(_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["start"]: + offsets[mainAxis] = Math.floor(offsets[mainAxis]) - Math.floor(reference[len] / 2 - element[len] / 2); + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["end"]: + offsets[mainAxis] = Math.floor(offsets[mainAxis]) + Math.ceil(reference[len] / 2 - element[len] / 2); + break; + + default: + } + } + + return offsets; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/debounce.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/debounce.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return debounce; }); +function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/detectOverflow.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return detectOverflow; }); +/* harmony import */ var _dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getClippingRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js"); +/* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _computeOffsets_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); +/* harmony import */ var _rectToClientRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); +/* harmony import */ var _expandToHashMap_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); + + + + + + + + + +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["clippingParents"] : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["viewport"] : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = Object(_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_7__["default"])(typeof padding !== 'number' ? padding : Object(_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_8__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_5__["basePlacements"])); + var altContext = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["reference"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"]; + var referenceElement = state.elements.reference; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = Object(_dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_6__["isElement"])(element) ? element : element.contextElement || Object(_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = Object(_dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(referenceElement); + var popperOffsets = Object(_computeOffsets_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = Object(_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_4__["default"])(Object.assign({}, popperRect, {}, popperOffsets)); + var elementClientRect = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["right"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(key) >= 0 ? 1 : -1; + var axis = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js": +/*!******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return expandToHashMap; }); +function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/format.js": +/*!*********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/format.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return format; }); +function format(str) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return [].concat(args).reduce(function (p, c) { + return p.replace(/%s/, c); + }, str); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js": +/*!*************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getAltAxis.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getAltAxis; }); +function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBasePlacement; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + +function getBasePlacement(placement) { + return placement.split('-')[0]; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getFreshSideObject; }); +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getMainAxisFromPlacement; }); +function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getOppositePlacement; }); +var hash = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getOppositeVariationPlacement; }); +var hash = { + start: 'end', + end: 'start' +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getVariation.js": +/*!***************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getVariation.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getVariation; }); +function getVariation(placement) { + return placement.split('-')[1]; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/mergeByName.js": +/*!**************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/mergeByName.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return mergeByName; }); +function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, {}, current, { + options: Object.assign({}, existing.options, {}, current.options), + data: Object.assign({}, existing.data, {}, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return mergePaddingObject; }); +/* harmony import */ var _getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); + +function mergePaddingObject(paddingObject) { + return Object.assign({}, Object(_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(), {}, paddingObject); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/orderModifiers.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return orderModifiers; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + // source: https://stackoverflow.com/questions/49875255 + +function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; +} + +function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return _enums_js__WEBPACK_IMPORTED_MODULE_0__["modifierPhases"].reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return rectToClientRect; }); +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/uniqueBy.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/uniqueBy.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return uniqueBy; }); +function uniqueBy(arr, fn) { + var identifiers = new Set(); + return arr.filter(function (item) { + var identifier = fn(item); + + if (!identifiers.has(identifier)) { + identifiers.add(identifier); + return true; + } + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/validateModifiers.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/validateModifiers.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return validateModifiers; }); +/* harmony import */ var _format_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./format.js */ "./node_modules/@popperjs/core/lib/utils/format.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + +var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; +var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; +var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; +function validateModifiers(modifiers) { + modifiers.forEach(function (modifier) { + Object.keys(modifier).forEach(function (key) { + switch (key) { + case 'name': + if (typeof modifier.name !== 'string') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); + } + + break; + + case 'enabled': + if (typeof modifier.enabled !== 'boolean') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); + } + + case 'phase': + if (_enums_js__WEBPACK_IMPORTED_MODULE_1__["modifierPhases"].indexOf(modifier.phase) < 0) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + _enums_js__WEBPACK_IMPORTED_MODULE_1__["modifierPhases"].join(', '), "\"" + String(modifier.phase) + "\"")); + } + + break; + + case 'fn': + if (typeof modifier.fn !== 'function') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'effect': + if (typeof modifier.effect !== 'function') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'requires': + if (!Array.isArray(modifier.requires)) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); + } + + break; + + case 'requiresIfExists': + if (!Array.isArray(modifier.requiresIfExists)) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); + } + + break; + + case 'options': + case 'data': + break; + + default: + console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { + return "\"" + s + "\""; + }).join(', ') + "; but \"" + key + "\" was provided."); + } + + modifier.requires && modifier.requires.forEach(function (requirement) { + if (modifiers.find(function (mod) { + return mod.name === requirement; + }) == null) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); + } + }); + }); + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/within.js": +/*!*********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/within.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return within; }); +function within(min, value, max) { + return Math.max(min, Math.min(value, max)); +} + +/***/ }), + +/***/ "./node_modules/@restart/context/forwardRef.js": +/*!*****************************************************!*\ + !*** ./node_modules/@restart/context/forwardRef.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; +exports.default = forwardRef; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function forwardRef(renderFn, _temp) { + var _ref = _temp === void 0 ? {} : _temp, + propTypes = _ref.propTypes, + defaultProps = _ref.defaultProps, + _ref$allowFallback = _ref.allowFallback, + allowFallback = _ref$allowFallback === void 0 ? false : _ref$allowFallback, + _ref$displayName = _ref.displayName, + displayName = _ref$displayName === void 0 ? renderFn.name || renderFn.displayName : _ref$displayName; + + var render = function render(props, ref) { + return renderFn(props, ref); + }; + + return Object.assign(_react.default.forwardRef || !allowFallback ? _react.default.forwardRef(render) : function (props) { + return render(props, null); + }, { + displayName: displayName, + propTypes: propTypes, + defaultProps: defaultProps + }); +} + +/***/ }), + +/***/ "./node_modules/@restart/hooks/esm/useCallbackRef.js": +/*!***********************************************************!*\ + !*** ./node_modules/@restart/hooks/esm/useCallbackRef.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return useCallbackRef; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + +/** + * A convenience hook around `useState` designed to be paired with + * the component [callback ref](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) api. + * Callback refs are useful over `useRef()` when you need to respond to the ref being set + * instead of lazily accessing it in an effect. + * + * ```ts + * const [element, attachRef] = useCallbackRef() + * + * useEffect(() => { + * if (!element) return + * + * const calendar = new FullCalendar.Calendar(element) + * + * return () => { + * calendar.destroy() + * } + * }, [element]) + * + * return
+ * ``` + * + * @category refs + */ + +function useCallbackRef() { + return Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])(null); +} + +/***/ }), + +/***/ "./node_modules/@restart/hooks/esm/useCommittedRef.js": +/*!************************************************************!*\ + !*** ./node_modules/@restart/hooks/esm/useCommittedRef.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + +/** + * Creates a `Ref` whose value is updated in an effect, ensuring the most recent + * value is the one rendered with. Generally only required for Concurrent mode usage + * where previous work in `render()` may be discarded befor being used. + * + * This is safe to access in an event handler. + * + * @param value The `Ref` value + */ + +function useCommittedRef(value) { + var ref = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(value); + Object(react__WEBPACK_IMPORTED_MODULE_0__["useEffect"])(function () { + ref.current = value; + }, [value]); + return ref; +} + +/* harmony default export */ __webpack_exports__["default"] = (useCommittedRef); + +/***/ }), + +/***/ "./node_modules/@restart/hooks/esm/useEventCallback.js": +/*!*************************************************************!*\ + !*** ./node_modules/@restart/hooks/esm/useEventCallback.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return useEventCallback; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _useCommittedRef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useCommittedRef */ "./node_modules/@restart/hooks/esm/useCommittedRef.js"); + + +function useEventCallback(fn) { + var ref = Object(_useCommittedRef__WEBPACK_IMPORTED_MODULE_1__["default"])(fn); + return Object(react__WEBPACK_IMPORTED_MODULE_0__["useCallback"])(function () { + return ref.current && ref.current.apply(ref, arguments); + }, [ref]); +} + +/***/ }), + +/***/ "./node_modules/@restart/hooks/esm/useForceUpdate.js": +/*!***********************************************************!*\ + !*** ./node_modules/@restart/hooks/esm/useForceUpdate.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return useForceUpdate; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + +/** + * Returns a function that triggers a component update. the hook equivalent to + * `this.forceUpdate()` in a class component. In most cases using a state value directly + * is preferable but may be required in some advanced usages of refs for interop or + * when direct DOM manipulation is required. + * + * ```ts + * const forceUpdate = useForceUpdate(); + * + * const updateOnClick = useCallback(() => { + * forceUpdate() + * }, [forceUpdate]) + * + * return + * ``` + */ + +function useForceUpdate() { + // The toggling state value is designed to defeat React optimizations for skipping + // updates when they are stricting equal to the last state value + var _useReducer = Object(react__WEBPACK_IMPORTED_MODULE_0__["useReducer"])(function (state) { + return !state; + }, false), + dispatch = _useReducer[1]; + + return dispatch; +} + +/***/ }), + +/***/ "./node_modules/@restart/hooks/esm/useMergedRefs.js": +/*!**********************************************************!*\ + !*** ./node_modules/@restart/hooks/esm/useMergedRefs.js ***! + \**********************************************************/ +/*! exports provided: mergeRefs, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeRefs", function() { return mergeRefs; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + + +var toFnRef = function toFnRef(ref) { + return !ref || typeof ref === 'function' ? ref : function (value) { + ref.current = value; + }; +}; + +function mergeRefs(refA, refB) { + var a = toFnRef(refA); + var b = toFnRef(refB); + return function (value) { + if (a) a(value); + if (b) b(value); + }; +} +/** + * Create and returns a single callback ref composed from two other Refs. + * + * ```tsx + * const Button = React.forwardRef((props, ref) => { + * const [element, attachRef] = useCallbackRef(); + * const mergedRef = useMergedRefs(ref, attachRef); + * + * return