Author: dj
Date: Thu Aug 18 14:50:13 2016
New Revision: 1756800

URL: http://svn.apache.org/viewvc?rev=1756800&view=rev
Log:
OAK-4679 : Backport OAK-4119, OAK-4101, OAK-4087 and OAK-4344
- backported OAK-4087

Added:
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/SyncHandlerMapping.java
      - copied unchanged from r1746408, 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/SyncHandlerMapping.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleAutoMembershipTest.java
      - copied unchanged from r1746408, 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleAutoMembershipTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/PrincipalProviderAutoMembershipTest.java
      - copied unchanged from r1746408, 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/PrincipalProviderAutoMembershipTest.java
    
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/external/
      - copied from r1746408, 
jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authentication/external/
Removed:
    
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/defaultusersync.md
Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContext.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfiguration.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/AbstractExternalAuthTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleFactoryTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContextTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/AbstractPrincipalTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java
    
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfigurationTest.java
    
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
    
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/VersionStorageTest.java
    
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/externalloginmodule.md
    
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/usersync.md
    
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/principal/principalprovider.md
    jackrabbit/oak/branches/1.2/oak-run/pom.xml
    
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
    
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
    
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/ExternalLoginTest.java
    
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncAllExternalUsersTest.java
    
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncExternalUsersTest.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug 18 14:50:13 2016
@@ -1,4 +1,4 @@
 /jackrabbit/oak/branches/1.0:1665962
 /jackrabbit/oak/branches/1.4:1745750,1747354,1750078,1750512
-/jackrabbit/oak/trunk:1672350,1672468-1672469,1672537,1672603,1672611,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675089,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678202,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681921,1681955,1682042,1682218,1682235,1682437,1682488,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376
 
,1684442,1684561,1684570,1684601,1684618,1684669,1684820,1684868,1684894,1685023,1685075,1685370,1685541,1685552,1685589-1685590,1685834,1685839-1685840,1685964,1685977,1685989,1685999,1686003,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686772,1686780,1686790,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690657,1690669,1690672,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691201,1691210,1691217-1691218,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691394,1691401,1691498,1691509,1692133-1692134,1692156,1692250,1692272,1692274,1692363,1692382,1692393,1692478,1692955,1693002,1693030,1693050,1693209,1693
 
401,1693421,1693525-1693526,1694007,1694049,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695223,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695571,1695829-1695830,1695905,1696190,1696194,1696242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697383,1697410,1697582,1697589,1697616,1697672,1697896,1698096,1698144,1700191,1700231,1700397,1700403,1700506,1700571,1700709,1700718,1700720,1700727,1700749,1700769,1700775,1701065,1701613,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701907,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702371,1702387,1702405,1702423,1702426,1702428,1702860,1702866,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1
 
705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707189,1707191,1707331,1707435,1707509,1707753,1708049,1708105,1708307,1708315,1708401,1708546,1708592,1708738,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710800,1710811,1710816,1710972,1711209,1711248,1711282,1711296,1711405,1711498,1711654,1712018,1712042,1712319,1712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713599-1713600,1713626,1713698,1713803,1713809,1714034,1714061,1714084,1714170,1714174,1714213,1714229,1714238,1714519-1714520,1714543-1714544,1714730,1714739,1714779,1714956,1714961,1715010,1715092,1715191,1715346,1715716,1715767,1715771,1715888,1715898,1716100,1716178,1716426,1716576,1716588-1716589,1716596,1716616,1716703,1716712,1716815,1716823,1716830,1716883,1717203,1717277,1717393-1717394,1717410,1717462,1717632,1717768-1717769,1717784,1717789,1717988,171852
 
8,1718533,1718546-1718548,1718553,1718626,1718646,1718772,1718801-1718802,1718895,1719111,1719288,1719869,1720306,1720335,1720350,1720354,1720500,1721160,1721172,1721337,1722141,1722832,1723227,1723239,1723241,1723251,1723254,1723333,1723347,1723350,1723565,1723584,1723713,1723731,1724026,1724057,1724186,1724210,1724401,1724628,1724631,1725216,1725477,1725515,1725555,1725895,1725899,1725935,1725941,1725960,1726232,1726237,1726570,1726579,1726585-1726586,1726621,1726795,1726797,1726809,1726812,1726981,1726993,1727026,1727254,1727331,1727350,1727358,1727429,1727476,1727483,1727508,1727515-1727518,1727813,1727816,1727831-1727832,1727841,1727893,1727895,1727912-1727913,1727923,1727991,1728037,1728041,1728070,1728114,1728281,1728443,1728525,1728642,1729200,1729505,1729578,1729599,1729957,1729962,1729979,1730050,1730216,1730527,1730581,1730629,1730801,1731627,1731647-1731648,1731789,1731797,1732131,1732268,1732278,1732330,1732647-1732648,1732864,1733615,1733929,1734230,1734254,1735052,173
 
5081,1735141,1735267,1735405,1735484,1735564,1735588,1736176,1737309-1737310,1737334,1737349,1738138,1738252,1738833,1738950,1738957,1739712,1739760,1739867,1739894,1739959-1739960,1740114,1740116,1740250,1740333,1740360,1740626,1740774,1740837,1740971,1741016,1741032,1741339,1741343,1742117,1742520,1742888,1742916,1743097,1743172,1743343,1743674,1744265,1744292,1744959,1745038,1745197,1746117,1746696,1746981,1747341-1747342,1747492,1748505,1748553,1748722,1748870,1749350,1749464,1749475,1749645,1749662,1749815,1749872,1749875,1749899,1750052,1750076-1750077,1750287,1750457,1750462,1750465,1750495,1750626,1750809,1750886,1751410,1751445-1751446,1751478,1751755,1752198,1752202,1752273-1752274,1752438,1752508,1752659,1752672,1753262,1753331-1753332,1753355,1753444,1754117,1754239,1755366,1756520,1756580
+/jackrabbit/oak/trunk:1672350,1672468-1672469,1672537,1672603,1672611,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675089,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678202,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681921,1681955,1682042,1682218,1682235,1682437,1682488,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376
 
,1684442,1684561,1684570,1684601,1684618,1684669,1684820,1684868,1684894,1685023,1685075,1685370,1685541,1685552,1685589-1685590,1685834,1685839-1685840,1685964,1685977,1685989,1685999,1686003,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686772,1686780,1686790,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690657,1690669,1690672,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691201,1691210,1691217-1691218,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691394,1691401,1691498,1691509,1692133-1692134,1692156,1692250,1692272,1692274,1692363,1692382,1692393,1692478,1692955,1693002,1693030,1693050,1693209,1693
 
401,1693421,1693525-1693526,1694007,1694049,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695223,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695571,1695829-1695830,1695905,1696190,1696194,1696242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697383,1697410,1697582,1697589,1697616,1697672,1697896,1698096,1698144,1700191,1700231,1700397,1700403,1700506,1700571,1700709,1700718,1700720,1700727,1700749,1700769,1700775,1701065,1701613,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701907,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702371,1702387,1702405,1702423,1702426,1702428,1702860,1702866,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1
 
705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707189,1707191,1707331,1707435,1707509,1707753,1708049,1708105,1708307,1708315,1708401,1708546,1708592,1708738,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710800,1710811,1710816,1710972,1711209,1711248,1711282,1711296,1711405,1711498,1711654,1712018,1712042,1712319,1712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713599-1713600,1713626,1713698,1713803,1713809,1714034,1714061,1714084,1714170,1714174,1714213,1714229,1714238,1714519-1714520,1714543-1714544,1714730,1714739,1714779,1714956,1714961,1715010,1715092,1715191,1715346,1715716,1715767,1715771,1715888,1715898,1716100,1716178,1716426,1716576,1716588-1716589,1716596,1716616,1716703,1716712,1716815,1716823,1716830,1716883,1717203,1717277,1717393-1717394,1717410,1717462,1717632,1717768-1717769,1717784,1717789,1717988,171852
 
8,1718533,1718546-1718548,1718553,1718626,1718646,1718772,1718801-1718802,1718895,1719111,1719288,1719869,1720306,1720335,1720350,1720354,1720500,1721160,1721172,1721337,1722141,1722832,1723227,1723239,1723241,1723251,1723254,1723333,1723347,1723350,1723565,1723584,1723713,1723731,1724026,1724057,1724186,1724210,1724401,1724628,1724631,1725216,1725477,1725515,1725555,1725895,1725899,1725935,1725941,1725960,1726232,1726237,1726570,1726579,1726585-1726586,1726621,1726795,1726797,1726809,1726812,1726981,1726993,1727026,1727254,1727331,1727350,1727358,1727429,1727476,1727483,1727508,1727515-1727518,1727813,1727816,1727831-1727832,1727841,1727893,1727895,1727912-1727913,1727923,1727991,1728037,1728041,1728070,1728114,1728281,1728443,1728525,1728642,1729200,1729505,1729578,1729599,1729957,1729962,1729979,1730050,1730216,1730527,1730581,1730629,1730801,1731627,1731647-1731648,1731789,1731797,1732131,1732268,1732278,1732330,1732647-1732648,1732864,1733615,1733929,1734230,1734254,1735052,173
 
5081,1735141,1735267,1735405,1735484,1735564,1735588,1736176,1737309-1737310,1737334,1737349,1738138,1738252,1738833,1738950,1738957,1739712,1739760,1739867,1739894,1739959-1739960,1740114,1740116,1740250,1740333,1740360,1740626,1740774,1740837,1740971,1741016,1741032,1741339,1741343,1742117,1742520,1742888,1742916,1743097,1743172,1743343,1743674,1744265,1744292,1744670,1744672,1744959,1745038,1745127,1745197,1746117,1746408,1746696,1746981,1747341-1747342,1747492,1748505,1748553,1748722,1748870,1749350,1749464,1749475,1749645,1749662,1749815,1749872,1749875,1749899,1750052,1750076-1750077,1750287,1750457,1750462,1750465,1750495,1750626,1750809,1750886,1751410,1751445-1751446,1751478,1751755,1752198,1752202,1752273-1752274,1752438,1752508,1752659,1752672,1753262,1753331-1753332,1753355,1753444,1754117,1754239,1755366,1756520,1756580
 /jackrabbit/trunk:1345480

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContext.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContext.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContext.java
 Thu Aug 18 14:50:13 2016
@@ -135,6 +135,11 @@ public class DynamicSyncContext extends
         }
     }
 
+    @Override
+    protected void applyMembership(@Nonnull Authorizable member, @Nonnull 
Set<String> groups) throws RepositoryException {
+        log.debug("Dynamic membership sync enabled => omit setting 
auto-membership for {} ", member.getID());
+    }
+
     /**
      * Recursively collect the principal names of the given declared group
      * references up to the given depth.

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
 Thu Aug 18 14:50:13 2016
@@ -69,12 +69,12 @@ public class ExternalLoginModule extends
     /**
      * Name of the parameter that configures the name of the external identity 
provider.
      */
-    public static final String PARAM_IDP_NAME = "idp.name";
+    public static final String PARAM_IDP_NAME = 
SyncHandlerMapping.PARAM_IDP_NAME;
 
     /**
      * Name of the parameter that configures the name of the synchronization 
handler.
      */
-    public static final String PARAM_SYNC_HANDLER_NAME = "sync.handlerName";
+    public static final String PARAM_SYNC_HANDLER_NAME = 
SyncHandlerMapping.PARAM_SYNC_HANDLER_NAME;
 
     private ExternalIdentityProviderManager idpManager;
 

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
 Thu Aug 18 14:50:13 2016
@@ -17,12 +17,12 @@
 package org.apache.jackrabbit.oak.spi.security.authentication.external.impl;
 
 import java.util.Hashtable;
-
 import javax.jcr.Repository;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.security.auth.spi.LoginModule;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.felix.jaas.LoginModuleFactory;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -43,8 +43,6 @@ import org.osgi.service.component.Compon
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableMap;
-
 /**
  * Implements a LoginModuleFactory that creates {@link ExternalLoginModule}s 
and allows to configure login modules
  * via OSGi config.
@@ -56,7 +54,7 @@ import com.google.common.collect.Immutab
         configurationFactory = true
 )
 @Service
-public class ExternalLoginModuleFactory implements LoginModuleFactory {
+public class ExternalLoginModuleFactory implements LoginModuleFactory, 
SyncHandlerMapping {
 
     private static final Logger log = 
LoggerFactory.getLogger(ExternalLoginModuleFactory.class);
 
@@ -92,14 +90,14 @@ public class ExternalLoginModuleFactory
             label = "Identity Provider Name",
             description = "Name of the identity provider (for example: 
'ldap')."
     )
-    public static final String PARAM_IDP_NAME = 
ExternalLoginModule.PARAM_IDP_NAME;
+    public static final String PARAM_IDP_NAME = 
SyncHandlerMapping.PARAM_IDP_NAME;
 
     @Property(
             value = "default",
             label = "Sync Handler Name",
             description = "Name of the sync handler."
     )
-    public static final String PARAM_SYNC_HANDLER_NAME = 
ExternalLoginModule.PARAM_SYNC_HANDLER_NAME;
+    public static final String PARAM_SYNC_HANDLER_NAME = 
SyncHandlerMapping.PARAM_SYNC_HANDLER_NAME;
 
     @Reference
     private SyncManager syncManager;
@@ -120,6 +118,7 @@ public class ExternalLoginModuleFactory
      */
     private Registration mbeanRegistration;
 
+    //----------------------------------------------------< SCR integration 
>---
     /**
      * Activates the LoginModuleFactory service
      * @param context the component context

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
 Thu Aug 18 14:50:13 2016
@@ -19,12 +19,14 @@ package org.apache.jackrabbit.oak.spi.se
 import java.security.Principal;
 import java.security.acl.Group;
 import java.text.ParseException;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -54,6 +56,7 @@ import org.apache.jackrabbit.oak.api.Tre
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIdentityConstants;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
@@ -95,12 +98,18 @@ class ExternalGroupPrincipalProvider imp
 
     private final Root root;
     private final NamePathMapper namePathMapper;
+
     private final UserManager userManager;
+    private final AutoMembershipPrincipals autoMembershipPrincipals;
 
-    ExternalGroupPrincipalProvider(Root root, UserConfiguration uc, 
NamePathMapper namePathMapper) {
+    ExternalGroupPrincipalProvider(@Nonnull Root root, @Nonnull 
UserConfiguration uc,
+                                   @Nonnull NamePathMapper namePathMapper,
+                                   @Nonnull Map<String, String[]> 
autoMembershipMapping) {
         this.root = root;
         this.namePathMapper = namePathMapper;
+
         userManager = uc.getUserManager(root, namePathMapper);
+        autoMembershipPrincipals = new 
AutoMembershipPrincipals(autoMembershipMapping);
     }
 
     //--------------------------------------------------< PrincipalProvider 
>---
@@ -164,6 +173,15 @@ class ExternalGroupPrincipalProvider imp
     }
 
     //------------------------------------------------------------< private 
>---
+    @CheckForNull
+    private String getIdpName(@Nonnull Tree userTree) {
+        PropertyState ps = userTree.getProperty(REP_EXTERNAL_ID);
+        if (ps != null) {
+            return 
ExternalIdentityRef.fromString(ps.getValue(Type.STRING)).getProviderName();
+        } else {
+            return null;
+        }
+    }
 
     private Set<Group> getGroupPrincipals(@CheckForNull Authorizable 
authorizable) throws RepositoryException {
         if (authorizable != null && !authorizable.isGroup()) {
@@ -178,10 +196,14 @@ class ExternalGroupPrincipalProvider imp
         if (userTree.exists() && UserUtil.isType(userTree, 
AuthorizableType.USER) && userTree.hasProperty(REP_EXTERNAL_PRINCIPAL_NAMES)) {
             PropertyState ps = 
userTree.getProperty(REP_EXTERNAL_PRINCIPAL_NAMES);
             if (ps != null) {
+                // we have an 'external' user that has been synchronized with 
the dynamic-membership option
                 Set<Group> groupPrincipals = Sets.newHashSet();
                 for (String principalName : ps.getValue(Type.STRINGS)) {
                     groupPrincipals.add(new 
ExternalGroupPrincipal(principalName));
                 }
+
+                // add existing group principals as defined with the 
_autoMembership_ option.
+                
groupPrincipals.addAll(autoMembershipPrincipals.get(getIdpName(userTree)));
                 return groupPrincipals;
             }
         }
@@ -194,6 +216,10 @@ class ExternalGroupPrincipalProvider imp
      * {@link #REP_EXTERNAL_PRINCIPAL_NAMES} properties that match the given
      * name or name hint.
      *
+     * NOTE: ignore any principals listed in the {@link 
DefaultSyncConfig.User#autoMembership}
+     * because they are expected to exist in the system and thus will be found
+     * by another principal provider instance.
+     *
      * @param nameHint The principal name or name hint to be searched for.
      * @param exactMatch boolean flag indicating if the query should search for
      *                   exact matching.
@@ -409,4 +435,54 @@ class ExternalGroupPrincipalProvider imp
             return null;
         }
     }
+
+    private final class AutoMembershipPrincipals {
+
+        private final Map<String, String[]> autoMembershipMapping;
+        private final Map<String, Set<Group>> principalMap;
+
+        private AutoMembershipPrincipals(@Nonnull Map<String, String[]> 
autoMembershipMapping) {
+            this.autoMembershipMapping = autoMembershipMapping;
+            this.principalMap = new ConcurrentHashMap<String, 
Set<Group>>(autoMembershipMapping.size());
+        }
+
+        @Nonnull
+        private Collection<Group> get(@CheckForNull String idpName) {
+            if (idpName == null) {
+                return ImmutableSet.of();
+            }
+
+            Set<Group> principals;
+            if (!principalMap.containsKey(idpName)) {
+                String[] vs = autoMembershipMapping.get(idpName);
+                if (vs == null) {
+                    principals = ImmutableSet.of();
+                } else {
+                    ImmutableSet.Builder<Group> builder = 
ImmutableSet.builder();
+                    for (String groupId : autoMembershipMapping.get(idpName)) {
+                        try {
+                            Authorizable gr = 
userManager.getAuthorizable(groupId);
+                            if (gr != null && gr.isGroup()) {
+                                Principal grPrincipal = gr.getPrincipal();
+                                if (grPrincipal instanceof Group) {
+                                    builder.add((Group) grPrincipal);
+                                } else {
+                                    log.warn("Principal of group {} is not of 
type java.security.acl.Group -> Ignoring", groupId);
+                                }
+                            } else {
+                                log.warn("Configured auto-membership group {} 
does not exist -> Ignoring", groupId);
+                            }
+                        } catch (RepositoryException e) {
+                            log.debug("Failed to retrieved 'auto-membership' 
group with id {}", groupId, e);
+                        }
+                    }
+                    principals = builder.build();
+                }
+                principalMap.put(idpName, principals);
+            } else {
+                principals = principalMap.get(idpName);
+            }
+            return principals;
+        }
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfiguration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfiguration.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfiguration.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfiguration.java
 Thu Aug 18 14:50:13 2016
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.oak.spi.se
 
 import java.security.Principal;
 import java.security.acl.Group;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -26,8 +28,11 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -46,6 +51,8 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncConfigImpl;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.SyncHandlerMapping;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalManagerImpl;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider;
@@ -54,6 +61,8 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of the {@code PrincipalConfiguration} interface that provides
@@ -73,7 +82,10 @@ import org.osgi.util.tracker.ServiceTrac
 @Service({PrincipalConfiguration.class, SecurityConfiguration.class})
 public class ExternalPrincipalConfiguration extends ConfigurationBase 
implements PrincipalConfiguration {
 
+    private static final Logger log = 
LoggerFactory.getLogger(ExternalPrincipalConfiguration.class);
+
     private SyncConfigTracker syncConfigTracker;
+    private SyncHandlerMappingTracker syncHandlerMappingTracker;
 
     @SuppressWarnings("UnusedDeclaration")
     public ExternalPrincipalConfiguration() {
@@ -96,7 +108,7 @@ public class ExternalPrincipalConfigurat
     public PrincipalProvider getPrincipalProvider(Root root, NamePathMapper 
namePathMapper) {
         if (dynamicMembershipEnabled()) {
             UserConfiguration uc = 
getSecurityProvider().getConfiguration(UserConfiguration.class);
-            return new ExternalGroupPrincipalProvider(root, uc, 
namePathMapper);
+            return new ExternalGroupPrincipalProvider(root, uc, 
namePathMapper, syncConfigTracker.getAutoMembership());
         } else {
             return EmptyPrincipalProvider.INSTANCE;
         }
@@ -132,8 +144,13 @@ public class ExternalPrincipalConfigurat
     @Activate
     private void activate(BundleContext bundleContext, Map<String, Object> 
properties) {
         setParameters(ConfigurationParameters.of(properties));
-        syncConfigTracker = new SyncConfigTracker(bundleContext);
+        syncHandlerMappingTracker = new 
SyncHandlerMappingTracker(bundleContext);
+        syncHandlerMappingTracker.open();
+
+        syncConfigTracker = new SyncConfigTracker(bundleContext, 
syncHandlerMappingTracker);
         syncConfigTracker.open();
+
+
     }
 
     @SuppressWarnings("UnusedDeclaration")
@@ -142,6 +159,9 @@ public class ExternalPrincipalConfigurat
         if (syncConfigTracker != null) {
             syncConfigTracker.close();
         }
+        if (syncHandlerMappingTracker != null) {
+            syncHandlerMappingTracker.close();
+        }
     }
 
     //------------------------------------------------------------< private 
>---
@@ -196,11 +216,14 @@ public class ExternalPrincipalConfigurat
      */
     private static final class SyncConfigTracker extends ServiceTracker {
 
+        private final SyncHandlerMappingTracker mappingTracker;
+
         private Set<ServiceReference> enablingRefs = new 
HashSet<ServiceReference>();
         private boolean isEnabled = false;
 
-        public SyncConfigTracker(BundleContext context) {
+        public SyncConfigTracker(@Nonnull BundleContext context, @Nonnull 
SyncHandlerMappingTracker mappingTracker) {
             super(context, SyncHandler.class.getName(), null);
+            this.mappingTracker = mappingTracker;
         }
 
         @Override
@@ -234,5 +257,83 @@ public class ExternalPrincipalConfigurat
         private static boolean hasDynamicMembership(ServiceReference 
reference) {
             return 
PropertiesUtil.toBoolean(reference.getProperty(DefaultSyncConfigImpl.PARAM_USER_DYNAMIC_MEMBERSHIP),
 DefaultSyncConfigImpl.PARAM_USER_DYNAMIC_MEMBERSHIP_DEFAULT);
         }
+
+        private Map<String, String[]> getAutoMembership() {
+            Map<String, String[]> autoMembership = new HashMap<String, 
String[]>();
+            for (ServiceReference ref : enablingRefs) {
+                String syncHandlerName = 
PropertiesUtil.toString(ref.getProperty(DefaultSyncConfigImpl.PARAM_NAME), 
DefaultSyncConfigImpl.PARAM_NAME_DEFAULT);
+                String[] membership = 
PropertiesUtil.toStringArray(ref.getProperty(DefaultSyncConfigImpl.PARAM_GROUP_AUTO_MEMBERSHIP),
 new String[0]);
+
+                for (String idpName : 
mappingTracker.getIdpNames(syncHandlerName)) {
+                    String[] previous = autoMembership.put(idpName, 
membership);
+                    if (previous != null) {
+                        String msg = (Arrays.equals(previous, membership)) ? 
"Duplicate" : "Colliding";
+                        log.debug(msg + " auto-membership configuration for 
IDP '{}'; replacing previous values {} by {} defined by SyncHandler '{}'",
+                                idpName, Arrays.toString(previous), 
Arrays.toString(membership), syncHandlerName);
+                    }
+                }
+            }
+            return autoMembership;
+        }
+    }
+
+    /**
+     * {@code ServiceTracker} to detect any {@link SyncHandler} that has
+     * dynamic membership enabled.
+     */
+    private static final class SyncHandlerMappingTracker extends 
ServiceTracker {
+
+        private Map<ServiceReference, String[]> referenceMap = new 
HashMap<ServiceReference, String[]>();
+
+        public SyncHandlerMappingTracker(@Nonnull BundleContext context) {
+            super(context, SyncHandlerMapping.class.getName(), null);
+        }
+
+        @Override
+        public Object addingService(ServiceReference reference) {
+            addMapping(reference);
+            return super.addingService(reference);
+        }
+
+        @Override
+        public void modifiedService(ServiceReference reference, Object 
service) {
+            addMapping(reference);
+            super.modifiedService(reference, service);
+        }
+
+        @Override
+        public void removedService(ServiceReference reference, Object service) 
{
+            referenceMap.remove(reference);
+            super.removedService(reference, service);
+        }
+
+        private void addMapping(ServiceReference reference) {
+            String idpName = 
PropertiesUtil.toString(reference.getProperty(ExternalLoginModuleFactory.PARAM_IDP_NAME),
 null);
+            String syncHandlerName = 
PropertiesUtil.toString(reference.getProperty(ExternalLoginModuleFactory.PARAM_SYNC_HANDLER_NAME),
 null);
+
+            if (idpName != null && syncHandlerName != null) {
+                referenceMap.put(reference, new String[]{syncHandlerName, 
idpName});
+            } else {
+                log.warn("Ignoring SyncHandlerMapping with incomplete mapping 
of IDP '{}' and SyncHandler '{}'", idpName, syncHandlerName);
+            }
+        }
+
+        private Iterable<String> getIdpNames(@Nonnull final String 
syncHandlerName) {
+            return Iterables.filter(Iterables.transform(referenceMap.values(), 
new Function<String[], String>() {
+                        @Nullable
+                        @Override
+                        public String apply(@Nullable String[] input) {
+                            if (input != null && input.length == 2) {
+                                if (syncHandlerName.equals(input[0])) {
+                                    return input[1];
+                                } // else: different sync-handler
+                            } else {
+                                log.warn("Unexpected value of reference map. 
Expected String[] with length = 2");
+                            }
+                            return null;
+                        }
+                    }
+            ), Predicates.notNull());
+        }
     }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/AbstractExternalAuthTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/AbstractExternalAuthTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/AbstractExternalAuthTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/AbstractExternalAuthTest.java
 Thu Aug 18 14:50:13 2016
@@ -56,6 +56,7 @@ public abstract class AbstractExternalAu
     protected ExternalIdentityProvider idp;
 
     protected DefaultSyncConfig syncConfig;
+    protected ExternalPrincipalConfiguration externalPrincipalConfiguration = 
new ExternalPrincipalConfiguration();
 
     private Set<String> ids;
 
@@ -125,7 +126,7 @@ public abstract class AbstractExternalAu
     @Override
     protected SecurityProvider getSecurityProvider() {
         if (securityProvider == null) {
-            securityProvider = new 
TestSecurityProvider(getSecurityConfigParameters(), new 
ExternalPrincipalConfiguration());
+            securityProvider = new 
TestSecurityProvider(getSecurityConfigParameters(), 
externalPrincipalConfiguration);
         }
         return securityProvider;
     }

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleFactoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleFactoryTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleFactoryTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleFactoryTest.java
 Thu Aug 18 14:50:13 2016
@@ -36,7 +36,6 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIDPManagerImpl;
@@ -158,7 +157,6 @@ public class ExternalLoginModuleFactoryT
     public void setUpJaasFactoryWithInjection() throws Exception{
         context.registerService(Repository.class, 
EasyMock.createMock(Repository.class));
         context.registerService(SyncManager.class, new 
SyncManagerImpl(whiteboard));
-        context.registerService(SecurityProvider.class, 
EasyMock.createMock(SecurityProvider.class));
         context.registerService(ExternalIdentityProviderManager.class, new 
ExternalIDPManagerImpl(whiteboard));
 
         final LoginModuleFactory lmf = 
context.registerInjectActivateService(new ExternalLoginModuleFactory());

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
 Thu Aug 18 14:50:13 2016
@@ -57,10 +57,10 @@ public abstract class ExternalLoginModul
 
         testIdpReg = whiteboard.register(ExternalIdentityProvider.class, idp, 
Collections.<String, Object>emptyMap());
 
-        options.put(ExternalLoginModule.PARAM_SYNC_HANDLER_NAME, "default");
-        options.put(ExternalLoginModule.PARAM_IDP_NAME, idp.getName());
-
         setSyncConfig(syncConfig);
+
+        options.put(ExternalLoginModule.PARAM_SYNC_HANDLER_NAME, 
syncConfig.getName());
+        options.put(ExternalLoginModule.PARAM_IDP_NAME, idp.getName());
     }
 
     @After

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContextTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContextTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContextTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicSyncContextTest.java
 Thu Aug 18 14:50:13 2016
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.spi.se
 
 import java.util.HashSet;
 import java.util.Set;
+import java.util.UUID;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.RepositoryException;
@@ -31,6 +32,7 @@ import com.google.common.collect.Iterabl
 import com.google.common.collect.Sets;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
@@ -418,6 +420,21 @@ public class DynamicSyncContextTest exte
         assertFalse(r.hasPendingChanges());
     }
 
+    @Test
+    public void testAutoMembership() throws Exception {
+        Group gr = userManager.createGroup("group" + UUID.randomUUID());
+        r.commit();
+
+        syncConfig.user().setAutoMembership(gr.getID(), "non-existing-group");
+
+        SyncResult result = syncContext.sync(idp.getUser(USER_ID));
+        assertSame(SyncResult.Status.ADD, result.getStatus());
+
+        User u = userManager.getAuthorizable(USER_ID, User.class);
+        assertFalse(gr.isDeclaredMember(u));
+        assertFalse(gr.isMember(u));
+    }
+
     private static final class TestUserWithGroupRefs extends 
TestIdentityProvider.TestIdentity implements ExternalUser {
 
         private Iterable<ExternalIdentityRef> declaredGroupRefs;

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/AbstractPrincipalTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/AbstractPrincipalTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/AbstractPrincipalTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/AbstractPrincipalTest.java
 Thu Aug 18 14:50:13 2016
@@ -17,9 +17,11 @@
 package 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.principal;
 
 import java.security.Principal;
+import java.util.Set;
 import java.util.UUID;
 import javax.annotation.Nonnull;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
@@ -63,7 +65,9 @@ public abstract class AbstractPrincipalT
 
     @Nonnull
     PrincipalProvider createPrincipalProvider() {
-        return new ExternalGroupPrincipalProvider(root, 
getSecurityProvider().getConfiguration(UserConfiguration.class), 
NamePathMapper.DEFAULT);
+        Set<String> autoMembership = syncConfig.user().getAutoMembership();
+        return new ExternalGroupPrincipalProvider(root, 
getSecurityProvider().getConfiguration(UserConfiguration.class),
+                NamePathMapper.DEFAULT, ImmutableMap.of(idp.getName(), 
autoMembership.toArray(new String[autoMembership.size()])));
     }
 
     @Override

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java
 Thu Aug 18 14:50:13 2016
@@ -53,7 +53,7 @@ import static org.junit.Assert.fail;
 
 public class ExternalGroupPrincipalProviderTest extends AbstractPrincipalTest {
 
-    private void syncWithMembership(@Nonnull ExternalUser externalUser, long 
depth) throws Exception {
+    void syncWithMembership(@Nonnull ExternalUser externalUser, long depth) 
throws Exception {
         DefaultSyncConfig sc = new DefaultSyncConfig();
         sc.user().setMembershipNestingDepth(depth);
 
@@ -68,7 +68,11 @@ public class ExternalGroupPrincipalProvi
         root.refresh();
     }
 
-    private Set<Principal> getDeclaredGroupPrincipals(@Nonnull String userId) 
throws ExternalIdentityException {
+    Set<Principal> getExpectedGroupPrincipals(@Nonnull String userId) throws 
Exception {
+        return getDeclaredGroupPrincipals(userId);
+    }
+
+    Set<Principal> getDeclaredGroupPrincipals(@Nonnull String userId) throws 
Exception {
         Set<Principal> principals = 
ImmutableSet.copyOf(Iterables.transform(idp.getUser(userId).getDeclaredGroups(),
 new Function<ExternalIdentityRef, Principal>() {
             @Nullable
             @Override
@@ -76,16 +80,24 @@ public class ExternalGroupPrincipalProvi
                 try {
                     return new 
PrincipalImpl(idp.getIdentity(input).getPrincipalName());
                 } catch (ExternalIdentityException e) {
-                    fail(e.getMessage());
-                    return null;
+                    throw new RuntimeException(e);
                 }
-            }
-
-            ;
+            };
         }));
         return principals;
     }
 
+    void collectExpectedPrincipals(Set<Principal> grPrincipals, @Nonnull 
Iterable<ExternalIdentityRef> declaredGroups, long depth) throws Exception {
+        if (depth <= 0) {
+            return;
+        }
+        for (ExternalIdentityRef ref : declaredGroups) {
+            ExternalIdentity ei = idp.getIdentity(ref);
+            grPrincipals.add(new PrincipalImpl(ei.getPrincipalName()));
+            collectExpectedPrincipals(grPrincipals, ei.getDeclaredGroups(), 
depth - 1);
+        }
+    }
+
     @Test
     public void testGetPrincipalLocalUser() throws Exception {
         
assertNull(principalProvider.getPrincipal(getTestUser().getPrincipal().getName()));
@@ -233,7 +245,7 @@ public class ExternalGroupPrincipalProvi
         Authorizable user = getUserManager(root).getAuthorizable(USER_ID);
         assertNotNull(user);
 
-        Set<Principal> expected = getDeclaredGroupPrincipals(USER_ID);
+        Set<Principal> expected = getExpectedGroupPrincipals(USER_ID);
 
         Set<? extends Principal> principals = 
principalProvider.getGroupMembership(user.getPrincipal());
         assertEquals(expected, principals);
@@ -274,17 +286,6 @@ public class ExternalGroupPrincipalProvi
         assertEquals(expectedGrPrincipals, principals);
     }
 
-    private void collectExpectedPrincipals(Set<Principal> grPrincipals, 
@Nonnull Iterable<ExternalIdentityRef> declaredGroups, long depth) throws 
ExternalIdentityException {
-        if (depth <= 0) {
-            return;
-        }
-        for (ExternalIdentityRef ref : declaredGroups) {
-            ExternalIdentity ei = idp.getIdentity(ref);
-            grPrincipals.add(new PrincipalImpl(ei.getPrincipalName()));
-            collectExpectedPrincipals(grPrincipals, ei.getDeclaredGroups(), 
depth - 1);
-        }
-    }
-
     @Test
     public void testGetGroupMembershipExternalGroup() throws Exception {
         Authorizable group = 
getUserManager(root).getAuthorizable("secondGroup");
@@ -313,7 +314,7 @@ public class ExternalGroupPrincipalProvi
     @Test
     public void testGetPrincipalsExternalUser() throws Exception {
         Set<? extends Principal> principals = 
principalProvider.getPrincipals(USER_ID);
-        assertEquals(getDeclaredGroupPrincipals(USER_ID), principals);
+        assertEquals(getExpectedGroupPrincipals(USER_ID), principals);
     }
 
     @Test

Modified: 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfigurationTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfigurationTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalPrincipalConfigurationTest.java
 Thu Aug 18 14:50:13 2016
@@ -34,6 +34,7 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.spi.commit.MoveTracker;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
+import org.apache.jackrabbit.oak.spi.security.Context;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.AbstractExternalAuthTest;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncContext;

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
 Thu Aug 18 14:50:13 2016
@@ -53,7 +53,9 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
 import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.version.VersionEditorProvider;
 import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import org.apache.jackrabbit.oak.spi.commit.EditorHook;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.authentication.ConfigurationUtil;
@@ -83,6 +85,7 @@ public abstract class AbstractSecurityTe
     public void before() throws Exception {
         Oak oak = new Oak()
                 .with(new InitialContent())
+                .with(new EditorHook(new VersionEditorProvider()))
                 .with(JcrConflictHandler.createJcrConflictHandler())
                 .with(new NamespaceEditorProvider())
                 .with(new ReferenceEditorProvider())
@@ -171,7 +174,7 @@ public abstract class AbstractSecurityTe
     protected PrincipalManager getPrincipalManager(Root root) {
         return 
getConfig(PrincipalConfiguration.class).getPrincipalManager(root, 
getNamePathMapper());
     }
-    
+
     protected JackrabbitAccessControlManager getAccessControlManager(Root 
root) {
         AccessControlManager acMgr = 
getConfig(AuthorizationConfiguration.class).getAccessControlManager(root, 
NamePathMapper.DEFAULT);
         if (acMgr instanceof JackrabbitAccessControlManager) {

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/VersionStorageTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/VersionStorageTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/VersionStorageTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/VersionStorageTest.java
 Thu Aug 18 14:50:13 2016
@@ -100,11 +100,6 @@ public class VersionStorageTest extends
         root.commit();
     }
 
-    @Override
-    protected Oak withEditors(Oak oak) {
-        return oak.with(new VersionEditorProvider());
-    }
-
     @Test
     public void testGetVersionStorage() throws Exception {
         Tree vs = getTestRoot().getTree(VersionConstants.VERSION_STORE_PATH);

Modified: 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/externalloginmodule.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/externalloginmodule.md?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/externalloginmodule.md
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/externalloginmodule.md
 Thu Aug 18 14:50:13 2016
@@ -64,7 +64,7 @@ if the user is not yet present in the lo
 check the credentials with the external system during the `login()` method.
 
 The details of the default user/group synchronization mechanism are described 
in section
-[User and Group Synchronization : The Default 
Implementation](defaultusersync.html)
+[User and Group Synchronization : The Default 
Implementation](external/defaultusersync.html)
 
 ##### Supported Credentials
 

Modified: 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/usersync.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/usersync.md?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/usersync.md
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/authentication/usersync.md
 Thu Aug 18 14:50:13 2016
@@ -51,7 +51,7 @@ for the following tasks:
 Oak 1.0 provides a default implementation of the user synchronization API that 
allow
 to plug additional `SyncHandler` implementations. 
 
-Default implementation is described in section [User and Group Synchronization 
: The Default Implementation](defaultusersync.html).
+Default implementation is described in section [User and Group Synchronization 
: The Default Implementation](external/defaultusersync.html).
 
 ### Pluggability
 

Modified: 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/principal/principalprovider.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/principal/principalprovider.md?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/principal/principalprovider.md
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-doc/src/site/markdown/security/principal/principalprovider.md
 Thu Aug 18 14:50:13 2016
@@ -79,7 +79,7 @@ principals on the IDP but relies on a pe
 the names of these external principals are synchronized to based on a 
configurable
 expiration time.
 
-See section [User and Group Synchronization : The Default 
Implementation](../authentication/defaultusersync.html)
+See section [User and Group Synchronization : The Default 
Implementation](../authentication/external/defaultusersync.html)
 for additional details.
 
 Since Oak 1.5.3

Modified: jackrabbit/oak/branches/1.2/oak-run/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/pom.xml?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-run/pom.xml (original)
+++ jackrabbit/oak/branches/1.2/oak-run/pom.xml Thu Aug 18 14:50:13 2016
@@ -390,6 +390,12 @@
       <optional>true</optional>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
+      <scope>compile</scope>
+    </dependency>
+
     <!-- Findbugs annotations -->
     <dependency>
       <groupId>com.google.code.findbugs</groupId>

Modified: 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Thu Aug 18 14:50:13 2016
@@ -120,6 +120,10 @@ public class BenchmarkRunner {
         OptionSpec<Boolean> setScope = parser.accepts("setScope", "Whether to 
use include setScope in the user query.")
                         .withOptionalArg().ofType(Boolean.class)
                         .defaultsTo(Boolean.FALSE);
+        OptionSpec<Boolean> dynamicMembership = 
parser.accepts("dynamicMembership", "Enable dynamic membership handling during 
synchronisation of external users.")
+                
.withOptionalArg().ofType(Boolean.class).defaultsTo(Boolean.FALSE);
+        OptionSpec<String> autoMembership = parser.accepts("autoMembership", 
"Ids of those groups a given external identity automatically become member of.")
+                
.withOptionalArg().ofType(String.class).withValuesSeparatedBy(',');
         OptionSpec<String> nonOption = parser.nonOptions();
         OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show 
help").forHelp();
         OptionSet options = parser.parse(args);
@@ -299,9 +303,9 @@ public class BenchmarkRunner {
             new FindAuthorizableWithScopeTest(numberOfUsers.value(options), 
setScope.value(options)),
 
             // benchmarks for oak-auth-external
-            new ExternalLoginTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), false),
-            new SyncAllExternalUsersTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), false),
-            new SyncExternalUsersTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), false, 
batchSize.value(options))
+            new ExternalLoginTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), 
dynamicMembership.value(options), autoMembership.values(options)),
+            new SyncAllExternalUsersTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), 
dynamicMembership.value(options), autoMembership.values(options)),
+            new SyncExternalUsersTest(numberOfUsers.value(options), 
numberOfGroups.value(options), expiration.value(options), 
dynamicMembership.value(options), autoMembership.values(options), 
batchSize.value(options))
         };
 
         Set<String> argset = Sets.newHashSet(nonOption.values(options));

Modified: 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
 Thu Aug 18 14:50:13 2016
@@ -33,6 +33,8 @@ import javax.security.auth.login.Configu
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.benchmark.AbstractTest;
 import org.apache.jackrabbit.oak.fixture.JcrCreator;
@@ -52,14 +54,19 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncManager;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncConfigImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIDPManagerImpl;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.SyncHandlerMapping;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.SyncManagerImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.principal.ExternalPrincipalConfiguration;
 import 
org.apache.jackrabbit.oak.spi.security.principal.CompositePrincipalConfiguration;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
+import org.apache.sling.testing.mock.osgi.context.OsgiContextImpl;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -68,19 +75,23 @@ import static com.google.common.base.Pre
  *
  * The setup currently defines the following configuration options:
  *
- * - {@code numberofUsers} : number of user accounts that are 'known' to the 
IDP
- * - {@code numberofGroups}: number of groups 'known' to the IDP and equally 
used to define the membershipSize of each user.
+ * - {@code numberOfUsers} : number of user accounts that are 'known' to the 
IDP
+ * - {@code numberOfGroups}: number of groups 'known' to the IDP and equally 
used to define the membershipSize of each user.
  * - {@code expirationTime}: expiration time as set with
  *   {@link DefaultSyncConfig.Authorizable#setExpirationTime(long)}, used for 
both users and groups
  * - {@code dynamicMembership}: boolean flag to enable dynamic membership (see 
OAK-4101)
  *
  * Note: by default the {@link 
DefaultSyncConfig.User#setMembershipNestingDepth(long)}
  * is set to 1 and each user will become member of each of the groups as 
defined
- * by {@code numberofGroups}.
+ * by {@code numberOfGroups}.
  */
 abstract class AbstractExternalTest extends AbstractTest {
 
     private static final String PATH_PREFIX = "pathPrefix";
+
+    private final Random random = new Random();
+    private final ExternalPrincipalConfiguration 
externalPrincipalConfiguration = new ExternalPrincipalConfiguration();
+
     final DefaultSyncConfig syncConfig = new DefaultSyncConfig();
     final SyncHandler syncHandler = new DefaultSyncHandler(syncConfig);
 
@@ -89,13 +100,14 @@ abstract class AbstractExternalTest exte
     SyncManagerImpl syncManager;
     ExternalIdentityProviderManager idpManager;
 
-    private final Random random = new Random();
-
-    protected AbstractExternalTest(int numberofUsers, int numberofGroups, long 
expTime, boolean dynamicMembership) {
-        idp = new TestIdentityProvider(numberofUsers, numberofGroups);
+    protected AbstractExternalTest(int numberOfUsers, int numberOfGroups,
+                                   long expTime, boolean dynamicMembership,
+                                   @Nonnull List<String> autoMembership) {
+        idp = new TestIdentityProvider(numberOfUsers, numberOfGroups);
         syncConfig.user()
                 .setMembershipNestingDepth(1)
                 .setDynamicMembership(dynamicMembership)
+                .setAutoMembership(autoMembership.toArray(new 
String[autoMembership.size()]))
                 .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX);
         syncConfig.group()
                 .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX);
@@ -104,7 +116,7 @@ abstract class AbstractExternalTest exte
     protected abstract Configuration createConfiguration();
 
     protected String getRandomUserId() {
-        int index = random.nextInt(((TestIdentityProvider) idp).numberofUsers);
+        int index = random.nextInt(((TestIdentityProvider) idp).numberOfUsers);
         return "u" + index;
     }
 
@@ -120,6 +132,19 @@ abstract class AbstractExternalTest exte
         super.run(iterable, concurrencyLevels);
     }
 
+    @Override
+    protected void beforeSuite() throws Exception {
+        Set<String> autoMembership = syncConfig.user().getAutoMembership();
+        if (!autoMembership.isEmpty()) {
+            Session s = loginAdministrative();
+            UserManager userManager = ((JackrabbitSession) s).getUserManager();
+            for (String groupId : autoMembership) {
+                userManager.createGroup(groupId, new PrincipalImpl(groupId), 
PATH_PREFIX);
+            }
+            s.save();
+        }
+    }
+
     /**
      * Remove any user/group accounts that have been synchronized into the 
repo.
      *
@@ -154,6 +179,27 @@ abstract class AbstractExternalTest exte
                     whiteboard.register(ExternalIdentityProvider.class, idp, 
Collections.emptyMap());
                     whiteboard.register(SyncHandler.class, syncHandler, 
Collections.emptyMap());
 
+                    // assert proper init of the 
'externalPrincipalConfiguration' if dynamic membership is enabled
+                    if (syncConfig.user().getDynamicMembership()) {
+                        OsgiContextImpl context = new OsgiContextImpl();
+
+                        // register the ExternalPrincipal configuration in 
order to have it's
+                        // activate method invoked.
+                        
context.registerInjectActivateService(externalPrincipalConfiguration);
+
+                        // now register the sync-handler with the dynamic 
membership config
+                        // in order to enable dynamic membership with the 
external principal configuration
+                        Map props = ImmutableMap.of(
+                                
DefaultSyncConfigImpl.PARAM_USER_DYNAMIC_MEMBERSHIP, 
syncConfig.user().getDynamicMembership(),
+                                
DefaultSyncConfigImpl.PARAM_GROUP_AUTO_MEMBERSHIP, 
syncConfig.user().getAutoMembership());
+                        context.registerService(SyncHandler.class, 
WhiteboardUtils.getService(whiteboard, SyncHandler.class), props);
+
+                        Map shMappingProps = ImmutableMap.of(
+                                SyncHandlerMapping.PARAM_IDP_NAME, 
idp.getName(),
+                                SyncHandlerMapping.PARAM_SYNC_HANDLER_NAME, 
syncConfig.getName());
+                        context.registerService(SyncHandlerMapping.class, new 
SyncHandlerMapping() {}, shMappingProps);
+                    }
+
                     SecurityProvider sp = new 
TestSecurityProvider(ConfigurationParameters.EMPTY);
                     return new Jcr(oak).with(sp);
                 }
@@ -171,7 +217,7 @@ abstract class AbstractExternalTest exte
                 throw new IllegalStateException();
             } else {
                 PrincipalConfiguration defConfig = 
checkNotNull(((CompositePrincipalConfiguration) 
principalConfiguration).getDefaultConfig());
-                bindPrincipalConfiguration((new 
ExternalPrincipalConfiguration(this)));
+                bindPrincipalConfiguration(externalPrincipalConfiguration);
                 bindPrincipalConfiguration(defConfig);
             }
         }
@@ -179,11 +225,11 @@ abstract class AbstractExternalTest exte
 
     private final class TestIdentityProvider implements 
ExternalIdentityProvider {
 
-        private final int numberofUsers;
+        private final int numberOfUsers;
         private final int membershipSize;
 
-        private TestIdentityProvider(int numberofUsers, int membershipSize) {
-            this.numberofUsers = numberofUsers;
+        private TestIdentityProvider(int numberOfUsers, int membershipSize) {
+            this.numberOfUsers = numberOfUsers;
             this.membershipSize = membershipSize;
         }
 
@@ -227,7 +273,7 @@ abstract class AbstractExternalTest exte
         @Override
         public Iterator<ExternalUser> listUsers() {
             Set<ExternalUser> all = new HashSet<ExternalUser>();
-            for (long i = 0; i < numberofUsers; i++) {
+            for (long i = 0; i < numberOfUsers; i++) {
                 all.add(new TestUser(i));
             }
             return all.iterator();

Modified: 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/ExternalLoginTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/ExternalLoginTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/ExternalLoginTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/ExternalLoginTest.java
 Thu Aug 18 14:50:13 2016
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.benchmark.authentication.external;
 
+import java.util.List;
+import javax.annotation.Nonnull;
 import javax.jcr.SimpleCredentials;
 import javax.security.auth.login.AppConfigurationEntry;
 import javax.security.auth.login.Configuration;
@@ -34,8 +36,9 @@ import org.apache.jackrabbit.oak.spi.sec
  */
 public class ExternalLoginTest extends AbstractExternalTest {
 
-    public ExternalLoginTest(int numberofUsers, int numberofGroups, long 
expTime, boolean dynamicMembership) {
-        super(numberofUsers, numberofGroups, expTime, dynamicMembership);
+    public ExternalLoginTest(int numberOfUsers, int numberOfGroups, long 
expTime,
+                             boolean dynamicMembership, @Nonnull List<String> 
autoMembership) {
+        super(numberOfUsers, numberOfGroups, expTime, dynamicMembership, 
autoMembership);
     }
 
     @Override

Modified: 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncAllExternalUsersTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncAllExternalUsersTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncAllExternalUsersTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncAllExternalUsersTest.java
 Thu Aug 18 14:50:13 2016
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.benchmark.authentication.external;
 
+import java.util.List;
+import javax.annotation.Nonnull;
 import javax.security.auth.login.Configuration;
 
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
@@ -30,8 +32,9 @@ public class SyncAllExternalUsersTest ex
 
     private SynchronizationMBean bean;
 
-    public SyncAllExternalUsersTest(int numberofUsers, int membershipSize, 
long expTime, boolean dynamicMembership) {
-        super(numberofUsers, membershipSize, expTime, dynamicMembership);
+    public SyncAllExternalUsersTest(int numberOfUsers, int membershipSize, 
long expTime,
+                                    boolean dynamicMembership, @Nonnull 
List<String> autoMembership) {
+        super(numberOfUsers, membershipSize, expTime, dynamicMembership, 
autoMembership);
     }
 
     @Override

Modified: 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncExternalUsersTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncExternalUsersTest.java?rev=1756800&r1=1756799&r2=1756800&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncExternalUsersTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/SyncExternalUsersTest.java
 Thu Aug 18 14:50:13 2016
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.benchmark.authentication.external;
 
+import java.util.List;
+import javax.annotation.Nonnull;
 import javax.security.auth.login.Configuration;
 
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
@@ -33,9 +35,10 @@ public class SyncExternalUsersTest exten
     private final int batchSize;
     private SynchronizationMBean bean;
 
-    public SyncExternalUsersTest(int numberofUsers, int membershipSize, long 
expTime,
-                                 boolean dynamicMembership, int batchSize) {
-        super(numberofUsers, membershipSize, expTime, dynamicMembership);
+    public SyncExternalUsersTest(int numberOfUsers, int membershipSize, long 
expTime,
+                                 boolean dynamicMembership, @Nonnull 
List<String> autoMembership,
+                                 int batchSize) {
+        super(numberOfUsers, membershipSize, expTime, dynamicMembership, 
autoMembership);
         this.batchSize = batchSize;
     }
 


Reply via email to