{"action":"created","comment":{"url":"https://api.github.com/repos/dotCMS/core/pulls/comments/133850139","pull_request_review_id":57078972,"id":133850139,"diff_hunk":"@@ -0,0 +1,537 @@\n+package com.dotcms.cms.login;\n+\n+import static com.dotmarketing.util.CookieUtil.createJsonWebTokenCookie;\n+\n+import java.util.List;\n+import java.util.Optional;\n+import java.util.concurrent.CopyOnWriteArrayList;\n+\n+import javax.servlet.http.HttpServletRequest;\n+import javax.servlet.http.HttpServletResponse;\n+import javax.servlet.http.HttpSession;\n+\n+import org.apache.commons.logging.Log;\n+import org.apache.commons.logging.LogFactory;\n+\n+import com.dotcms.api.web.HttpServletRequestThreadLocal;\n+import com.dotcms.auth.providers.jwt.JsonWebTokenUtils;\n+import com.dotcms.cms.login.events.LDAPLoginEventListener;\n+import com.dotcms.cms.login.events.LoginEvent;\n+import com.dotcms.cms.login.events.LoginEventListener;\n+import com.dotcms.cms.login.events.LoginEvents;\n+import com.dotcms.enterprise.BaseAuthenticator;\n+import com.dotcms.enterprise.LDAPImpl;\n+import com.dotcms.enterprise.LicenseUtil;\n+import com.dotcms.enterprise.PasswordFactoryProxy;\n+import com.dotcms.enterprise.cas.CASAuthUtils;\n+import com.dotcms.enterprise.de.qaware.heimdall.PasswordException;\n+import com.dotcms.mock.request.MockHttpRequest;\n+import com.dotcms.mock.request.MockSessionRequest;\n+import com.dotcms.mock.response.BaseResponse;\n+import com.dotcms.mock.response.MockHttpResponse;\n+import com.dotcms.repackage.com.google.common.annotations.VisibleForTesting;\n+import com.dotcms.util.ReflectionUtils;\n+import com.dotmarketing.business.APILocator;\n+import com.dotmarketing.business.ApiProvider;\n+import com.dotmarketing.business.DuplicateUserException;\n+import com.dotmarketing.business.UserAPI;\n+import com.dotmarketing.business.web.UserWebAPI;\n+import com.dotmarketing.cms.factories.PublicCompanyFactory;\n+import com.dotmarketing.cms.factories.PublicEncryptionFactory;\n+import com.dotmarketing.exception.DotDataException;\n+import com.dotmarketing.exception.DotSecurityException;\n+import com.dotmarketing.portal.struts.DotCustomLoginPostAction;\n+import com.dotmarketing.util.Config;\n+import com.dotmarketing.util.Logger;\n+import com.dotmarketing.util.SecurityLogger;\n+import com.dotmarketing.util.UtilMethods;\n+import com.liferay.portal.NoSuchUserException;\n+import com.liferay.portal.PortalException;\n+import com.liferay.portal.SystemException;\n+import com.liferay.portal.auth.AuthException;\n+import com.liferay.portal.auth.Authenticator;\n+import com.liferay.portal.model.Company;\n+import com.liferay.portal.model.User;\n+import com.liferay.portal.util.PropsUtil;\n+import com.liferay.portal.util.WebKeys;\n+import com.liferay.util.Validator;\n+\n+/**\n+ * Default implementation\n+ */\n+final class LoginServiceAPIImpl implements LoginServiceAPI {\n+\n+\n+    private static final long serialVersionUID = 1L;\n+    private final Log log = LogFactory.getLog(LoginServiceAPI.class);\n+    private final UserWebAPI userWebAPI;\n+    private final JsonWebTokenUtils jsonWebTokenUtils;\n+    private final HttpServletRequestThreadLocal httpServletRequestThreadLocal;\n+    private final UserAPI userAPI;\n+    private final boolean authByEmail;\n+    private final User systemUser;\n+    private final String preAuthenticator;\n+\n+    @VisibleForTesting\n+    public LoginServiceAPIImpl(final ApiProvider apiProvider,\n+                    final JsonWebTokenUtils jsonWebTokenUtils,\n+                    final HttpServletRequestThreadLocal httpServletRequestThreadLocal,\n+                    final UserAPI userAPI, boolean authByEmail, String preAuthenticator) {\n+\n+        this.userWebAPI = apiProvider.userWebAPI();\n+        this.jsonWebTokenUtils = jsonWebTokenUtils;\n+        this.httpServletRequestThreadLocal = httpServletRequestThreadLocal;\n+        this.userAPI = userAPI;\n+        this.authByEmail = authByEmail;\n+        this.systemUser = APILocator.systemUser();\n+        this.preAuthenticator = preAuthenticator;\n+        this._listeners.add(new LDAPLoginEventListener());\n+\n+    }\n+\n+    @VisibleForTesting\n+    public LoginServiceAPIImpl(final ApiProvider apiProvider,\n+                    final JsonWebTokenUtils jsonWebTokenUtils,\n+                    final HttpServletRequestThreadLocal httpServletRequestThreadLocal,\n+                    final UserAPI userAPI) {\n+        this(apiProvider, jsonWebTokenUtils, httpServletRequestThreadLocal, userAPI,\n+                        (Company.AUTH_TYPE_EA).equals(\n+                                        PublicCompanyFactory.getDefaultCompany().getAuthType()),\n+                        PropsUtil.get(\"auth.pipeline.pre\"));\n+\n+    }\n+\n+    public LoginServiceAPIImpl() {\n+        this(new ApiProvider(), JsonWebTokenUtils.getInstance(),\n+                        HttpServletRequestThreadLocal.INSTANCE, APILocator.getUserAPI());\n+    }\n+\n+\n+\n+    @Override\n+    public void doLogout(final HttpServletRequest req, final HttpServletResponse res) {\n+\n+\n+        LoginEvent event = new LoginEvent(this, LoginEvents.PRE_LOGOUT, null, null, req, res);\n+        for (LoginEventListener listener : _listeners) {\n+            listener.loginEventReceived(event);\n+        }\n+        \n+        _doLogoutInternal(req, res);\n+        \n+        \n+        event = new LoginEvent(this, LoginEvents.POST_LOGOUT, null, null, req, res);\n+        for (LoginEventListener listener : _listeners) {\n+            listener.loginEventReceived(event);\n+        }\n+    }\n+\n+\n+\n+    private void _doLogoutInternal(final HttpServletRequest req, final HttpServletResponse res) {\n+\n+        final HttpSession session = req.getSession(false);\n+\n+        log.debug(\"Logout - Set expire cookies\");\n+        com.dotmarketing.util.CookieUtil.setExpireCookies(req, res);\n+\n+        if (null != session) {\n+\n+            log.debug(\"Logout - Events Processor Pre Logout events.\");\n+\n+\n+            log.debug(\"Logout - Invalidating http session...\");\n+\n+            session.invalidate();\n+\n+            log.debug(\"Logout - Events Processor Post Logout events.\");\n+\n+        }\n+    }\n+\n+\n+\n+    /**\n+     * Generates the JWT and its respective cookie based on the following criteria:\n+     * <ul>\n+     * <li>Information from the user: ID, associated company.</li>\n+     * <li>The \"Remember Me\" option being checked or not.</li>\n+     * </ul>\n+     * The JWT will allow the user to access the dotCMS back-end even though their session has\n+     * expired. This way, they won't need to re-authenticate.\n+     *\n+     * @param req - The {@link HttpServletRequest} object.\n+     * @param res - The {@link HttpServletResponse} object.\n+     * @param user - The {@link User} trying to log into the system.\n+     * @param maxAge - The maximum days (in milliseconds) that the JWT will live. If the \"Remember\n+     *        Me\" option is checked, the token will live for many days (check its default value).\n+     *        Otherwise, it will only live during the current session.\n+     * @throws PortalException The specified user could not be found.\n+     * @throws SystemException An error occurred during the user ID encryption.\n+     */\n+    private void processJsonWebToken(final HttpServletRequest req, final HttpServletResponse res,\n+                    final User user, final int maxAge) throws PortalException, SystemException {\n+\n+        final String jwtAccessToken = this.jsonWebTokenUtils.createToken(user, maxAge);\n+        createJsonWebTokenCookie(req, res, jwtAccessToken, Optional.of(maxAge));\n+    }\n+\n+\n+\n+    @Override\n+    public void doRememberMe(final HttpServletRequest req, final HttpServletResponse res,\n+                    final User user, final boolean rememberMe) {\n+\n+        int jwtMaxAge = rememberMe ? Config.getIntProperty(JSON_WEB_TOKEN_DAYS_MAX_AGE,\n+                        JSON_WEB_TOKEN_DAYS_MAX_AGE_DEFAULT) : -1;\n+\n+        this.doRememberMe(req, res, user, jwtMaxAge);\n+    } // doRememberMe.\n+\n+    @Override\n+    public void doRememberMe(final HttpServletRequest req, final HttpServletResponse res,\n+                    final User user, final int maxAge) {\n+\n+        try {\n+\n+            this.processJsonWebToken(req, res, user, maxAge);\n+        } catch (Exception e) {\n+\n+            Logger.debug(this, e.getMessage(), e);\n+        }\n+    } // doRememberMe.\n+\n+\n+    private boolean _doCookieLogin(String encryptedId, HttpServletRequest request,\n+                    HttpServletResponse response) {\n+\n+        try {\n+            String decryptedId = PublicEncryptionFactory.decryptString(encryptedId);\n+            /* Custom Code */\n+            User user = null;\n+            if (Validator.isEmailAddress(decryptedId))\n+                user = userAPI.loadByUserByEmail(decryptedId, systemUser, false);\n+            else\n+                user = userAPI.loadUserById(decryptedId, systemUser, false);\n+            /* End of Custom Code */\n+            try {\n+                String userName = (authByEmail) ? user.getEmailAddress() : user.getUserId();\n+\n+                return _doLogin(userName, null, true, request, response, true);\n+            } catch (Exception e) { // $codepro.audit.disable logExceptions","path":"dotCMS/src/main/java/com/dotcms/cms/login/LoginServiceAPIImpl.java","position":221,"original_position":221,"commit_id":"a1c89607c2bbd010917adf9eb98701e80419f535","original_commit_id":"a1c89607c2bbd010917adf9eb98701e80419f535","user":{"login":"jenkins-dotcms","id":29232833,"avatar_url":"https://avatars2.githubusercontent.com/u/29232833?v=4","gravatar_id":"","url":"https://api.github.com/users/jenkins-dotcms","html_url":"https://github.com/jenkins-dotcms","followers_url":"https://api.github.com/users/jenkins-dotcms/followers","following_url":"https://api.github.com/users/jenkins-dotcms/following{/other_user}","gists_url":"https://api.github.com/users/jenkins-dotcms/gists{/gist_id}","starred_url":"https://api.github.com/users/jenkins-dotcms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenkins-dotcms/subscriptions","organizations_url":"https://api.github.com/users/jenkins-dotcms/orgs","repos_url":"https://api.github.com/users/jenkins-dotcms/repos","events_url":"https://api.github.com/users/jenkins-dotcms/events{/privacy}","received_events_url":"https://api.github.com/users/jenkins-dotcms/received_events","type":"User","site_admin":false},"body":"![MINOR](https://sonarsource.github.io/sonar-github/severity-minor.png 'Severity: MINOR') Catch a list of specific exception subtypes instead. [![rule](https://sonarsource.github.io/sonar-github/rule.png)](https://sonarcloud.io/coding_rules#rule_key=squid%3AS2221)\n","created_at":"2017-08-17T23:07:18Z","updated_at":"2017-08-17T23:07:18Z","html_url":"https://github.com/dotCMS/core/pull/12363#discussion_r133850139","pull_request_url":"https://api.github.com/repos/dotCMS/core/pulls/12363","_links":{"self":{"href":"https://api.github.com/repos/dotCMS/core/pulls/comments/133850139"},"html":{"href":"https://github.com/dotCMS/core/pull/12363#discussion_r133850139"},"pull_request":{"href":"https://api.github.com/repos/dotCMS/core/pulls/12363"}}},"pull_request":{"url":"https://api.github.com/repos/dotCMS/core/pulls/12363","id":136370786,"html_url":"https://github.com/dotCMS/core/pull/12363","diff_url":"https://github.com/dotCMS/core/pull/12363.diff","patch_url":"https://github.com/dotCMS/core/pull/12363.patch","issue_url":"https://api.github.com/repos/dotCMS/core/issues/12363","number":12363,"state":"open","locked":false,"title":"#2252 initial work","user":{"login":"wezell","id":934364,"avatar_url":"https://avatars2.githubusercontent.com/u/934364?v=4","gravatar_id":"","url":"https://api.github.com/users/wezell","html_url":"https://github.com/wezell","followers_url":"https://api.github.com/users/wezell/followers","following_url":"https://api.github.com/users/wezell/following{/other_user}","gists_url":"https://api.github.com/users/wezell/gists{/gist_id}","starred_url":"https://api.github.com/users/wezell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wezell/subscriptions","organizations_url":"https://api.github.com/users/wezell/orgs","repos_url":"https://api.github.com/users/wezell/repos","events_url":"https://api.github.com/users/wezell/events{/privacy}","received_events_url":"https://api.github.com/users/wezell/received_events","type":"User","site_admin":false},"body":"This should not be in the upcoming 4..  This is more like 4.3 work.\r\n\r\n","created_at":"2017-08-17T22:56:08Z","updated_at":"2017-08-17T23:07:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c32620caaf83b895a8d4366e98077cd2ad3fb31","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/dotCMS/core/pulls/12363/commits","review_comments_url":"https://api.github.com/repos/dotCMS/core/pulls/12363/comments","review_comment_url":"https://api.github.com/repos/dotCMS/core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotCMS/core/issues/12363/comments","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/a1c89607c2bbd010917adf9eb98701e80419f535","head":{"label":"dotCMS:issue-2252-consolidate-legacy-loginfactory","ref":"issue-2252-consolidate-legacy-loginfactory","sha":"a1c89607c2bbd010917adf9eb98701e80419f535","user":{"login":"dotCMS","id":1005263,"avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"repo":{"id":3729629,"name":"core","full_name":"dotCMS/core","owner":{"login":"dotCMS","id":1005263,"avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotCMS/core","description":"Source Code for dotCMS Java Enterprise Content Management System","fork":false,"url":"https://api.github.com/repos/dotCMS/core","forks_url":"https://api.github.com/repos/dotCMS/core/forks","keys_url":"https://api.github.com/repos/dotCMS/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotCMS/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotCMS/core/teams","hooks_url":"https://api.github.com/repos/dotCMS/core/hooks","issue_events_url":"https://api.github.com/repos/dotCMS/core/issues/events{/number}","events_url":"https://api.github.com/repos/dotCMS/core/events","assignees_url":"https://api.github.com/repos/dotCMS/core/assignees{/user}","branches_url":"https://api.github.com/repos/dotCMS/core/branches{/branch}","tags_url":"https://api.github.com/repos/dotCMS/core/tags","blobs_url":"https://api.github.com/repos/dotCMS/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotCMS/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotCMS/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotCMS/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/{sha}","languages_url":"https://api.github.com/repos/dotCMS/core/languages","stargazers_url":"https://api.github.com/repos/dotCMS/core/stargazers","contributors_url":"https://api.github.com/repos/dotCMS/core/contributors","subscribers_url":"https://api.github.com/repos/dotCMS/core/subscribers","subscription_url":"https://api.github.com/repos/dotCMS/core/subscription","commits_url":"https://api.github.com/repos/dotCMS/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotCMS/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotCMS/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotCMS/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotCMS/core/contents/{+path}","compare_url":"https://api.github.com/repos/dotCMS/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotCMS/core/merges","archive_url":"https://api.github.com/repos/dotCMS/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotCMS/core/downloads","issues_url":"https://api.github.com/repos/dotCMS/core/issues{/number}","pulls_url":"https://api.github.com/repos/dotCMS/core/pulls{/number}","milestones_url":"https://api.github.com/repos/dotCMS/core/milestones{/number}","notifications_url":"https://api.github.com/repos/dotCMS/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotCMS/core/labels{/name}","releases_url":"https://api.github.com/repos/dotCMS/core/releases{/id}","deployments_url":"https://api.github.com/repos/dotCMS/core/deployments","created_at":"2012-03-15T15:24:14Z","updated_at":"2017-08-11T23:39:10Z","pushed_at":"2017-08-17T23:02:50Z","git_url":"git://github.com/dotCMS/core.git","ssh_url":"git@github.com:dotCMS/core.git","clone_url":"https://github.com/dotCMS/core.git","svn_url":"https://github.com/dotCMS/core","homepage":"http://dotcms.com","size":284433,"stargazers_count":317,"watchers_count":317,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":288,"mirror_url":null,"open_issues_count":1664,"forks":288,"open_issues":1664,"watchers":317,"default_branch":"master"}},"base":{"label":"dotCMS:master","ref":"master","sha":"3ece8861ab952f4be064d76d651b220330f8db53","user":{"login":"dotCMS","id":1005263,"avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"repo":{"id":3729629,"name":"core","full_name":"dotCMS/core","owner":{"login":"dotCMS","id":1005263,"avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotCMS/core","description":"Source Code for dotCMS Java Enterprise Content Management System","fork":false,"url":"https://api.github.com/repos/dotCMS/core","forks_url":"https://api.github.com/repos/dotCMS/core/forks","keys_url":"https://api.github.com/repos/dotCMS/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotCMS/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotCMS/core/teams","hooks_url":"https://api.github.com/repos/dotCMS/core/hooks","issue_events_url":"https://api.github.com/repos/dotCMS/core/issues/events{/number}","events_url":"https://api.github.com/repos/dotCMS/core/events","assignees_url":"https://api.github.com/repos/dotCMS/core/assignees{/user}","branches_url":"https://api.github.com/repos/dotCMS/core/branches{/branch}","tags_url":"https://api.github.com/repos/dotCMS/core/tags","blobs_url":"https://api.github.com/repos/dotCMS/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotCMS/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotCMS/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotCMS/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/{sha}","languages_url":"https://api.github.com/repos/dotCMS/core/languages","stargazers_url":"https://api.github.com/repos/dotCMS/core/stargazers","contributors_url":"https://api.github.com/repos/dotCMS/core/contributors","subscribers_url":"https://api.github.com/repos/dotCMS/core/subscribers","subscription_url":"https://api.github.com/repos/dotCMS/core/subscription","commits_url":"https://api.github.com/repos/dotCMS/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotCMS/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotCMS/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotCMS/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotCMS/core/contents/{+path}","compare_url":"https://api.github.com/repos/dotCMS/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotCMS/core/merges","archive_url":"https://api.github.com/repos/dotCMS/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotCMS/core/downloads","issues_url":"https://api.github.com/repos/dotCMS/core/issues{/number}","pulls_url":"https://api.github.com/repos/dotCMS/core/pulls{/number}","milestones_url":"https://api.github.com/repos/dotCMS/core/milestones{/number}","notifications_url":"https://api.github.com/repos/dotCMS/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotCMS/core/labels{/name}","releases_url":"https://api.github.com/repos/dotCMS/core/releases{/id}","deployments_url":"https://api.github.com/repos/dotCMS/core/deployments","created_at":"2012-03-15T15:24:14Z","updated_at":"2017-08-11T23:39:10Z","pushed_at":"2017-08-17T23:02:50Z","git_url":"git://github.com/dotCMS/core.git","ssh_url":"git@github.com:dotCMS/core.git","clone_url":"https://github.com/dotCMS/core.git","svn_url":"https://github.com/dotCMS/core","homepage":"http://dotcms.com","size":284433,"stargazers_count":317,"watchers_count":317,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":288,"mirror_url":null,"open_issues_count":1664,"forks":288,"open_issues":1664,"watchers":317,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotCMS/core/pulls/12363"},"html":{"href":"https://github.com/dotCMS/core/pull/12363"},"issue":{"href":"https://api.github.com/repos/dotCMS/core/issues/12363"},"comments":{"href":"https://api.github.com/repos/dotCMS/core/issues/12363/comments"},"review_comments":{"href":"https://api.github.com/repos/dotCMS/core/pulls/12363/comments"},"review_comment":{"href":"https://api.github.com/repos/dotCMS/core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotCMS/core/pulls/12363/commits"},"statuses":{"href":"https://api.github.com/repos/dotCMS/core/statuses/a1c89607c2bbd010917adf9eb98701e80419f535"}}}}
{"actor":{"display_login":"jenkins-dotcms"}}