branch feature/1_socialauth updated (85efd12e -> e7253bfe)
This is an automated email from the git hooks/post-receive script. New change to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git from 85efd12e refs #1 connexion avec google new e7253bfe refs #1 ajout de la conf des providers dans la base (plus simple à modifier) + début de l'admin The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit e7253bfec44286df6ef98a32ff9a58e63157318c Author: Kevin Morin <morin@codelutin.com> Date: Thu Aug 24 17:35:35 2017 +0200 refs #1 ajout de la conf des providers dans la base (plus simple à modifier) + début de l'admin Summary of changes: .../migration/h2/V3_0_0_9__add_loginproviders.sql | 13 +++ .../postgresql/V3_0_0_9__add_loginproviders.sql | 12 +++ pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 27595 -> 28069 bytes .../org/chorem/pollen/rest/api/v1/AuthApi.java | 28 +++++++ .../pollen/services/bean/LoginProviderBean.java | 82 ++++++++++++++++++ .../services/service/PollenServiceSupport.java | 5 ++ .../pollen/services/service/SocialAuthService.java | 63 ++++++++++++++ .../src/main/resources/oauth_consumer.properties | 56 ++++++------- pollen-ui-riot-js/src/main/web/i18n.json | 18 +++- pollen-ui-riot-js/src/main/web/js/AuthService.js | 15 +++- pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 8 +- .../src/main/web/tag/PollenHeader.tag.html | 1 + pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html | 12 ++- .../src/main/web/tag/admin/LoginProviders.tag.html | 92 +++++++++++++++++++++ .../src/main/web/tag/{ => admin}/UserCard.tag.html | 6 +- .../web/tag/{ => admin}/UserEditModal.tag.html | 8 +- .../src/main/web/tag/{ => admin}/Users.tag.html | 10 +-- 18 files changed, 383 insertions(+), 48 deletions(-) create mode 100644 pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql create mode 100644 pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java create mode 100644 pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html rename pollen-ui-riot-js/src/main/web/tag/{ => admin}/UserCard.tag.html (95%) rename pollen-ui-riot-js/src/main/web/tag/{ => admin}/UserEditModal.tag.html (94%) rename pollen-ui-riot-js/src/main/web/tag/{ => admin}/Users.tag.html (88%) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit e7253bfec44286df6ef98a32ff9a58e63157318c Author: Kevin Morin <morin@codelutin.com> Date: Thu Aug 24 17:35:35 2017 +0200 refs #1 ajout de la conf des providers dans la base (plus simple à modifier) + début de l'admin --- .../migration/h2/V3_0_0_9__add_loginproviders.sql | 13 +++ .../postgresql/V3_0_0_9__add_loginproviders.sql | 12 +++ pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 27595 -> 28069 bytes .../org/chorem/pollen/rest/api/v1/AuthApi.java | 28 +++++++ .../pollen/services/bean/LoginProviderBean.java | 82 ++++++++++++++++++ .../services/service/PollenServiceSupport.java | 5 ++ .../pollen/services/service/SocialAuthService.java | 63 ++++++++++++++ .../src/main/resources/oauth_consumer.properties | 56 ++++++------- pollen-ui-riot-js/src/main/web/i18n.json | 18 +++- pollen-ui-riot-js/src/main/web/js/AuthService.js | 15 +++- pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 8 +- .../src/main/web/tag/PollenHeader.tag.html | 1 + pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html | 12 ++- .../src/main/web/tag/admin/LoginProviders.tag.html | 92 +++++++++++++++++++++ .../src/main/web/tag/{ => admin}/UserCard.tag.html | 6 +- .../web/tag/{ => admin}/UserEditModal.tag.html | 8 +- .../src/main/web/tag/{ => admin}/Users.tag.html | 10 +-- 18 files changed, 383 insertions(+), 48 deletions(-) diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql new file mode 100644 index 00000000..1a3adce2 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql @@ -0,0 +1,13 @@ +-- LOGINPROVIDER + +CREATE TABLE LOGINPROVIDER ( + TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY, + TOPIAVERSION BIGINT NOT NULL, + TOPIACREATEDATE TIMESTAMP, + NAME VARCHAR(255), + KEY VARCHAR(255), + SECRET VARCHAR(255), + PERMISSIONS VARCHAR(255), + ACTIVE BOOLEAN +); + diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql new file mode 100644 index 00000000..75a094ea --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql @@ -0,0 +1,12 @@ +-- LOGINPROVIDER + +CREATE TABLE LOGINPROVIDER ( + TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY, + TOPIAVERSION BIGINT NOT NULL, + TOPIACREATEDATE TIMESTAMP, + NAME VARCHAR(255), + KEY VARCHAR(255), + SECRET VARCHAR(255), + PERMISSIONS VARCHAR(255), + ACTIVE BOOLEAN +); diff --git a/pollen-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties index 16d95ab4..d172fe4c 100644 --- a/pollen-persistence/src/main/xmi/pollen.properties +++ b/pollen-persistence/src/main/xmi/pollen.properties @@ -18,7 +18,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ###m -model.tagvalue.version=3.0.0.8 +model.tagvalue.version=3.0.0.9 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 72886764..0f29e782 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java index 7a7b74bb..748dc894 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java @@ -29,6 +29,7 @@ import org.apache.shiro.codec.Base64; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.bean.LoginProviderBean; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.SocialAuthService; @@ -55,6 +56,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; import java.net.URI; +import java.util.List; import java.util.Map; /** @@ -248,4 +250,30 @@ public class AuthApi { } + @Path("/loginproviders") + @GET + public List<LoginProviderBean> getAllLoginProviders(@Context SocialAuthService socialAuthService) { + return socialAuthService.getAllLoginProviders(); + } + + @Path("/loginproviders") + @POST + public LoginProviderBean addLoginProvider(@Context SocialAuthService socialAuthService, + LoginProviderBean loginProvider) { + return socialAuthService.saveLoginProvider(loginProvider, false); + } + + @Path("/loginproviders/{providerId}") + @POST @PUT + public LoginProviderBean saveLoginProvider(@Context SocialAuthService socialAuthService, + LoginProviderBean loginProvider) { + return socialAuthService.saveLoginProvider(loginProvider, true); + } + + @Path("/loginproviders/active") + @GET + public List<String> getAvailableLoginProviders(@Context SocialAuthService socialAuthService) { + return socialAuthService.getAvailableLoginProviders(); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java new file mode 100644 index 00000000..e24d2d19 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java @@ -0,0 +1,82 @@ +package org.chorem.pollen.services.bean; + +import org.chorem.pollen.persistence.entity.LoginProvider; +import org.chorem.pollen.persistence.entity.LoginProviderImpl; + +/** + * @author Kevin Morin (Code Lutin) + */ +public class LoginProviderBean extends PollenBean<LoginProvider> { + + protected String name; + protected String key; + protected String secret; + protected String permissions; + protected boolean active; + + public LoginProviderBean() { + super(LoginProvider.class); + } + + @Override + public void fromEntity(LoginProvider entity) { + setEntityId(entity.getTopiaId()); + setName(entity.getName()); + setKey(entity.getKey()); + setSecret(entity.getSecret()); + setPermissions(entity.getPermissions()); + setActive(entity.isActive()); + } + + @Override + public LoginProvider toEntity() { + LoginProvider entity = new LoginProviderImpl(); + entity.setTopiaId(getEntityId()); + entity.setName(getName()); + entity.setKey(getKey()); + entity.setSecret(getSecret()); + entity.setPermissions(getPermissions()); + entity.setActive(isActive()); + return entity; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getPermissions() { + return permissions; + } + + public void setPermissions(String permissions) { + this.permissions = permissions; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index c26c5f50..860e0266 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -33,6 +33,7 @@ import org.chorem.pollen.persistence.entity.ChoiceTopiaDao; import org.chorem.pollen.persistence.entity.CommentTopiaDao; import org.chorem.pollen.persistence.entity.FavoriteListMemberTopiaDao; import org.chorem.pollen.persistence.entity.FavoriteListTopiaDao; +import org.chorem.pollen.persistence.entity.LoginProviderTopiaDao; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollTopiaDao; import org.chorem.pollen.persistence.entity.PollenPrincipalTopiaDao; @@ -242,6 +243,10 @@ public abstract class PollenServiceSupport implements PollenService { return getPersistenceContext().getVoterListMemberDao(); } + protected LoginProviderTopiaDao getLoginProviderDao() { + return getPersistenceContext().getLoginProviderDao(); + } + public void commit() { getPersistenceContext().commit(); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java index 6866b3b5..2d4aa50f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java @@ -1,5 +1,6 @@ package org.chorem.pollen.services.service; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.brickred.socialauth.AuthProvider; @@ -7,15 +8,22 @@ import org.brickred.socialauth.Profile; import org.brickred.socialauth.SocialAuthConfig; import org.brickred.socialauth.SocialAuthManager; import org.brickred.socialauth.util.Constants; +import org.brickred.socialauth.util.OAuthConfig; +import org.chorem.pollen.persistence.entity.LoginProvider; +import org.chorem.pollen.persistence.entity.LoginProviderTopiaDao; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.PollenUserImpl; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.UserCredentialImpl; +import org.chorem.pollen.services.bean.LoginProviderBean; import org.chorem.pollen.services.bean.PollenEntityRef; +import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** * @author Kevin Morin (Code Lutin) @@ -90,6 +98,22 @@ public class SocialAuthService extends PollenServiceSupport { //Create an instance of SocialAuthConfgi object SocialAuthConfig config = SocialAuthConfig.getDefault(); + List<LoginProvider> allActiveProviders = getLoginProviderDao().forActiveEquals(true).findAll(); + allActiveProviders.forEach(provider -> { + try { + OAuthConfig providerConfig = new OAuthConfig(provider.getKey(), provider.getSecret()); + if (StringUtils.isNotBlank(provider.getPermissions())) { + providerConfig.setCustomPermissions(provider.getPermissions()); + } + config.addProviderConfig(provider.getName(), providerConfig); + + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Error while adding config for provider " + provider.getName(), e); + } + } + }); + //load configuration. By default load the configuration from oauth_consumer.properties. //You can also pass input stream, properties object or properties file name. config.load(); @@ -100,4 +124,43 @@ public class SocialAuthService extends PollenServiceSupport { return manager; } + + public List<LoginProviderBean> getAllLoginProviders() { + checkIsAdmin(); + LoginProviderTopiaDao dao = getLoginProviderDao(); + List<LoginProvider> loginProviders = dao.findAll().stream() + .sorted(Comparator.comparing(LoginProvider::getName)) + .collect(Collectors.toList()); + return toBeanList(LoginProviderBean.class, loginProviders); + } + + public List<String> getAvailableLoginProviders() { + LoginProviderTopiaDao dao = getLoginProviderDao(); + return dao.forActiveEquals(true).findAll().stream() + .map(LoginProvider::getName) + .sorted() + .collect(Collectors.toList()); + } + + public LoginProviderBean saveLoginProvider(LoginProviderBean loginProvider, boolean loginProviderExists) { + checkIsAdmin(); + checkNotNull(loginProvider); + LoginProviderTopiaDao dao = getLoginProviderDao(); + + LoginProvider toSave; + + if (loginProviderExists) { + toSave = dao.forTopiaIdEquals(loginProvider.getEntityId()).findUnique(); + } else { + toSave = dao.create(); + } + toSave.setName(loginProvider.getName()); + toSave.setKey(loginProvider.getKey()); + toSave.setSecret(loginProvider.getSecret()); + toSave.setPermissions(loginProvider.getPermissions()); + toSave.setActive(loginProvider.isActive()); + + commit(); + return toBean(LoginProviderBean.class, toSave); + } } diff --git a/pollen-services/src/main/resources/oauth_consumer.properties b/pollen-services/src/main/resources/oauth_consumer.properties index 6f015cc3..02f55921 100644 --- a/pollen-services/src/main/resources/oauth_consumer.properties +++ b/pollen-services/src/main/resources/oauth_consumer.properties @@ -1,6 +1,6 @@ #google -www.google.com.consumer_key = opensource.brickred.com -www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj +#www.google.com.consumer_key = opensource.brickred.com +#www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj #you can set custom permission by using custom_permissions with provider prefix. #www.google.com.custom_permissions = http://www.google.com/m8/feeds/,http://picasaweb.google.com/data/ @@ -13,44 +13,44 @@ www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj #New registration on google will always provide OAuth2 keys which is supported by GooglePlus provider #google plus -googleapis.com.consumer_key = XXXXXXX -googleapis.com.consumer_secret = XXXXXXXX +#googleapis.com.consumer_key = XXXXXXX +#googleapis.com.consumer_secret = XXXXXXXX #yahoo -api.login.yahoo.com.consumer_key = dj0yJmk9VTdaSUVTU3RrWlRzJmQ9WVdrOWNtSjZNMFpITm1VbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1iMA-- -api.login.yahoo.com.consumer_secret = 1db3d0b897dac60e151aa9e2499fcb2a6b474546 +#api.login.yahoo.com.consumer_key = dj0yJmk9VTdaSUVTU3RrWlRzJmQ9WVdrOWNtSjZNMFpITm1VbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1iMA-- +#api.login.yahoo.com.consumer_secret = 1db3d0b897dac60e151aa9e2499fcb2a6b474546 #twitter -twitter.com.consumer_key = E3hm7J9IQbWLijpiQG7W8Q -twitter.com.consumer_secret = SGKNuXyybt0iDdgsuzVbFHOaemV7V6pr0wKwbaT2MH0 +#twitter.com.consumer_key = E3hm7J9IQbWLijpiQG7W8Q +#twitter.com.consumer_secret = SGKNuXyybt0iDdgsuzVbFHOaemV7V6pr0wKwbaT2MH0 #facebook -graph.facebook.com.consumer_key = 152190004803645 -graph.facebook.com.consumer_secret = 64c94bd02180b0ade85889b44b2ba7c4 +#graph.facebook.com.consumer_key = 152190004803645 +#graph.facebook.com.consumer_secret = 64c94bd02180b0ade85889b44b2ba7c4 #you can set custom permission by using custom_permissions with provider prefix. #graph.facebook.com.custom_permissions = publish_stream,email,user_birthday,user_location,offline_access #hotmail -consent.live.com.consumer_key = 000000004403D60E -consent.live.com.consumer_secret = cYqlii67pTvgPD4pdB7NUVC7L4MIHCcs +#consent.live.com.consumer_key = 000000004403D60E +#consent.live.com.consumer_secret = cYqlii67pTvgPD4pdB7NUVC7L4MIHCcs #Same keys will work for Linkedin OAuth2 provider #LinkedIn -api.linkedin.com.consumer_key = 9-mmqg28fpMocVuAg87exH-RXKs70yms52GSFIqkZN25S3m96kdPGBbuSxdSBIyL -api.linkedin.com.consumer_secret = e6NBqhDYE1fX17RwYGW5vMp25Cvh7Sbw9t-zMYTIW_T5LytY5OwJ12snh_YftgE4 +#api.linkedin.com.consumer_key = 9-mmqg28fpMocVuAg87exH-RXKs70yms52GSFIqkZN25S3m96kdPGBbuSxdSBIyL +#api.linkedin.com.consumer_secret = e6NBqhDYE1fX17RwYGW5vMp25Cvh7Sbw9t-zMYTIW_T5LytY5OwJ12snh_YftgE4 #MySpace -api.myspace.com.consumer_key = 29db395f5ee8426bb90b1db65c91c956 -api.myspace.com.consumer_secret = 0fdccc829c474e42867e16b68cda37a4c4b7b08eda574fe6a959943e3e9be709 +#api.myspace.com.consumer_key = 29db395f5ee8426bb90b1db65c91c956 +#api.myspace.com.consumer_secret = 0fdccc829c474e42867e16b68cda37a4c4b7b08eda574fe6a959943e3e9be709 #FourSquare -foursquare.com.consumer_key = JQKEM1PHWFW4YF2YPEQBRRESXE3SBGNCYJWWDTZKF3IZNJ3V -foursquare.com.consumer_secret = 4IILLDFDVPP2LC554S4KXKETQNTDKPDSEVCKVHA2QEHKYBEQ +#foursquare.com.consumer_key = JQKEM1PHWFW4YF2YPEQBRRESXE3SBGNCYJWWDTZKF3IZNJ3V +#foursquare.com.consumer_secret = 4IILLDFDVPP2LC554S4KXKETQNTDKPDSEVCKVHA2QEHKYBEQ #Yammer -www.yammer.com.consumer_key=5zyIkp12TrkulSRbSegQ -www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw +#www.yammer.com.consumer_key=5zyIkp12TrkulSRbSegQ +#www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw #Please use your own keys for mendeley #Mendeley @@ -58,20 +58,20 @@ www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw #api.mendeley.com.consumer_secret= #Salesforce -login.salesforce.com.consumer_key = 3MVG9Y6d_Btp4xp4yFMR0tPSndkAVu4OBejuYcL2iGFC68tA49PknWKX20XdPl5s1iwWldyuAbSINWHbB2Jcu -login.salesforce.com.consumer_secret = 1993703471433041656 +#login.salesforce.com.consumer_key = 3MVG9Y6d_Btp4xp4yFMR0tPSndkAVu4OBejuYcL2iGFC68tA49PknWKX20XdPl5s1iwWldyuAbSINWHbB2Jcu +#login.salesforce.com.consumer_secret = 1993703471433041656 #Instagram -api.instagram.com.consumer_key=f1e23002a9da49f696d439368624c9fc -api.instagram.com.consumer_secret=f274614621f64d498cb3458b3736827a +#api.instagram.com.consumer_key=f1e23002a9da49f696d439368624c9fc +#api.instagram.com.consumer_secret=f274614621f64d498cb3458b3736827a #Flickr -www.flickr.com.consumer_key=942a1a394b866a30dc9b4ad8db5cb8f8 -www.flickr.com.consumer_secret=f90c5bee8a8de964 +#www.flickr.com.consumer_key=942a1a394b866a30dc9b4ad8db5cb8f8 +#www.flickr.com.consumer_secret=f90c5bee8a8de964 #GITHub -api.github.com.consumer_key=4ffc69764a59dd3ce347 -api.github.com.consumer_secret=dc62937c1d7bb9ce30cb654a26d4a575858f5e1f +#api.github.com.consumer_key=4ffc69764a59dd3ce347 +#api.github.com.consumer_secret=dc62937c1d7bb9ce30cb654a26d4a575858f5e1f #Implementations #you can provide your custom provider here e.g 'myprovider' is your provider id diff --git a/pollen-ui-riot-js/src/main/web/i18n.json b/pollen-ui-riot-js/src/main/web/i18n.json index b4d34d79..61efac9d 100644 --- a/pollen-ui-riot-js/src/main/web/i18n.json +++ b/pollen-ui-riot-js/src/main/web/i18n.json @@ -224,6 +224,7 @@ "header_myParticipatedPolls": "Mes participations", "header_polls": "Sondages", "header_users": "Utilisateurs", + "header_loginProviders": "Tiers de connexion", "header_myFavoriteLists": "Mes listes de votants", "header_createOtherPoll": "Nouveau sondage standard", "header_createDatePoll": "Nouveau sondage de dates", @@ -538,7 +539,13 @@ "feedback_description": "Merci de détailler ci-dessous votre rapport de bug ou votre remarque", "feedback_descriptionNotBlank": "La description ne doit pas être blanc", "feedback_uploadScreenShot": "Copie d'écran", - "feedback_create_success": "La remarque est envoyée." + "feedback_create_success": "La remarque est envoyée.", + "loginProviders_title": "Tiers pour la connexion", + "loginProviders_name": "Nom", + "loginProviders_key": "Clé client", + "loginProviders_secret": "Code secret", + "loginProviders_permissions": "Permissions", + "loginProviders_active": "Actif" }, "en": { "main_pollen_title": "Pollen - ", @@ -763,6 +770,7 @@ "header_newPoll" : "Nouveau sondage", "header_polls": "Polls", "header_users": "Users", + "header_loginProviders": "Login providers", "header_myFavoriteLists": "My favorite lists", "header_createOtherPoll": "New standard poll", "header_createDatePoll": "New date poll", @@ -1058,6 +1066,12 @@ "feedback_description": "Thank to details below your bug report ou your observation", "feedback_descriptionNotBlank": "Observation must be not blank", "feedback_uploadScreenShot": "Screenshot", - "feedback_create_success": "Observation has benn send." + "feedback_create_success": "Observation has been send.", + "loginProviders_title": "Login provider", + "loginProviders_name": "Name", + "loginProviders_key": "Client key", + "loginProviders_secret": "Secret code", + "loginProviders_permissions": "Permissions", + "loginProviders_active": "Active" } } diff --git a/pollen-ui-riot-js/src/main/web/js/AuthService.js b/pollen-ui-riot-js/src/main/web/js/AuthService.js index 42052f20..5aa63a94 100644 --- a/pollen-ui-riot-js/src/main/web/js/AuthService.js +++ b/pollen-ui-riot-js/src/main/web/js/AuthService.js @@ -69,14 +69,25 @@ class AuthService extends FetchService { } signInProvider(query, providerRedirection) { - console.log(query) - console.log(providerRedirection) return this.fetch( "/v1/login/" + query.loginProvider, "POST", {Authorization: JSON.stringify(query)}, providerRedirection); } + + getAllLoginProviders() { + return this.get("/v1/loginproviders"); + } + + getAvailableLoginProviders() { + console.log("getAvailableLoginProviders") + return this.get("/v1/loginproviders/active"); + } + + saveLoginProvider(loginProvider) { + return this.post("/v1/loginproviders/" + (loginProvider.id || ""), loginProvider); + } } module.exports = singleton(AuthService); diff --git a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html index 36ca5983..5a4114b6 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html @@ -30,8 +30,9 @@ require("./poll/EditPoll.tag.html"); require("./poll/Poll.tag.html"); require("./poll/Summary.tag.html"); require("./poll/Polls.tag.html"); -require("./Users.tag.html"); require("./UserProfile.tag.html"); +require("./admin/Users.tag.html"); +require("./admin/LoginProviders.tag.html"); require("./favoriteList/FavoriteLists.tag.html"); require("./favoriteList/FavoriteList.tag.html"); require("./popup/ConfirmPopup.tag.html"); @@ -217,6 +218,11 @@ require("./popup/InformationPopup.tag.html"); riot.mount(this.refs.content, "favoritelist", {favoriteListId: favoriteListId}); }); + route("/loginProviders", () => { + this.bus.trigger("pageChanged", "loginProviders"); + riot.mount(this.refs.content, "loginproviders"); + }); + route(() => { var q = route.query(); if (q.loginProvider != null) { diff --git a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html index 9e540e82..7974eccb 100644 --- a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html @@ -37,6 +37,7 @@ require("./popup/FeedbackModal.tag.html"); <div class="dropdown-content right"> <a href="#user">{__.users}</a> <a href="#poll">{__.polls}</a> + <a href="#loginProviders">{__.loginProviders}</a> </div> </div> diff --git a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html index 2ce478c5..c571e63a 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html @@ -58,8 +58,7 @@ require("./components/HumanInput.tag.html"); <a onclick="{newPassword}">{__.lostpassword}</a> </form> <p>Ou connectez vous avec votre compte : - <a onclick="{signinWithProvider('facebook')}"><i class="fa fa-facebook-official"></i></a> - <a onclick="{signinWithProvider('googleplus')}"><i class="fa fa-google"></i></a> + <a each="{loginProvider in loginProviders}" onclick="{signinWithProvider(loginProvider)}">{loginProvider}</a> </p> </div> @@ -79,6 +78,15 @@ require("./components/HumanInput.tag.html"); this.message = ""; this.openSignIn = false; + let authService = require("../js/AuthService"); + this.loginProviders = []; + this.on("mount", () => { + authService.getAvailableLoginProviders().then((result) => { + this.loginProviders = result; + this.update(); + }); + }); + this.newPassword = () => { this.refs.newPassword.open(this.refs.login.value || ""); }; diff --git a/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html new file mode 100644 index 00000000..5e23f89e --- /dev/null +++ b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html @@ -0,0 +1,92 @@ +<LoginProviders> + <div class="container" show="{loaded}"> + <h1>{__.title}</h1> + + <div class="main-content"> + + <table> + <thead> + <tr> + <th>{__.name}</th> + <th>{__.key}</th> + <th>{__.secret}</th> + <th>{__.permission}</th> + <th>{__.active}</th> + </tr> + </thead> + <tbody> + <tr each="{loginprovider, index in loginProviders}"> + <td><input type="text" ref="name{index}" value="{loginprovider.name}" required/></td> + <td><input type="text" ref="key{index}" value="{loginprovider.key}" required/></td> + <td><input type="text" ref="secret{index}" value="{loginprovider.secret}" required/></td> + <td><input type="text" ref="permissions{index}" value="{loginprovider.permissions}"/></td> + <td><input type="checkbox" ref="active{index}" checked="{loginprovider.active}"/></td> + <td> + <button class="c-button" onclick="{saveLoginProvider(index)}"><i class="fa fa-check"></i></button> + <button class="c-button" onclick="{cancelEdition(index)}"><i class="fa fa-remove"></i></button> + </td> + </tr> + </tbody> + </table> + + <button class="c-button" onclick="{addProvider}"><i class="fa fa-plus"></i></button> + </div> + </div> + + <script type="es6"> + this.loaded = false; + let session = require("../../js/Session"); + this.installBundle(session, "loginProviders"); + + let authService = require("../../js/AuthService"); + this.loginProviders = []; + authService.getAllLoginProviders().then((result) => { + if (!this.loaded) { + this.loginProviders = result; + this.loaded = true; + this.update(); + } + return result; + }); + + this.addProvider = (e) => { + e.preventDefault(); + e.stopPropagation(); + this.loginProviders.push({}); + }; + + this.saveLoginProvider = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + let loginProvider = this.loginProviders[index]; + loginProvider.name = this.refs["name" + index].value; + loginProvider.key = this.refs["key" + index].value; + loginProvider.secret = this.refs["secret" + index].value; + loginProvider.permissions = this.refs["permissions" + index].value; + loginProvider.active = this.refs["active" + index].checked; + + authService.saveLoginProvider(loginProvider).then((result) => { + loginProvider.id = result.id; + loginProvider.name = result.name; + loginProvider.key = result.key; + loginProvider.secret = result.secret; + loginProvider.permissions = result.permissions; + loginProvider.active = result.active; + }); + }; + + this.cancelEdition = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + let loginProvider = this.loginProviders[index]; + this.refs["name" + index].value = loginProvider.name || ""; + this.refs["key" + index].value = loginProvider.key || ""; + this.refs["secret" + index].value = loginProvider.secret || ""; + this.refs["permissions" + index].value = loginProvider.permissions || ""; + this.refs["active" + index].checked = loginProvider.active || false; + }; + + </script> + <style> + </style> +</LoginProviders> diff --git a/pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html similarity index 95% rename from pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html index 33ffec79..b2599ea7 100644 --- a/pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html @@ -1,4 +1,4 @@ -require("./components/Card.tag.html"); +require("../components/Card.tag.html"); require("./UserEditModal.tag.html"); <UserCard> @@ -50,9 +50,9 @@ require("./UserEditModal.tag.html"); </form> <script type="es6"> - let session = require("../js/Session"); + let session = require("../../js/Session"); this.installBundle(session, "user"); - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.editing = false; this.errors = {}; diff --git a/pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html similarity index 94% rename from pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html index 5a89e692..a41f5350 100644 --- a/pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html @@ -1,4 +1,4 @@ -require("./popup/Modal.tag.html"); +require("../popup/Modal.tag.html"); <UserEditModal> <Modal ref="modal" @@ -67,10 +67,10 @@ require("./popup/Modal.tag.html"); </Modal> <script type="es6"> - let session = require("../js/Session"); - let Message = require("../js/Message"); + let session = require("../../js/Session"); + let Message = require("../../js/Message"); this.installBundle(session, "user"); - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.errors = {}; diff --git a/pollen-ui-riot-js/src/main/web/tag/Users.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html similarity index 88% rename from pollen-ui-riot-js/src/main/web/tag/Users.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html index bb2d4351..286538ad 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Users.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html @@ -1,6 +1,6 @@ -require("./components/LazyLoad.tag.html"); -require("./components/LoadingCard.tag.html"); -require("./components/Search.tag.html"); +require("../components/LazyLoad.tag.html"); +require("../components/LoadingCard.tag.html"); +require("../components/Search.tag.html"); require("./UserCard.tag.html"); <Users> <div class="container" show="{loaded}"> @@ -28,7 +28,7 @@ require("./UserCard.tag.html"); <script type="es6"> this.loaded = false; - let session = require("../js/Session"); + let session = require("../../js/Session"); this.installBundle(session, "users"); this.pagination = { @@ -39,7 +39,7 @@ require("./UserCard.tag.html"); }; this.search = {value: ""}; - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.refresh = () => { this.refs.lazyLoad.reload(); -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm