{"action":"created","comment":{"url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/comments/52200826","id":52200826,"diff_hunk":"@@ -245,30 +259,138 @@ - (ADTokenCacheItem*)itemFromKeyhainAttributes:(NSDictionary*)attrs\n \n \n /*!\n-    @param  item    The item to remove from the cache\n+    @param  item    The item to be removed. Item with refresh token will be set as a tombstone, those without will be deleted.\n     @param  error   (Optional) In the case of an error this will be filled with the\n                     error details.\n  \n-    @return YES if the item was successfully removed, or was not in the cache. If NO\n-            look\n+    @return YES if the item was successfully tombstoned/deleted or not in the cache.\n  */\n - (BOOL)removeItem:(nonnull ADTokenCacheItem *)item\n              error:(ADAuthenticationError * __nullable __autoreleasing * __nullable)error\n {\n     RETURN_NO_ON_NIL_ARGUMENT(item);\n+\n+    OSStatus deleteStatus = [self deleteItem:item error:error];\n+    \n+    //if item does not exist in cache or does not contain a refresh token, deletion is enough and should return.\n+    if (deleteStatus != errSecSuccess || [NSString adIsStringNilOrBlank:item.refreshToken])\n+    {\n+        [self logItem:item message:@\"Item being removed\"];\n+        return [ADKeychainTokenCache checkStatus:deleteStatus details:@\"Failed to remove item from keychain\" error:error];\n+    }\n+    \n+    //Item should be set as tombstone\n+    [self logItem:item message:@\"Item being tombstoned\"];\n+    \n+    ADTokenCacheItem* tombstoneItem = [item copy];\n+    SAFE_ARC_AUTORELEASE(tombstoneItem);\n+    [self setCacheItemAsTombstone:tombstoneItem];\n     \n+    //update tombstone in cache\n+    BOOL updateStatus = [self addOrUpdateItem:tombstoneItem error:error];\n+    \n+    return updateStatus;\n+    \n+}\n+\n+//Interal function: delete an item from keychain;\n+- (OSStatus)deleteItem:(nonnull ADTokenCacheItem *)item\n+             error:(ADAuthenticationError * __nullable __autoreleasing * __nullable)error\n+{\n+    RETURN_NO_ON_NIL_ARGUMENT(item);\n     ADTokenCacheKey* key = [item extractKey:error];\n     if (!key)\n     {\n         return NO;\n     }\n-    \n-    \n     NSMutableDictionary* query = [self queryDictionaryForKey:key\n                                                       userId:item.userInformation.userId\n                                                   additional:nil];\n-    OSStatus status = SecItemDelete((CFDictionaryRef)query);\n-    return [ADKeychainTokenCache checkStatus:status details:@\"Failed to remove item from keychain\" error:error];\n+    return SecItemDelete((CFDictionaryRef)query);\n+}\n+\n+-(void)setCacheItemAsTombstone:(ADTokenCacheItem*)item\n+{\n+    if (item)\n+    {\n+        //avoid bundleId being nil, as it will be stored in a NSMutableDictionary\n+        NSString* bundleId = [[NSBundle mainBundle] bundleIdentifier] ? [[NSBundle mainBundle] bundleIdentifier] : @\"\";\n+        \n+        if (item.tombstone)\n+        {\n+            [item.tombstone addEntriesFromDictionary:@{@\"bundleId\" : bundleId}];\n+        }\n+        else\n+        {\n+            [item setTombstone:[NSMutableDictionary dictionaryWithDictionary:@{@\"bundleId\" : bundleId}]];\n+        }\n+        \n+        //wipe out the refresh token\n+        [item setRefreshToken:@\"<tombstone>\"];\n+    }\n+}\n+\n+-(NSMutableArray*)filterOutTombstones:(NSArray*) items\n+{\n+    if (!items)\n+    {\n+        return nil;\n+    }\n+    \n+    NSMutableArray* itemsKept = [NSMutableArray new];\n+    for (ADTokenCacheItem* item in items)\n+    {\n+        if (![item tombstone])\n+        {\n+            [itemsKept addObject:item];\n+        }\n+    }\n+    SAFE_ARC_AUTORELEASE(itemsKept);\n+    return itemsKept;\n+}\n+\n+- (BOOL)removeAllForClientId:(NSString * __nonnull)clientId\n+                       error:(ADAuthenticationError * __nullable __autoreleasing * __nullable)error\n+{\n+    AD_LOG_VERBOSE_F(@\"Keychain token cache store\", nil, @\"Removing items for client <%@>\", clientId);\n+    \n+    BOOL deleteSuccessful = YES;\n+    NSArray* items = [self allItems:nil];\n+    for (ADTokenCacheItem * item in items)\n+    {\n+        if ([clientId isEqualToString:[item clientId] ])\n+        {\n+            [self removeItem:item error:error];\n+            if (*error)\n+            {\n+                deleteSuccessful = NO;\n+            }\n+        }\n+    }\n+    return deleteSuccessful;\n+}\n+\n+- (BOOL)removeAllForIdentifier:(NSString * __nonnull)userId","path":"ADAL/src/cache/ios/ADKeychainTokenCache.m","position":177,"original_position":177,"commit_id":"97bd4f3e51ab4f1d008540e97ec857cf6ed9522e","original_commit_id":"97bd4f3e51ab4f1d008540e97ec857cf6ed9522e","user":{"login":"RPangrle","id":7004783,"avatar_url":"https://avatars.githubusercontent.com/u/7004783?v=3","gravatar_id":"","url":"https://api.github.com/users/RPangrle","html_url":"https://github.com/RPangrle","followers_url":"https://api.github.com/users/RPangrle/followers","following_url":"https://api.github.com/users/RPangrle/following{/other_user}","gists_url":"https://api.github.com/users/RPangrle/gists{/gist_id}","starred_url":"https://api.github.com/users/RPangrle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RPangrle/subscriptions","organizations_url":"https://api.github.com/users/RPangrle/orgs","repos_url":"https://api.github.com/users/RPangrle/repos","events_url":"https://api.github.com/users/RPangrle/events{/privacy}","received_events_url":"https://api.github.com/users/RPangrle/received_events","type":"User","site_admin":false},"body":"Change this to \"ForUserId:\" we use \"Identifier\" when we take in a ADUserIdentifier.","created_at":"2016-02-08T17:47:54Z","updated_at":"2016-02-08T17:47:54Z","html_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478#discussion_r52200826","pull_request_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478","_links":{"self":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/comments/52200826"},"html":{"href":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478#discussion_r52200826"},"pull_request":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478"}}},"pull_request":{"url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478","id":57593682,"html_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478","diff_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478.diff","patch_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478.patch","issue_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/478","number":478,"state":"open","locked":false,"title":"Issues/broker dev/tombstone wrapper","user":{"login":"jasoncoolmax","id":8347347,"avatar_url":"https://avatars.githubusercontent.com/u/8347347?v=3","gravatar_id":"","url":"https://api.github.com/users/jasoncoolmax","html_url":"https://github.com/jasoncoolmax","followers_url":"https://api.github.com/users/jasoncoolmax/followers","following_url":"https://api.github.com/users/jasoncoolmax/following{/other_user}","gists_url":"https://api.github.com/users/jasoncoolmax/gists{/gist_id}","starred_url":"https://api.github.com/users/jasoncoolmax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasoncoolmax/subscriptions","organizations_url":"https://api.github.com/users/jasoncoolmax/orgs","repos_url":"https://api.github.com/users/jasoncoolmax/repos","events_url":"https://api.github.com/users/jasoncoolmax/events{/privacy}","received_events_url":"https://api.github.com/users/jasoncoolmax/received_events","type":"User","site_admin":false},"body":"Referring #445 and #451 \r\n- Tombstone feature added; \r\n- [ADKeychainTokenCache removeAllForIdentifier:] and [ADKeychainTokenCache removeAllForClientId:] added.\r\n\r\nDetails:\r\n1) Property *tombstone*, which is a NSMutableDictionary, is added to ADTokenCacheItem. Such a property is nil for normal cache item, but not nil for a tombstone.\r\nProperty *tombstone* is supposed to record the following information if item is set as tombstone:\r\n @\"bundleId\":Bundle ID of the app which tombstones the token.\r\n @\"correlationId\":correlation ID of the request that we got the error from.\r\n @\"protocolCode\":error code returned by the server for the rejected RT\r\n @\"errorDetails\":error details of the rejected RT\r\n\r\n2) Changes have been made for [ADKeychainTokenCache removeItem:]: if an item contains a refresh token, it will be set as a tombstone and updated in cache; if it does not, it will be directly deleted.\r\n\r\n3)- [ADKeychainTokenCache allItems:] and - [ADKeychainTokenCache getItemWithKey:] have been updated to filter out tombstone items before return;\r\n\r\n4) logging has been improved to make good use of tombstones in ADKeychainTokenCache. E.g., when [ADKeychainTokenCache getItemWithKey:] cannot retrieve anything but tombstone items, information recorded in the tombstone will be logged, such that we can better understand who is responsible for previously deleting the item by looking at the recorded bundle ID; why token is deleted by looking at the errorDetails.\r\n\r\n5) unit tests for tombstone feature and removeAllForIdentifier/removeAllForClientId are added.\r\n","created_at":"2016-01-29T01:23:03Z","updated_at":"2016-02-08T17:47:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d3167210e14a681d4ccfa3389591198f87428ad6","assignee":{"login":"RPangrle","id":7004783,"avatar_url":"https://avatars.githubusercontent.com/u/7004783?v=3","gravatar_id":"","url":"https://api.github.com/users/RPangrle","html_url":"https://github.com/RPangrle","followers_url":"https://api.github.com/users/RPangrle/followers","following_url":"https://api.github.com/users/RPangrle/following{/other_user}","gists_url":"https://api.github.com/users/RPangrle/gists{/gist_id}","starred_url":"https://api.github.com/users/RPangrle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RPangrle/subscriptions","organizations_url":"https://api.github.com/users/RPangrle/orgs","repos_url":"https://api.github.com/users/RPangrle/repos","events_url":"https://api.github.com/users/RPangrle/events{/privacy}","received_events_url":"https://api.github.com/users/RPangrle/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478/commits","review_comments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478/comments","review_comment_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/478/comments","statuses_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/statuses/97bd4f3e51ab4f1d008540e97ec857cf6ed9522e","head":{"label":"AzureAD:issues/broker-dev/tombstoneWrapper","ref":"issues/broker-dev/tombstoneWrapper","sha":"97bd4f3e51ab4f1d008540e97ec857cf6ed9522e","user":{"login":"AzureAD","id":2966316,"avatar_url":"https://avatars.githubusercontent.com/u/2966316?v=3","gravatar_id":"","url":"https://api.github.com/users/AzureAD","html_url":"https://github.com/AzureAD","followers_url":"https://api.github.com/users/AzureAD/followers","following_url":"https://api.github.com/users/AzureAD/following{/other_user}","gists_url":"https://api.github.com/users/AzureAD/gists{/gist_id}","starred_url":"https://api.github.com/users/AzureAD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AzureAD/subscriptions","organizations_url":"https://api.github.com/users/AzureAD/orgs","repos_url":"https://api.github.com/users/AzureAD/repos","events_url":"https://api.github.com/users/AzureAD/events{/privacy}","received_events_url":"https://api.github.com/users/AzureAD/received_events","type":"Organization","site_admin":false},"repo":{"id":14703038,"name":"azure-activedirectory-library-for-objc","full_name":"AzureAD/azure-activedirectory-library-for-objc","owner":{"login":"AzureAD","id":2966316,"avatar_url":"https://avatars.githubusercontent.com/u/2966316?v=3","gravatar_id":"","url":"https://api.github.com/users/AzureAD","html_url":"https://github.com/AzureAD","followers_url":"https://api.github.com/users/AzureAD/followers","following_url":"https://api.github.com/users/AzureAD/following{/other_user}","gists_url":"https://api.github.com/users/AzureAD/gists{/gist_id}","starred_url":"https://api.github.com/users/AzureAD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AzureAD/subscriptions","organizations_url":"https://api.github.com/users/AzureAD/orgs","repos_url":"https://api.github.com/users/AzureAD/repos","events_url":"https://api.github.com/users/AzureAD/events{/privacy}","received_events_url":"https://api.github.com/users/AzureAD/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc","description":"The ADAL SDK for Objective C gives you the ability to add support for Work Accounts to your iOS and OS X applications with just a few lines of additional code. This SDK gives your application the full functionality of Microsoft Azure AD, including industry standard protocol support for OAuth2, Web API integration with user level consent, and two factor authentication support.","fork":false,"url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc","forks_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/forks","keys_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/teams","hooks_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/hooks","issue_events_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/events{/number}","events_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/events","assignees_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/assignees{/user}","branches_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/branches{/branch}","tags_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/tags","blobs_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/refs{/sha}","trees_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/statuses/{sha}","languages_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/languages","stargazers_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/stargazers","contributors_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/contributors","subscribers_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/subscribers","subscription_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/subscription","commits_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/commits{/sha}","git_commits_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/commits{/sha}","comments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/comments{/number}","issue_comment_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/comments{/number}","contents_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/contents/{+path}","compare_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/merges","archive_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/downloads","issues_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues{/number}","pulls_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls{/number}","milestones_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/milestones{/number}","notifications_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/labels{/name}","releases_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/releases{/id}","deployments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/deployments","created_at":"2013-11-26T00:46:00Z","updated_at":"2016-02-05T13:31:29Z","pushed_at":"2016-02-08T17:38:53Z","git_url":"git://github.com/AzureAD/azure-activedirectory-library-for-objc.git","ssh_url":"git@github.com:AzureAD/azure-activedirectory-library-for-objc.git","clone_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc.git","svn_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc","homepage":"","size":11450,"stargazers_count":70,"watchers_count":70,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":28,"forks":36,"open_issues":28,"watchers":70,"default_branch":"master"}},"base":{"label":"AzureAD:broker-dev","ref":"broker-dev","sha":"943243ab22e4a817078e36f70b39c2e5299b6d4c","user":{"login":"AzureAD","id":2966316,"avatar_url":"https://avatars.githubusercontent.com/u/2966316?v=3","gravatar_id":"","url":"https://api.github.com/users/AzureAD","html_url":"https://github.com/AzureAD","followers_url":"https://api.github.com/users/AzureAD/followers","following_url":"https://api.github.com/users/AzureAD/following{/other_user}","gists_url":"https://api.github.com/users/AzureAD/gists{/gist_id}","starred_url":"https://api.github.com/users/AzureAD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AzureAD/subscriptions","organizations_url":"https://api.github.com/users/AzureAD/orgs","repos_url":"https://api.github.com/users/AzureAD/repos","events_url":"https://api.github.com/users/AzureAD/events{/privacy}","received_events_url":"https://api.github.com/users/AzureAD/received_events","type":"Organization","site_admin":false},"repo":{"id":14703038,"name":"azure-activedirectory-library-for-objc","full_name":"AzureAD/azure-activedirectory-library-for-objc","owner":{"login":"AzureAD","id":2966316,"avatar_url":"https://avatars.githubusercontent.com/u/2966316?v=3","gravatar_id":"","url":"https://api.github.com/users/AzureAD","html_url":"https://github.com/AzureAD","followers_url":"https://api.github.com/users/AzureAD/followers","following_url":"https://api.github.com/users/AzureAD/following{/other_user}","gists_url":"https://api.github.com/users/AzureAD/gists{/gist_id}","starred_url":"https://api.github.com/users/AzureAD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AzureAD/subscriptions","organizations_url":"https://api.github.com/users/AzureAD/orgs","repos_url":"https://api.github.com/users/AzureAD/repos","events_url":"https://api.github.com/users/AzureAD/events{/privacy}","received_events_url":"https://api.github.com/users/AzureAD/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc","description":"The ADAL SDK for Objective C gives you the ability to add support for Work Accounts to your iOS and OS X applications with just a few lines of additional code. This SDK gives your application the full functionality of Microsoft Azure AD, including industry standard protocol support for OAuth2, Web API integration with user level consent, and two factor authentication support.","fork":false,"url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc","forks_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/forks","keys_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/teams","hooks_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/hooks","issue_events_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/events{/number}","events_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/events","assignees_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/assignees{/user}","branches_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/branches{/branch}","tags_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/tags","blobs_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/refs{/sha}","trees_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/statuses/{sha}","languages_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/languages","stargazers_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/stargazers","contributors_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/contributors","subscribers_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/subscribers","subscription_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/subscription","commits_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/commits{/sha}","git_commits_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/git/commits{/sha}","comments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/comments{/number}","issue_comment_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/comments{/number}","contents_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/contents/{+path}","compare_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/merges","archive_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/downloads","issues_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues{/number}","pulls_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls{/number}","milestones_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/milestones{/number}","notifications_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/labels{/name}","releases_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/releases{/id}","deployments_url":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/deployments","created_at":"2013-11-26T00:46:00Z","updated_at":"2016-02-05T13:31:29Z","pushed_at":"2016-02-08T17:38:53Z","git_url":"git://github.com/AzureAD/azure-activedirectory-library-for-objc.git","ssh_url":"git@github.com:AzureAD/azure-activedirectory-library-for-objc.git","clone_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc.git","svn_url":"https://github.com/AzureAD/azure-activedirectory-library-for-objc","homepage":"","size":11450,"stargazers_count":70,"watchers_count":70,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":28,"forks":36,"open_issues":28,"watchers":70,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478"},"html":{"href":"https://github.com/AzureAD/azure-activedirectory-library-for-objc/pull/478"},"issue":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/478"},"comments":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/issues/478/comments"},"review_comments":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478/comments"},"review_comment":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/pulls/478/commits"},"statuses":{"href":"https://api.github.com/repos/AzureAD/azure-activedirectory-library-for-objc/statuses/97bd4f3e51ab4f1d008540e97ec857cf6ed9522e"}}}}