diff --git a/src/NuGetGallery.Core/Entities/EntitiesContext.cs b/src/NuGetGallery.Core/Entities/EntitiesContext.cs index 6b19dfe444..fcd8011a72 100644 --- a/src/NuGetGallery.Core/Entities/EntitiesContext.cs +++ b/src/NuGetGallery.Core/Entities/EntitiesContext.cs @@ -91,6 +91,12 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity() .HasKey(c => c.Key); + modelBuilder.Entity() + .HasOptional(sc => sc.Owner) + .WithMany() + .HasForeignKey(sc => sc.OwnerKey) + .WillCascadeOnDelete(false); + modelBuilder.Entity() .HasRequired(sc => sc.Credential) .WithMany(cr => cr.Scopes) diff --git a/src/NuGetGallery.Core/Entities/Scope.cs b/src/NuGetGallery.Core/Entities/Scope.cs index aef5cc562b..8c55c95e62 100644 --- a/src/NuGetGallery.Core/Entities/Scope.cs +++ b/src/NuGetGallery.Core/Entities/Scope.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; @@ -16,6 +15,20 @@ public class Scope [JsonIgnore] public int CredentialKey { get; set; } + /// + /// Package owner (user or organization) scoping. + /// + [JsonProperty("o")] + public int? OwnerKey { get; set; } + + /// + /// Package owner (user or organization) scoping. + /// + public User Owner { get; set; } + + /// + /// Packages glob pattern. + /// [JsonProperty("s")] public string Subject { get; set; } @@ -30,6 +43,14 @@ public Scope() { } + public Scope(User owner, string subject, string allowedAction) + { + Owner = owner; + Subject = subject; + AllowedAction = allowedAction; + } + + // Deprecated: Should be removed once ApiKeys.cshtml is updated to support owner scope. public Scope(string subject, string allowedAction) { Subject = subject; diff --git a/src/NuGetGallery/Controllers/ApiController.cs b/src/NuGetGallery/Controllers/ApiController.cs index f138d916e2..dcee895bd4 100644 --- a/src/NuGetGallery/Controllers/ApiController.cs +++ b/src/NuGetGallery/Controllers/ApiController.cs @@ -235,9 +235,9 @@ public async virtual Task CreatePackageVerificationKeyAsync(string // symbols and the VerifyPackageKey callback returns the appropriate response. For this reason, we // always create a temp key scoped to the unverified package ID here and defer package and owner // validation until the VerifyPackageKey call. + var user = GetCurrentUser(); var credential = CredentialBuilder.CreatePackageVerificationApiKey(id); - var user = GetCurrentUser(); await AuthenticationService.AddCredential(user, credential); TelemetryService.TrackCreatePackageVerificationKeyEvent(id, version, user, User.Identity); diff --git a/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.Designer.cs b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.Designer.cs new file mode 100644 index 0000000000..d47352af13 --- /dev/null +++ b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.Designer.cs @@ -0,0 +1,29 @@ +// +namespace NuGetGallery.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] + public sealed partial class ApiKeyOwnerScope : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(ApiKeyOwnerScope)); + + string IMigrationMetadata.Id + { + get { return "201711021733062_ApiKeyOwnerScope"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.cs b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.cs new file mode 100644 index 0000000000..d7e834b46e --- /dev/null +++ b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.cs @@ -0,0 +1,22 @@ +namespace NuGetGallery.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class ApiKeyOwnerScope : DbMigration + { + public override void Up() + { + AddColumn("dbo.Scopes", "OwnerKey", c => c.Int()); + CreateIndex("dbo.Scopes", "OwnerKey"); + AddForeignKey("dbo.Scopes", "OwnerKey", "dbo.Users", "Key"); + } + + public override void Down() + { + DropForeignKey("dbo.Scopes", "OwnerKey", "dbo.Users"); + DropIndex("dbo.Scopes", new[] { "OwnerKey" }); + DropColumn("dbo.Scopes", "OwnerKey"); + } + } +} diff --git a/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.resx b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.resx new file mode 100644 index 0000000000..d54d9319f2 --- /dev/null +++ b/src/NuGetGallery/Migrations/201711021733062_ApiKeyOwnerScope.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1dbW/cOJL+fsD9h0Z/2l3M2klmdrAb2LvwOMmscXESpJPBfTOUbtrWjlrqkdSJvYf7ZffhftL9haNEvfClii8S9dLeRoDALZLFYvFhkSySVf/3P/979reHbbT4StIsTOLz5fOTZ8sFidfJJozvzpf7/PaPf17+7a///m9nrzfbh8Uvdb7vi3y0ZJydL+/zfPfy9DRb35NtkJ1sw3WaZMltfrJOtqfBJjl98ezZX06fPz8llMSS0loszj7u4zzckvIH/XmZxGuyy/dBdJ1sSJRV32nKqqS6eBdsSbYL1uR8+W7/M8l/DqKIpI/LxUUUBpSHFYlul4sgjpM8yCmHLz9nZJWnSXy32tEPQfTpcUdovtsgykjF+cs2u20jnr0oGnHaFqxJrfdZnmwdCT7/vpLKqVy8k2yXjdSo3F5T+eaPRatL2Z0vL1OyIXEhiuVCru7lZZQWWUXhnrRFvluICUlKvmvA8Oyk/Pfd4nIf5fuUnMdkn6dFoQ/7L1G4/g/y+Cn5lcTn8T6KeCYpmzRN+EA/fUiTHUnzx4/ktmKdZlouTsWCp3LJphxfiDXqKs6/f7GkTYii4EtEGhRwAljltEk/k5ikQU42H4I8JyntxKuy/blavVQZRVtqUaGeSFG2pkCxSwfgcnEdPLwl8V1+f7788Yfl4k34QDb1h4ro5zikw5WWydM9ca70lyDa62p98acfh6j2FcnWabhjWO9dub6uthMHroiOlwI9dT2v6I9PVMl1Qt5lst3tS2L6Ol8/7MKUZGqdFsVKBj6F618zDrgFzPRl3wZZTgEPtFMq9y74Gt6VlUgUVmv6k1b6kURlcnYf7pgOPymTbnhl9SZNth+TqC7Gpd18CtI7klM+EiTDKtmnawfGinEMssXRZHlarqSkps6aKTm9Zprn6ey01ddaLV620FqBl7mPuts4aqv+6a3B33+LoXlAX2i1//IPss412on+6UE7XURR8o1sLtYGpWtbm0k26CDjB3dfDSAPNlRF2DJXdqGGrypdZqn8jHDD0noNe6ZzLEd9kfk46A3z3zYIo4vNhk6d2eDrgs90PxXfhumWbMatlwIhDrbjLypZK5m+qSv/KaFDIoidab1L8vD28UOw/jW4Ix/22X1/kiV7l6xL2BqoQLtGSgUYe/fGhyDLviXp5iPJSD5Rje2yr1i0uS4aq/Xt53ztWrJYMr6hQqftSe7CuAMFrvRlso9zx4naYjKC16MOCz95NYotDG1Zu6Y6gmIe5quk2OZouRISlBlJTHWeHNO7IA7/yXjB2ZKySbwJqTCDYhZXLgu4p1/JprEZwawq2dhELTCM5VH6Gs3o2ukFOY1oq2RJpOVXWJQsyVWEK7Lep3Qa/ZDQ5UCoYUjI+KgMESSLIj4sHyQ960VTqeYrrFsvnvhCx0WUXif/lGx0RhU/25YCTLB5zbCtIu0k0XWhMNbW7FPSzYCIjt9aaOC45SF+0+ZsRy2YQVEvcC5XTcOa3meKg3SJOgF20iDXZPuFDnfKkrX+aItMqz34KRTQJGAZxnsnvaNU18eMwvHRh8xVdrHZhrGzEtAsyAq+/Kx7QNTCS6MuqzOQST7DTQVUnk0oXWEUzNRrlIl8W44zvpDHkbb4KchIpe3rfl06wQNeK3USvaxxtf3TSfTKstVa/krJ42Kp30Hb8xd/HsIUc5Wt7oNU6OF+a6Kr7ENKbsMHf2q13nb53qPJw8e4mbNluDJGfSR3YZanmt2wWiNcVNcYqIRF08BivXQFQNFaWwBlj/rCdGo9vrJ4lXyLoyTYdLGwKWqC9mV4G3aw1nZRFADAAFWB51JGlCZrR3Vhz3hbQM96nc+K+SbzaOY0T7rObGrTqsg+us5Vvx11mulAQumo3ru8y2T3mIZ398Nbaaa43mN3T8pP++igJnT38y7Jie5s0k9lHqea1w+FTIOoQtfnNBqc+78H2f1FdJekYX6/1c3TzzxVNv4Nvat1Eo8hyqvsLR0ZWW9bbU1nlReFvFEjW6q/X/hlzhPR8h7ebjO6Tirqfb0JwWoNJcM1ibNxRmi4IVV1H8kuSXvj620Q3+3LNQE+En2M9nIxwN9yGKVPK935JqToDP9JOIVc3BBxFBX9WRybjNHNRd9mIW3740hq/yMJNteEyqWcchRQmbj9bV/c1q2AebEuHj0EcX+jzGq/3Qbp8Idxn4K74ZcGn8I80g4zL5ejqmX56Hej3iXpNojoGNt448B0EFrMNm/JVwJccLXS1+VOa/BuF7T1GKP5Ld2E9L9MVtpDU7Z07kvrTVTo7ZhsLvb5fZIOL/OmwldkR2K6i2OXPcaqtZp1yrdZg9d6HcaXUUg3quZx94OPcdfl0sIriiMPmKzkSleb+T7jeOAtTiyxhzWuwShu1bpp8iiGrDoJs1016a7mKhHJGt7EjCqDfDrKpZDJlVVB42mZFXLeNNYphWkwn2JB02Z2PXWuyhUbAm0TigwazvlkjGEhT0c+/06VPt2267HBMj1q2JVyYBzL2ToyLZ65DGVFRtqgNzk7tqRS9ZphKWZUhyWfjg5LIZPz5cf9rhgRZPMmpb+/JemvWo6bXBq4KHkwYasZvT1hqwnKt73476hA+79cqygxte5qWGeljuZ1q2m/t0m9+N//csykGvouJJARpSw0+qC3me4fXRHcljyieBwUezlAt7IhrHZkPbi9gsG7mR/819drfDotprGRCq64+wxXyQDsNmKFwsdBO86g1T0xc7WJkt/2hLOtdmPIxhw10AncZbLdco8YRhjpFeQdtqJtCcNetM6IrTCR3B3v2gy3l7ZiX17ke9BhHbXXUW/1Wur6umenuVzlaPtxH3BW1h9lePaBbGGnccVrUeYI1nEmWT/equicnOXBdtd7ov6UhsTHPaDyXkKaFtaFwU+di0PgwoKunAQf+KnoWAdP493aG/MG3Vh3pka8R/Nk73KMetvxePHDu8nB5TwJWbSDZ06+7OwlccTW3qRpOfNmc69OoVyXZFWx46psylXZaIuw4/LiuLw4Li+Oy4sntLwY5h3FjF6GeL217facwN8ldo9rQvd7O8j6C7ve42txWNNH1od8solFb6vE4ovrErFIOa4PD/lWhvOt+ClufzjdCcNOl8GLY30GDHcW7zZqmoLHoXPAdx663ftDtDl+QbATQgva9q58aOYjEmd1Ja6Y1Dt6AQUdi4kOQjtBSnXR6eSQXCx6hNsIJ3QGzA50a2W1/+IztIvncDZDDFTfznEhP746J7qdhvPlvkTmG1Ls0WzjQbVljgN4VvPFdRDTNQMyZXDddtNm5PyYA+lqFBsok1dPSHwN0NsVKF3LpvKwpc9AadZ4bmOlKnYcLgZ7fdttvac94NlSb5oX+6LP83BNO/CxYrb3w+F4He03XgJkDGFixiMm8DOHr3GsxE7QDXbfr+fEsQq5EwP41+TGtJKuSC8dVemVFcnzsvctdZRY7KijDOOMPOSgRxlPY87V/FR6IyxOfkrnSW4WKL7ssd/Hn0/ekW9IrDjn5wllH1L8+aHHR0W6pEAd5eiSNgAOR9T5rKiWr85+x4+Bm7aAYsMD82F2PDizBwfD1i0xzF6WRazaZzuP6ZoqAdi6mUo5fROl7FbNk8v4OGRjDj7cH48WpY6K2nQVp3Se8j52VyQwpZ8ePejnIBsl2qZshQvv4qDAwQhVa1yxVGLUjWqW6YbLq4xkOQs2epV8Q3hqriqBdjZwDgO3Ha0U+62qXGqXPlfZmyi4a6PduykbRsVnTI3P8Yak0SPFHz+UxD5h4Szq7fbXIIyYG8/SoHu+fKZ0olCg8ZtUZX+uz05zhZuA7ZWqEupVS6EECz9YlytGdFXue7XDWNfwHy+yLFmHZcF6fMpBbsW6X8ebhSni7WPj0akKCn1NOyPcFQHb8sfz5R+UBmmINtvvligfgFek/HwpzxbvY9YBCxZcmC4jg2wdbFRVQaWzEb/QCYakrB669iyWEWGcq7NRGK/DXRAZ+JfK2c5jBWNNFXJK/Sg9N3SITd1SqGmVi6YySWwmKZ2dchDTIw+O/oUhxRAKrIWLGGzPHor6KGJcBez0RCT87OREHemdEKVlYwxYaQVtw4AQJ28SZInx2rAOR+KT6jvaq8rBeAFA54bqTsgD5TEG4sDG21TMRSucBGdgLC2si/WBtdqeFoOQjYI+fbi1ljU+CuEgENTJaAwk6gRhU7851uEYsERjVWH9bw5c1WIACNRmP8eaoxjrte8f5DWutUwgC5FBKngRSC6gtcteMprKxpJN49rMwKPqMFWRwkh6S2YIkFSVpXb2N4jWQuQyhsJCJGBTNX8bfBI1BTnbMmIP9oU7NQBhp2IKV7zTvkGRCElpTDhC8jgkTCKebgwwMPmZUvAgHeI6zxYmPztYhd6nDtiTlRP3yrX0gaUl324fWYf0Gd7ahow4zLUdeEjDXfDgYEAR7M5BAQ/zPOWMUdj5+OFAE+J/RERCnXNwQNSaQeWMA0HQxfbpyfCJVT82fFzNndOaoKQ3uJZKDH18rICo8djijCM0MMHhaDOkCSMiEumoQ9JpwgtzS8wYNFt/UE5ztqNhYgJMHaSiE19gm/blfOb5WAsErnC1yNwgDGongOQzpp0AksQh6Tb15bWh7zXPsJX+516bO+s5TZgXI/pVfddhmNpoe5Oa79DuaRX7VBr9MFU5HCPK0MH6GFBu5zHDqnlDaKsOaO8DTa3cRoSqVioOql95BDGTk1aAPZdzV6j4CKewYLU4VB0OOR1v7UAP1bFmGF+ti9pfdhlhLy/Ts/cxrwx1vtmjacAYw9/QWfOftEpu+fsdhotlQtY53C4TGZridg8ul7EQCAvBpnYmnInhx7ztaHtZ9K/jdmUEowZghbl18qX52U1m9nwK44fL4/HmufiearT9AlD5GEMAkKFNte2Dzkmgz91w164HpHwQSvCnBDqoyIQPZt5HGB8DakhnzH+eB33UoMjQOqzhcMd7qnAAns7VzWDXAS2cUBgY1hTVSKeD1cfBncWEpoFuY9e6aaMMZ+uOPbg9POglxmZE6qxPmgE/0Bpf78ym+2DrA15QTCPCFRSGTf2yF6gpzaSwdwiD8dHgKkLRhaILF2ezu97ZxOzXSTatGNFGqu08Gz4Epy6zwa7LQsKy/EiIfkrrCsf2TQX7p7TCgNone41xgSPqQmbQQYA5oTlI7Y40Ziq0Iz1qww7kd2tKlCteVAwYw12qAM9nmMsiZxyj7lgOBbtYA0bEK9ZPNiyIXoxmgE7b2waoAx1LbIIWY2Mtne8IoPJgvnuoDHMqwcaVTPk1JFnxnTxArhvpoKg89GSVDya5KQXdFckVU222XLQOgwDrqyITkVBpqYZoVHZ+Q/EqaoFSmg1yQ2He1QJERHTFYCDWHqpBpPgjNwMh5dAeogdcCzCQBe8rqITBpa0daQ05WxJNsEaMUP28146c8OAUpck/1rSjK7yH0lCWHrI5ETeTtSVYPHbQUGOvR+xIsRvFWmk2V7btKLLrvSg1djXWjlRzFVJDj7tqaRqG5REsMPLKA1ELtSRcgoBFBt1WMVDmDFag5uXNkXakNKNXNiEaCIrOnSGCstdou47lV9CavhX3QLYaopiRtcqBTfcSOW76leYy3sPagsvGT2uoFzZh0YD6YWva0k6fylJLQ6ZedXBkhOlcXuCKbbWQA+zvCxCGhWMwoSl612Bce6SZXSMdvTMwjmS10ugtHNFlFSAUjU8rgXPYq5WJYw0JoNFaOXZoPOhHCZCB2d+S0A6txyUniWgdJHGUhNVeb7GgfnwA0dj5/BEaZfT6wzUMWn1q5GX08zPACIIshri8NLnxZuGFIJnBS2uN1DTkh5db4/0HFxbsIAhqguIiSBWLlSgUzz4qnYZtb4IQtwe4NHC/NWBTQM81XeUCOpxRiYlN8SUhxDsKLiobdypQMw0OVdT2yjswsyQNLlTQKgYTZ7OqtpRmnd+xpTWQhpNlXQMuSo8yFDx44KLDHX1A7QFdfajNqDbSZvmAzj2GFwu2zFby2DUAW1x3ksbQy2rR+mCBEK0jBagZmCsFVTKclcQsHcx7wqBwEYPBG2VkBxrwTb8n6YwEHynsN74kEPKZZ3E+e+8lgUAMh0vVBl+iAWJPo+IxvJaGWoW/l1Zbxhv6zPLCX0gPOsRMY8tyUJlGkx1kRho+8ENfy01Zk99t39Qcpg21MWsqGBY2li9MrSwCYEmXTTxEYBBrAVgRLmhtT3Y0xoEhk2GznPHRqmJd0z1blcahel5gsNzpXqoOZbgU30Vi1kvN60nV/gi/n3S3Y8LPHgez2XHv9DAxAK/4VLbFd3zuzRZf7vFjk/HWu6H8mz30QAO42wYcQoi32LocY4g30gZAufwGDWix9pmawDP2UM3u5EVLakgRgMG7ATkYH1CJLdA9oeIlIpxw6kSiezQ1nFykZbh4UwKVkq6UsYmawhoJWq0QHR5WDT8dw3Gc9cizWDZq3/L0RZ5ueWjoiO4LbSSQKLrQtnhaAq2D9Y9LVDxIB/Xmhbb+OclwGxVz+FI7UbqNZksKgwl42sENcaSEVLUTu/ZOvVEM2K163+LG7tEPB2s1sCUqT/3tbaht6P1t6DSqulVjlhh6Y3twKVnYJ7SXiDWtsbBJuIvIsx2ijvPZ3BVu0s5OV+t7sg2qD2enNMua7PJ9EF0nGxJldcJ1sNsVF73aktWXxarY3NP574+r5eJhG8XZ+fI+z3cvT0+zknR2sg3XaZIlt/nJOtmeBpvk9MWzZ385ff78dMtonK4Fecs3m5ua8iQtzhjE1CKq+Ia8CdMyzHfwJShuS15utko2+Wa0KL1GwnVt6uVntffqe2R1meLv6rWeEN4UvQLWyvENbdqWZipbScBdg1qYFl+tgyhIocDIl0m038aa9wJ4+cZbA08DdeGA02FXOnki0CVPHYUyDqpIovpkT+MVydZpuGOTPU9JSLCn10aM5olhcaR1lGjfBmVgWZ5Q89GezuuHXZgWKoGn03x0pFMqkE/h+leIHp9oT/dtkOUUPlJD268qpbNTaVzIg+9UGX2SNpQHtNVwr4wTnUc6e8ngPsiRckONbylSrIQ+XRBZnGb7Uo0nh79fwymt9l/+Qda5SKj5aE/nIoqSb2TDXnWJ1KSk2eCPLX9c4HeVFX+/v/2dgMOCzu874BAycuEC7gvD8srpxWZDtZSsa4QUh4krXifxbZhuyQYnjmZymyBj+pc6Q7KvrjJgcIRkUKfYU3yX5OHtY7VM/LDP7mXCYAZHji+ZBNl0UARjB3gH8tjX8iHIsm9JuinOkXKgBii9D/V2dqOrSGKqS87tPOV/ztfgrF9+d5tYWfD4t8ldGCtUoXR76lzJy2QfSxpZTfWvRl3mXiHGrrvq0x5k4TKy1YETTSjirf7OshWeR7rLVl98qOnlp2QjEWBfHAYAH/VcwL4uHDpOb0XkQcS+jL824qJsC9szPPj2ZBDmz3I7A5h7lOsOX11hdDksR40WVsWmkNI4Xc5nLU9R48oWp3WVXWy2oTSxNh9nAwDg5klnHKiPqd3hYEFjKJXmwxxyla3ug1R4Ty72v5LsQvtDSm7DB5lk/XU2mLK8NmWJKouzIQtcWVEZCllX0ibhymlP8Cr5FkdJsAGWiVKSC5Z+IWl4G8rbF/773PDUH0PdcTMeVgCgKiSxPA47pWT3mIZ39xKeuM/jG1p9m5I/kogEGaE7ctl6K6ZMOxJfP+SFYSOq+vRzGsmWYTXdnvrfg+z+IrpL0jC/34qEpSQ3miopJ+2zTmKloc1HFy32loIsy2UdVn91p7TKgy+RMmmLaR2oki1Vqy8QsnViV2711MUsjscKu406soUEN3rFCyaIXP3dgRp7OaeAiP/ugOhwI/uYEeCtJru0O77bl888xFbXXx1mhv2XKFQtjtxn51nmTUixEf5TMclJiQ5006TYLSv9wn930eC7JAuLh0sKQSnJSXt9JMHmmlzFTLEqqowlu/H52744DqxAcrEujvmDWF79a7K5GCm22yCVFgTNRwcjRXAnzYrsiwOFMJdVZfXJYc9Ft/7KfN98dLHLp9sgomDdgBSBZBfDUqE835KvRD3Rk9OcNVi5EwR1WJXiTJGpKEwzcqkulDNVb1ffHPevKVt6AXvYJsXBhBgFeU5isml8Ggh2RCW1A2XRIQBIXuczwKoO8aEhWIfuLaKujuswvoxCurEBh4WaOv41lurGmrzirz46z2h0vZPvM2zHxKXObXeLuwpx2+NWnv0673Sx8gPvd7Eec6RW/C+p/gA+M562tw2uUNy6nHO82LnbdTQOo+v7GdkqDbjakTW4GGEJLsur4nIp5yZRXGlJiXODp+TKpC9Axc1TZ4wayBwGTP3eUVgVd+OVjUb71W2vBSwbO60XL5PtVjmNbT7OFOzeYN4b4ONB+1CmS+Yjp2//lB56O3cOXPowlI63O+ch3ZPmwXYnb/ubzw600pBAlnT+u6N5MU0Ln9aKdZF9dlGFhQGo2CsgRiIuw9gGE3Cn22GD6/MAyPsbAE/HA36NxPM3bfo/8Hrahs1p57TWf1ffea12Fd95akMJHGe3zrPbUddb0Tvq+qOun/IQq/9lhiGuWAx1POv7UL/LkfS0sy7madJtxi1f2naebuHShzHX2lsMfB35TosXzkdmX9C09t7OyNGQGAo+B2rIxnzG2V5lL6ITuXcTXOxf1noHumPs3CdAlCf3HrIhMlR/+dqn9NfBq/0XZBkvpgzzeGIiNApuyTqjkI8M5g4/bel/WT0h+3fr2zndr/ubCAzVRRwuVK8RUtrc3hJc7IsYqHlI06LHilnFZgHkcDASxOtov1HeqjRfXe4JKvtldKM80WCQo/91HgxSkED3wWAiMJi+Ig+55jo2kDybzgMd3vXdOAgBGTvvHfRUBt59DqyCapeXCmkhwc0WJseIl41gphjyOHXed0fhX002y8qpznyrXjaEhLmNltqHX99xUsUY7TxCsPJDjY3qlut7xZLefHamVUWMB8ghseR1WAoyeXdQf3PYaYR3cZDvU/mGUvt5fDSKvhwN7+GbkIi2j96bAsan7ZjXc6Uj9GEnVfnZoVWhCwKkEGbDUQ9mK2+bXZlFt8k4f7LTTmcsQH5+DWjQFbF4km6JCLyWvpiwnYodUaFh+HBxgUV1dLgLy5WyufOqvyaIy10fFrK7/ijIeYSHPrRkVzYrOhOBBAj3ZXlK0BZwPQzAJYzG8OqpL248ogCNYNaVR3fe6BJ8Exa9urjK3u2j6Hx5G0TyozVN03uDxzaIlfWaBC5uXKFYeE2xWgNA1R/I8gVk3c+o6THL9kYYH3ZJc95SZ4GOUaDDLkCkanSmEed6E0c9O7IgMnbPwWGFzKcVXGbNqYTlClQXhKirME12bsde1oU1OsDVphJtwcYWwmW3dGyEz8tITIaeOrCi6nH9gIR5mOfqAW++GTdK5Ak5S2NHqb40v5vIE1XUByEcRSmZIrjEopkEgTAQLMtyQYXwNdwUISBWj1lOtidFhpPVbxF7WN5moEMwvCUZc/F7vnzx7PmL5eIiCoOMxQqpAly8XO+z4rAojpO8iiRiEfHi+fdFxAuy2Z7Kxd3jZhRUsmwjRITgTJG1dkEiR5zRrpQBUQPlI7ldoKA6O5VLnkHQLFg4X4aFZMsR/TOhHc+OLPPiqQofK6EAX+H9pwHgqZZ+o9y4OmRxvryKN+ThfPlfZZmXi6v/vKmKfbd4n9Jufrl4tvhv56pZ5ApWb/w1SNf3QbpcXAcPb0l8l9+fL3/8wZlmdf1AQ/TFn350pipcc7annafqVQiZdNtxfuk2rtgY2eKSZx5uCQqgy2S725cFHGXTBMWQK3LjV4mFwch9Ce9KSLoRa+NguDDFW5i1agCILXHAGkCKT+GmB4TCvbRBe6bmxkFdDqvcBi+Nu2dxDP5uGzz83pWWFAjDQBEQjTUM1VX7AaNQjBvhVxei4Sk8V9MEq/A7p4lhK2q9mDvTAaNUdCeHRaTQNP77F64yhYJSDFyBHImi37zGe3joRwmKPNGPohpvghvgfnQUHqfggHUVC3rgYa4Qgh64TXtc0V4zH2m7vYsS8DlzcqES3GTRFHRYgFgjGAtVYIdfY1wCoAwaecCMfKU6x7WUWLzXeo5rhRsTTcFe1TdBF2yxbQ0IQ7CCA9Zr5s3z8xd/7tATSviD7vqmDXzgvV+Nx14H3LNXG+/dKvk+t105QF3aRh8YqlOfTEdih4huKham0kvfcn4FPCwFRrNeaSx7nRgX3+F7IOhtmEEhBTzwJ7121ymZZ11oe7flNm4mPDS+DTrQZ0YTAw14oFT7/ffFlAeCgquBoQc1H12g556bcyTiY7CoMQX6iLSOJqAbIc6DjnPjMHQ/KT4tMJu/HTXOTYsXTS44afGjKusoA2Cv23GFOmLps4mvfLD42MSXrlh8EGKOk/yaaBuPE34ttECkAesK7Kw0YsABcBXgoM/KrZiXXlIDDHghmuX9bNNibIHudNRoAj6sfnAMAZ+UxcgBHiirQQM0AP/BGeDD3EKwWl/XQQe6g0QNM9B9lQ7cEOq0tWsJ2AvHdVMNBQ04/K11d5n33UK/A84OLQara7dhTv+PXdfD2uxkX3NYqbAIBH4XQYr/pj7kXdGnced/BGAP85vVMbPdbqCJI9B9GkPXg73NN01AgQlA+2TgCs00jgcCriJUHekfsPwmH+5T3tptHSP3VDS8z//uqoZz9u/F6sM5+Z+rFcPnZtTvuY3v4xSfxnrPttzZmxu9H0U9Vduj61QGOs4/zmZzm83s1LO3yeyo6I+K/qjocaIzUPT9bxhMfSPC74mp9lDedRLBj4297iOLL8eZd2KTs/XB6gCrL8QBzgGjwKs9FgVZj8OkgY6RVFciB9yJQx/emFzYH7DoJjRmGQ2hXUzUojd9z8TBO/o+gYY6qz9ghA09OHUO5A9YbLJvHrfxKZbuNUxne+sd9nHf495S492+O42u+0BrtOs8xB8w2gEP84MvZnH37AcsyNmOVsEvvBs3XNFeLEA+5N04USn0fLcjO573ZEBqHM8Pag6AvLcf8NDhvMD3tMeIDuDdIMaX7Yl25jneACm7VXXrPN6dXPfHvV2drFg6KlULIt4GzdiEa3RVLiqNGR7teH7m27WPrT26euzl2U6us+1pa2fqtgMbd4Cu5sb9kNsM6KYm11FcFezVoTzrbvW3JYfoVnd/1QNrbDs1cKAKfCb6xslO2tWwjDv6BdACO4E29/KE1s6GZ0dMsWJD9JbWB7VdpxkdSHucfGdjEJvfZMu7Dsom249ZyMBP+zk3zfX+pHAKeoN6CH4dbxbFQBKcCFesF56QT/jP1/soD3dF6OT88Xz5XHHX/T5mW7QF8zJJaQbZOlCjxpUeqzE+mBdTnoXqi1j7HxSitM9Iyli9pJ1N9XmoRuv6kIbxOtwFkdpqKastGormNFTllPpRUy40zqYmyf2pWmdDWhKtSQyCL289dngveY1nNxRAZSLfb+yD2G3PTk6eKz3X0hD88vG0xIRBoABFGxgEBLjzQaRCwR/fJEgoo1RULMtq1BEBA6mNI3KgCjnfhZPghp9+Kw96OHzEuZrvQylFBhSuTzgviTw9/vMgiNAsOwaCBuYPEqnO7AByDHg4RZPkulX1dcj3LpA6igqCjbRaziAF6QmCBn+QA8HQKq5oHzvHpLCEwrfMZP6bF/hGmxG7423aidExairX0ZBZke9mMH0UCGJHGAbuBoShRcjAQVBpGU23h9l2epjOWBfOD4ij6cM+yJuFRrypH5cZOhfqzHHhVfkZAvioU4bUaWOiCfKohNTIPx2ZFEaCE7PZY4lzfgTwwqc+FUxh7p5mjiuH6OVqL4PXOPmOljKMiUDddQQTp3L2ITGqcdQ0LGCt72sgbGgj1E8OYMNqzhoQR9BqQHtIcMVvCE2JV/gpywwn9H6q/nCndXf1PJeZvfAEdjj4Kv2WAVyw708FTap3tkMAUf9Tct2R1nQAGNuIYd37szBcVO6XDkeF1P6iAEaapKeiSEDfWEiVc9ElNaAGv3QzNR7G1isuYJiFaql1StExB2DMKn3hAFyw709Fpagef5D65qJPGk8uPqcoO9WiOJHhSXKJTwUbiDMgPUBuJkfIaFONDbIOdHI5nFlFONStvhlnl/leOxgRUxNfKzi8awTqhSqAvady6880UuwKPOU7gV3Hz6yvCIKItjtWmaFSPSRUT6WOveF6Vrpa9ejnxaA5CEoB74MyJ3LyYS8yTe4WkWpn8HhI9xBzHmCa6q3IaOBxfCLCsk8Mm4Jz48JwahVUPuyX62cfDxsxsNcCpLIZKBmGFsOiS+ktqKeeEFqsO3BUtCCOKkZCC3sVX95kH9TeNe5j9tH0gv0z9tad4CT93L6in+8i1tnxwqGhxdHHwrTzCOcN5eY6iOm2zPwki/dNLXQh/30cLEmOaxBuBnzpgvrpHgpcOlc9SJ1G3zyTAW3Gj6qmh9Z4CqsDpmahtaT7AhrXc4dgg5Tc1wOAe5rHPDq3/UiVs7Ig8prNeK44u7lzMrhNNHO6wGwWE2fFMO+jvvGDPsuZE2AY0rBi+mHPoFCTbOoVXOHPBl1PYzqdDwwnvj/hjMpZza4QQKXgC0ctqIXf7LUgFI1jSqyx3m/jL8wZX1XkDfAVPUt5EpiCAowgNYohN2aAI9u7hq5dObu7p+59NcENwapTZuIjsuiblmDpdLa03N98SvxeIcBx0tENJYi+eesSb14qvaPkdendmpbJaQmS1tvPZEPehGkZwSn4EiiBMlipFcmV05/l4nXjLxs4X1mt78k2OF9uviS0w5nX7TY9A8AiVlQd6il1VN8h8mWSmTIDr0KYfYboFilmsqJTXIW8mAxVw+cwV8ffoVEq4xOhqtp0c0XAJWClPiAPVK2SzVw7uLdT6gdzQRxAN0ptecDr1dZlTb92cYXVUqdr6qodfVnWyDtBwmrl82hqFnxDWVYv+WvAOJCyaZgQcrqyYWTApmrrStmbcqxGlqqprshgXVfz1BSrrsmgqZHlcehd9jQRq5KlaupjDzMt6+Leu2EVclk0tTa5LPRieb1IVYXlZ1D7FTeprGYn+YItOFfJmbCZS8hn03/CMYE6x/Op4CTfZrCuC9ewcgZNjdb6Vopqq1YqZ4AqFfNYI1W0xWBgFXNp8MpndFD7bKuHq3yWrlX3RZYOiwdk8YXks1pEMOepXVYSCDNoTssVhRtDWg9aVnOi+zTFylnPWXYPUcydar1MU0q6Ldja25+g5sRVdJ3qpCQRFCk5DMqyvrBirFraMisVS+lQtVIWqUJuAyntx/igRwsuG783QwMjiSfDyj6SViV+VvbEyh1QrmD1RTZuik2xaCYcnwdoq0UgH8CGwnHMPmgaCW0oy5JiQu8mi4FogKZqItUcSBPBmClAS82xVXRmLY5/7QATaKj7+JIA/7l3800xQQBJOIURERqE2gvKdgGpGuFolw8wPQhzPkVWXSd0ERl0A7HnwJlOMMAcbkaTuRDeVM1ao2womK4RnWEdiNEcXnw4ssyFfGJrFgJqfNbj4oDd2sPnUyrrNiIQLXJ86TrFW3NF+xneZtwHu8+Gq4ZBngKf6ksAeifguEAcnIdDDQVNkHxbpQxm0Vls51D6cvaBhWtUOA6OrTWi0DT7aQi0GViWgkROlP0N336o7i4Wwd8vLg3cLbBPIfAWdr4s++61ydgeUckzwDQ9TjNlT6x4Y7U+W332r3SqwRdvknw339DRuHtRP309ZpNFB5maFYmQb7De5k+T+LLsu69Gq/4c8YYbfD/6bLxyvMUT4BK99b0B54MB3EZAnjZd7WmR3X6ryT/6TnUgobg5kLOyd+gITGQwMvWJXYGxhO1iXNIRGA+jcxU45nILMW8bvXP11G/4qX5TXk72Y9eXDNGIcV97a7FXw8cwb6tejbB24q6PPPQvf+LYlGIffTYR1xEGfz3iuJWZhRgdtYm8/xj0bBF4i9Oz54Y7SpQdpQCN0vpS6dkw5xPWLk3UePaAmmvrCERsiHofibWE/64TBHxUL9PwZL/W+aCwFckARv1JhCBtEcUpHpWFrtR4Cxv4ZhovL39LcfB1vwEsFvsRTwNnFBFUlOAX6PgWzeLFup+dKXRvj8eVmD6IOCxHkW3R0fexMxCh/KjXUnzat8CHjC/lFSouEP2DVT9CEC+mikeOLMVzwy2MQNoHlj4aMaLJp+OzQNNFqY4PDHtipuPlK43YirfQBZHmjVyTdnbKblFWH+jPPElpn1wnGxJl5dez0497WnpL2K9XJAvvWhJnlGZMyqfYLdE6z1V8m9TvAiWO6ix1cvP4Kw82QR5cpHl4G6xzmrwmWVZeVv8liPbl1bovZHMVv9/nu31Om0w33JFgVSieGOrqPztVeD57vytl6qMJlM2QNoG8j3/ah9Gm4ftNEMkntRiJ4u3iz4R+Z31ZTEXk7rGh9C6JLQlV4mueXH4i211EiWXv41XwlXThjcL3LbkL1o/0+9dwU2AZI2LuCFHsZ6/C4C4NtllFoy1Pf1IMb7YPf/1/8s8bBT9EAgA= + + + dbo + + \ No newline at end of file diff --git a/src/NuGetGallery/NuGetGallery.csproj b/src/NuGetGallery/NuGetGallery.csproj index 041dc4d87e..28e995621c 100644 --- a/src/NuGetGallery/NuGetGallery.csproj +++ b/src/NuGetGallery/NuGetGallery.csproj @@ -784,6 +784,10 @@ 201710301857232_Organizations.cs + + + 201711021733062_ApiKeyOwnerScope.cs + @@ -1866,6 +1870,9 @@ 201710301857232_Organizations.cs + + 201711021733062_ApiKeyOwnerScope.cs + @@ -2296,4 +2303,4 @@ copy "$(ProjectDir)..\Bootstrap\dist\js\bootstrap.js" "$(ProjectDir)Scripts\gallery" >NUL - + \ No newline at end of file