{"action":"created","comment":{"url":"https://api.github.com/repos/wso2/carbon-identity/pulls/comments/46269575","id":46269575,"diff_hunk":"@@ -0,0 +1,272 @@\n+/*\n+ * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.\n+ *\n+ * WSO2 Inc. licenses this file to you under the Apache License,\n+ * Version 2.0 (the \"License\"); you may not use this file except\n+ * in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied. See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+\n+package org.wso2.carbon.identity.application.common.processors;\n+\n+import org.apache.commons.lang.ArrayUtils;\n+import org.apache.commons.lang.StringUtils;\n+import org.apache.commons.logging.Log;\n+import org.apache.commons.logging.LogFactory;\n+import org.wso2.carbon.identity.application.common.model.RandomPassword;\n+import org.wso2.carbon.identity.application.common.model.RandomPasswordContainer;\n+import org.wso2.carbon.identity.application.common.cache.RandomPasswordContainerCache;\n+import org.wso2.carbon.identity.application.common.cache.RandomPasswordContainerCacheEntry;\n+import org.wso2.carbon.identity.application.common.cache.RandomPasswordContainerCacheKey;\n+import org.wso2.carbon.identity.application.common.model.Property;\n+import org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants;\n+import org.wso2.carbon.identity.application.common.util.IdentityApplicationManagementUtil;\n+\n+import java.util.ArrayList;\n+import java.util.UUID;\n+\n+/**\n+ * Use this class to secure sensitive properties display on html front-end\n+ */\n+public class RandomPasswordProcessor {\n+\n+    private static final Log log = LogFactory.getLog(RandomPasswordProcessor.class);\n+\n+    private static volatile RandomPasswordProcessor randomPasswordProcessor = null;\n+\n+    private RandomPasswordProcessor (){\n+\n+    }\n+\n+    public static RandomPasswordProcessor getInstance(){\n+\n+        if(randomPasswordProcessor == null){\n+            synchronized (RandomPassword.class){\n+                if(randomPasswordProcessor == null){\n+                    randomPasswordProcessor = new RandomPasswordProcessor();\n+                }\n+            }\n+        }\n+\n+        return randomPasswordProcessor;\n+    }\n+\n+    /**\n+     * Remove original passwords with random passwords when sending password properties to UI front-end\n+     * @param properties\n+     */\n+    public Property[] removeOriginalPasswords(Property[] properties){\n+\n+        if (ArrayUtils.isEmpty(properties)){\n+            return new Property[0];\n+        }\n+\n+        properties = addUniqueIdProperty(properties);\n+        String uuid = IdentityApplicationManagementUtil\n+                .getPropertyValue(properties, IdentityApplicationConstants.UNIQUE_ID_CONSTANT);\n+        String randomPhrase = IdentityApplicationConstants.RANDOM_PHRASE_PREFIX + uuid;\n+        RandomPassword[] randomPasswords = replaceOriginalPasswordsWithRandomPasswords(\n+                randomPhrase, properties);\n+        if (!ArrayUtils.isEmpty(randomPasswords)) {\n+            addPasswordContainerToCache(randomPasswords, uuid);\n+        }\n+\n+        return properties;\n+    }\n+\n+    /**\n+     * Remove random passwords with original passwords when sending password properties to Service Back-end\n+     * @param properties\n+     */\n+    public Property[] removeRandomPasswords(Property[] properties) {\n+\n+        if (ArrayUtils.isEmpty(properties)) {\n+            return new Property[0];\n+        }\n+\n+        String uuid = IdentityApplicationManagementUtil.getPropertyValue(properties,\n+                                                                         IdentityApplicationConstants.UNIQUE_ID_CONSTANT);\n+        properties = (Property[]) removeUniqueIdProperty(properties);\n+        if (StringUtils.isBlank(uuid)) {\n+            if (log.isDebugEnabled()) {\n+                log.debug(\"Cache Key not found for Random Password Container\");\n+            }\n+        } else {\n+            RandomPassword[] randomPasswords = getAndRemoveRandomPasswordContainerFromCache(uuid);\n+            if (!ArrayUtils.isEmpty(randomPasswords)) {\n+                replaceRandomPasswordsWithOriginalPasswords(properties,\n+                                                            randomPasswords);\n+            }\n+        }\n+        return properties;\n+    }\n+\n+    private void addPasswordContainerToCache(RandomPassword[] randomPasswords, String uuid) {\n+\n+        if(randomPasswords == null){\n+            if (log.isDebugEnabled()) {\n+                log.debug(\"Random passwords not available for Password Container\");\n+            }\n+        }\n+        RandomPasswordContainer randomPasswordContainer = new RandomPasswordContainer();\n+        randomPasswordContainer.setRandomPasswords(randomPasswords);\n+        randomPasswordContainer.setUniqueID(uuid);\n+\n+        RandomPasswordContainerCacheKey cacheKey = new RandomPasswordContainerCacheKey(uuid);\n+\n+        RandomPasswordContainerCacheEntry cacheEntry = new RandomPasswordContainerCacheEntry(randomPasswordContainer);\n+\n+        if (log.isDebugEnabled()){\n+            log.debug(\"Adding Random passwords to Cache with Key: \" + uuid);\n+        }\n+\n+        RandomPasswordContainerCache.getInstance().addToCache(cacheKey, cacheEntry);\n+    }\n+\n+    private RandomPassword[] getAndRemoveRandomPasswordContainerFromCache(String uuid) {\n+\n+        RandomPasswordContainerCacheKey cacheKey = new RandomPasswordContainerCacheKey(uuid);\n+        RandomPasswordContainerCache cache = RandomPasswordContainerCache.getInstance();\n+        RandomPasswordContainerCacheEntry cacheEntry = cache.getValueFromCache(cacheKey);\n+        if (cacheEntry == null) {\n+            if (log.isDebugEnabled()) {\n+                log.debug(\"Cache entry not found for cache key :\" + uuid);\n+            }\n+            return new RandomPassword[0];\n+        }\n+\n+        RandomPasswordContainer randomPasswordContainer = cacheEntry.getRandomPasswordContainer();\n+\n+        if (randomPasswordContainer == null || randomPasswordContainer.getRandomPasswords() == null) {\n+            if (log.isDebugEnabled()) {\n+                log.debug(\"Could not find Random Passwords from Random Password Container\");\n+            }\n+            return new RandomPassword[0];\n+        }\n+\n+        if (log.isDebugEnabled()){\n+            log.debug(\"Removing Cache Entry with Key: \" + uuid);\n+        }\n+\n+        cache.clearCacheEntry(cacheKey);\n+        return randomPasswordContainer.getRandomPasswords();\n+    }\n+\n+    /**\n+     * Replace original passwords with provided random phrase\n+     * @param randomPhrase\n+     * @param properties\n+     * @return\n+     */\n+    private RandomPassword[] replaceOriginalPasswordsWithRandomPasswords(String randomPhrase, Property[] properties) {\n+\n+        ArrayList<RandomPassword> randomPasswordArrayList = new ArrayList<RandomPassword>();\n+        if (properties != null) {\n+            for (Property property : properties) {\n+\n+                if (property == null || property.getName() == null || property.getValue() == null) {\n+                    continue;\n+                }\n+                if (property.getName().contains(IdentityApplicationConstants.PASSWORD)) {\n+\n+                    if (log.isDebugEnabled()){\n+                        log.debug(\"Found Password Property :\" + property.getValue());\n+                    }\n+                    RandomPassword randomPassword = new RandomPassword();\n+                    randomPassword.setPropertyName(property.getName());\n+                    randomPassword.setPassword(property.getValue());\n+                    randomPassword.setRandomPhrase(randomPhrase);\n+                    randomPasswordArrayList.add(randomPassword);\n+\n+                    property.setValue(randomPhrase);\n+                }\n+            }\n+        }\n+        return randomPasswordArrayList.toArray(new RandomPassword[randomPasswordArrayList.size()]);\n+    }\n+\n+    /**\n+     * Remove random password list with corresponding old original password if value has not been changed\n+     * @param properties\n+     * @param randomPasswords\n+     */\n+    private void replaceRandomPasswordsWithOriginalPasswords(Property[] properties, RandomPassword randomPasswords[]) {\n+\n+        if (ArrayUtils.isEmpty(properties) || ArrayUtils.isEmpty(randomPasswords)) {\n+            return;\n+        }\n+\n+        for (Property property : properties) {\n+            if (property == null || StringUtils.isBlank(property.getName()) ||\n+                StringUtils.isBlank(property.getValue())) {\n+                continue;\n+            }\n+            if (property.getName().contains(IdentityApplicationConstants.PASSWORD)) {\n+                for (RandomPassword randomPassword : randomPasswords) {\n+                    if (property.getName().equals(randomPassword.getPropertyName())) {\n+                        //if password property value equal to random phrase, user didn't change the password hence set\n+                        // old password\n+                        if (property.getValue().equals(randomPassword.getRandomPhrase())) {\n+                            if (log.isDebugEnabled()){\n+                                log.debug(\"User didn't changed password property: \" + property.getName() +\n+                                          \" hence replace Random Password with Original Password\");\n+                            }\n+                            property.setValue(randomPassword.getPassword());\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    private Property[] addUniqueIdProperty(Property [] properties) {\n+\n+        if (ArrayUtils.isEmpty(properties)){\n+            return new Property[0];\n+        }\n+\n+        String uuid = UUID.randomUUID().toString();\n+        Property uniqueIdProperty = new Property();\n+        uniqueIdProperty.setName(IdentityApplicationConstants.UNIQUE_ID_CONSTANT);\n+        uniqueIdProperty.setValue(uuid);\n+        if (log.isDebugEnabled()){\n+            log.debug(\"Adding uniqueId property: \" + uuid);\n+        }\n+        properties = (Property[]) ArrayUtils.add(properties, uniqueIdProperty);\n+\n+        return properties;\n+    }\n+\n+    private Property[] removeUniqueIdProperty(Property [] properties) {\n+\n+        if (ArrayUtils.isEmpty(properties)){\n+            return new Property[0];\n+        }\n+\n+        for (int i=0 ; i < properties.length; i++) {\n+            if (properties[i] == null){\n+                continue;\n+            }\n+            if (IdentityApplicationConstants.UNIQUE_ID_CONSTANT.equals(properties[i].getName())) {\n+                Property[] propertiesTemp = properties;\n+\n+                if (log.isDebugEnabled()){\n+                    log.debug(\"Removing uniqueId property: \" + properties[i].getName());","path":"components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/processors/RandomPasswordProcessor.java","position":263,"original_position":263,"commit_id":"a0056c81fffc375604346a405c39a5e6b64ba2da","original_commit_id":"a0056c81fffc375604346a405c39a5e6b64ba2da","user":{"login":"godwinamila","id":8766778,"avatar_url":"https://avatars.githubusercontent.com/u/8766778?v=3","gravatar_id":"","url":"https://api.github.com/users/godwinamila","html_url":"https://github.com/godwinamila","followers_url":"https://api.github.com/users/godwinamila/followers","following_url":"https://api.github.com/users/godwinamila/following{/other_user}","gists_url":"https://api.github.com/users/godwinamila/gists{/gist_id}","starred_url":"https://api.github.com/users/godwinamila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/godwinamila/subscriptions","organizations_url":"https://api.github.com/users/godwinamila/orgs","repos_url":"https://api.github.com/users/godwinamila/repos","events_url":"https://api.github.com/users/godwinamila/events{/privacy}","received_events_url":"https://api.github.com/users/godwinamila/received_events","type":"User","site_admin":false},"body":"Use StringBuilder and build the entire string and print, otherwise getting mess when printing in multiple threads","created_at":"2015-12-01T11:59:55Z","updated_at":"2015-12-01T11:59:55Z","html_url":"https://github.com/wso2/carbon-identity/pull/1502#discussion_r46269575","pull_request_url":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502","_links":{"self":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/comments/46269575"},"html":{"href":"https://github.com/wso2/carbon-identity/pull/1502#discussion_r46269575"},"pull_request":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502"}}},"pull_request":{"url":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502","id":52091517,"html_url":"https://github.com/wso2/carbon-identity/pull/1502","diff_url":"https://github.com/wso2/carbon-identity/pull/1502.diff","patch_url":"https://github.com/wso2/carbon-identity/pull/1502.patch","issue_url":"https://api.github.com/repos/wso2/carbon-identity/issues/1502","number":1502,"state":"open","locked":false,"title":"fixing IDENTITY-4105","user":{"login":"GayanM","id":3436694,"avatar_url":"https://avatars.githubusercontent.com/u/3436694?v=3","gravatar_id":"","url":"https://api.github.com/users/GayanM","html_url":"https://github.com/GayanM","followers_url":"https://api.github.com/users/GayanM/followers","following_url":"https://api.github.com/users/GayanM/following{/other_user}","gists_url":"https://api.github.com/users/GayanM/gists{/gist_id}","starred_url":"https://api.github.com/users/GayanM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GayanM/subscriptions","organizations_url":"https://api.github.com/users/GayanM/orgs","repos_url":"https://api.github.com/users/GayanM/repos","events_url":"https://api.github.com/users/GayanM/events{/privacy}","received_events_url":"https://api.github.com/users/GayanM/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-11-30T07:11:24Z","updated_at":"2015-12-01T11:59:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ac44b78f87799db985321f52080b5ffddf2aa9dc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502/commits","review_comments_url":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502/comments","review_comment_url":"https://api.github.com/repos/wso2/carbon-identity/pulls/comments{/number}","comments_url":"https://api.github.com/repos/wso2/carbon-identity/issues/1502/comments","statuses_url":"https://api.github.com/repos/wso2/carbon-identity/statuses/a0056c81fffc375604346a405c39a5e6b64ba2da","head":{"label":"GayanM:IDENTITY-4105","ref":"IDENTITY-4105","sha":"a0056c81fffc375604346a405c39a5e6b64ba2da","user":{"login":"GayanM","id":3436694,"avatar_url":"https://avatars.githubusercontent.com/u/3436694?v=3","gravatar_id":"","url":"https://api.github.com/users/GayanM","html_url":"https://github.com/GayanM","followers_url":"https://api.github.com/users/GayanM/followers","following_url":"https://api.github.com/users/GayanM/following{/other_user}","gists_url":"https://api.github.com/users/GayanM/gists{/gist_id}","starred_url":"https://api.github.com/users/GayanM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GayanM/subscriptions","organizations_url":"https://api.github.com/users/GayanM/orgs","repos_url":"https://api.github.com/users/GayanM/repos","events_url":"https://api.github.com/users/GayanM/events{/privacy}","received_events_url":"https://api.github.com/users/GayanM/received_events","type":"User","site_admin":false},"repo":{"id":38152023,"name":"carbon-identity","full_name":"GayanM/carbon-identity","owner":{"login":"GayanM","id":3436694,"avatar_url":"https://avatars.githubusercontent.com/u/3436694?v=3","gravatar_id":"","url":"https://api.github.com/users/GayanM","html_url":"https://github.com/GayanM","followers_url":"https://api.github.com/users/GayanM/followers","following_url":"https://api.github.com/users/GayanM/following{/other_user}","gists_url":"https://api.github.com/users/GayanM/gists{/gist_id}","starred_url":"https://api.github.com/users/GayanM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GayanM/subscriptions","organizations_url":"https://api.github.com/users/GayanM/orgs","repos_url":"https://api.github.com/users/GayanM/repos","events_url":"https://api.github.com/users/GayanM/events{/privacy}","received_events_url":"https://api.github.com/users/GayanM/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/GayanM/carbon-identity","description":"","fork":true,"url":"https://api.github.com/repos/GayanM/carbon-identity","forks_url":"https://api.github.com/repos/GayanM/carbon-identity/forks","keys_url":"https://api.github.com/repos/GayanM/carbon-identity/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GayanM/carbon-identity/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GayanM/carbon-identity/teams","hooks_url":"https://api.github.com/repos/GayanM/carbon-identity/hooks","issue_events_url":"https://api.github.com/repos/GayanM/carbon-identity/issues/events{/number}","events_url":"https://api.github.com/repos/GayanM/carbon-identity/events","assignees_url":"https://api.github.com/repos/GayanM/carbon-identity/assignees{/user}","branches_url":"https://api.github.com/repos/GayanM/carbon-identity/branches{/branch}","tags_url":"https://api.github.com/repos/GayanM/carbon-identity/tags","blobs_url":"https://api.github.com/repos/GayanM/carbon-identity/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GayanM/carbon-identity/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GayanM/carbon-identity/git/refs{/sha}","trees_url":"https://api.github.com/repos/GayanM/carbon-identity/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GayanM/carbon-identity/statuses/{sha}","languages_url":"https://api.github.com/repos/GayanM/carbon-identity/languages","stargazers_url":"https://api.github.com/repos/GayanM/carbon-identity/stargazers","contributors_url":"https://api.github.com/repos/GayanM/carbon-identity/contributors","subscribers_url":"https://api.github.com/repos/GayanM/carbon-identity/subscribers","subscription_url":"https://api.github.com/repos/GayanM/carbon-identity/subscription","commits_url":"https://api.github.com/repos/GayanM/carbon-identity/commits{/sha}","git_commits_url":"https://api.github.com/repos/GayanM/carbon-identity/git/commits{/sha}","comments_url":"https://api.github.com/repos/GayanM/carbon-identity/comments{/number}","issue_comment_url":"https://api.github.com/repos/GayanM/carbon-identity/issues/comments{/number}","contents_url":"https://api.github.com/repos/GayanM/carbon-identity/contents/{+path}","compare_url":"https://api.github.com/repos/GayanM/carbon-identity/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GayanM/carbon-identity/merges","archive_url":"https://api.github.com/repos/GayanM/carbon-identity/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GayanM/carbon-identity/downloads","issues_url":"https://api.github.com/repos/GayanM/carbon-identity/issues{/number}","pulls_url":"https://api.github.com/repos/GayanM/carbon-identity/pulls{/number}","milestones_url":"https://api.github.com/repos/GayanM/carbon-identity/milestones{/number}","notifications_url":"https://api.github.com/repos/GayanM/carbon-identity/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GayanM/carbon-identity/labels{/name}","releases_url":"https://api.github.com/repos/GayanM/carbon-identity/releases{/id}","created_at":"2015-06-27T07:51:05Z","updated_at":"2015-06-27T07:51:16Z","pushed_at":"2015-12-01T07:26:06Z","git_url":"git://github.com/GayanM/carbon-identity.git","ssh_url":"git@github.com:GayanM/carbon-identity.git","clone_url":"https://github.com/GayanM/carbon-identity.git","svn_url":"https://github.com/GayanM/carbon-identity","homepage":null,"size":52572,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"wso2:master","ref":"master","sha":"275d96d5b2f9d1b74a7b1bed66839b52dca53634","user":{"login":"wso2","id":533043,"avatar_url":"https://avatars.githubusercontent.com/u/533043?v=3","gravatar_id":"","url":"https://api.github.com/users/wso2","html_url":"https://github.com/wso2","followers_url":"https://api.github.com/users/wso2/followers","following_url":"https://api.github.com/users/wso2/following{/other_user}","gists_url":"https://api.github.com/users/wso2/gists{/gist_id}","starred_url":"https://api.github.com/users/wso2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wso2/subscriptions","organizations_url":"https://api.github.com/users/wso2/orgs","repos_url":"https://api.github.com/users/wso2/repos","events_url":"https://api.github.com/users/wso2/events{/privacy}","received_events_url":"https://api.github.com/users/wso2/received_events","type":"Organization","site_admin":false},"repo":{"id":16588204,"name":"carbon-identity","full_name":"wso2/carbon-identity","owner":{"login":"wso2","id":533043,"avatar_url":"https://avatars.githubusercontent.com/u/533043?v=3","gravatar_id":"","url":"https://api.github.com/users/wso2","html_url":"https://github.com/wso2","followers_url":"https://api.github.com/users/wso2/followers","following_url":"https://api.github.com/users/wso2/following{/other_user}","gists_url":"https://api.github.com/users/wso2/gists{/gist_id}","starred_url":"https://api.github.com/users/wso2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wso2/subscriptions","organizations_url":"https://api.github.com/users/wso2/orgs","repos_url":"https://api.github.com/users/wso2/repos","events_url":"https://api.github.com/users/wso2/events{/privacy}","received_events_url":"https://api.github.com/users/wso2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wso2/carbon-identity","description":"","fork":false,"url":"https://api.github.com/repos/wso2/carbon-identity","forks_url":"https://api.github.com/repos/wso2/carbon-identity/forks","keys_url":"https://api.github.com/repos/wso2/carbon-identity/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wso2/carbon-identity/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wso2/carbon-identity/teams","hooks_url":"https://api.github.com/repos/wso2/carbon-identity/hooks","issue_events_url":"https://api.github.com/repos/wso2/carbon-identity/issues/events{/number}","events_url":"https://api.github.com/repos/wso2/carbon-identity/events","assignees_url":"https://api.github.com/repos/wso2/carbon-identity/assignees{/user}","branches_url":"https://api.github.com/repos/wso2/carbon-identity/branches{/branch}","tags_url":"https://api.github.com/repos/wso2/carbon-identity/tags","blobs_url":"https://api.github.com/repos/wso2/carbon-identity/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wso2/carbon-identity/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wso2/carbon-identity/git/refs{/sha}","trees_url":"https://api.github.com/repos/wso2/carbon-identity/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wso2/carbon-identity/statuses/{sha}","languages_url":"https://api.github.com/repos/wso2/carbon-identity/languages","stargazers_url":"https://api.github.com/repos/wso2/carbon-identity/stargazers","contributors_url":"https://api.github.com/repos/wso2/carbon-identity/contributors","subscribers_url":"https://api.github.com/repos/wso2/carbon-identity/subscribers","subscription_url":"https://api.github.com/repos/wso2/carbon-identity/subscription","commits_url":"https://api.github.com/repos/wso2/carbon-identity/commits{/sha}","git_commits_url":"https://api.github.com/repos/wso2/carbon-identity/git/commits{/sha}","comments_url":"https://api.github.com/repos/wso2/carbon-identity/comments{/number}","issue_comment_url":"https://api.github.com/repos/wso2/carbon-identity/issues/comments{/number}","contents_url":"https://api.github.com/repos/wso2/carbon-identity/contents/{+path}","compare_url":"https://api.github.com/repos/wso2/carbon-identity/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wso2/carbon-identity/merges","archive_url":"https://api.github.com/repos/wso2/carbon-identity/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wso2/carbon-identity/downloads","issues_url":"https://api.github.com/repos/wso2/carbon-identity/issues{/number}","pulls_url":"https://api.github.com/repos/wso2/carbon-identity/pulls{/number}","milestones_url":"https://api.github.com/repos/wso2/carbon-identity/milestones{/number}","notifications_url":"https://api.github.com/repos/wso2/carbon-identity/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wso2/carbon-identity/labels{/name}","releases_url":"https://api.github.com/repos/wso2/carbon-identity/releases{/id}","created_at":"2014-02-06T17:58:23Z","updated_at":"2015-11-04T13:30:12Z","pushed_at":"2015-12-01T11:56:55Z","git_url":"git://github.com/wso2/carbon-identity.git","ssh_url":"git@github.com:wso2/carbon-identity.git","clone_url":"https://github.com/wso2/carbon-identity.git","svn_url":"https://github.com/wso2/carbon-identity","homepage":null,"size":75542,"stargazers_count":12,"watchers_count":12,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":153,"mirror_url":null,"open_issues_count":55,"forks":153,"open_issues":55,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502"},"html":{"href":"https://github.com/wso2/carbon-identity/pull/1502"},"issue":{"href":"https://api.github.com/repos/wso2/carbon-identity/issues/1502"},"comments":{"href":"https://api.github.com/repos/wso2/carbon-identity/issues/1502/comments"},"review_comments":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502/comments"},"review_comment":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/wso2/carbon-identity/pulls/1502/commits"},"statuses":{"href":"https://api.github.com/repos/wso2/carbon-identity/statuses/a0056c81fffc375604346a405c39a5e6b64ba2da"}}}}