11// Copyright (c) Microsoft Corporation.
22// Licensed under the MIT License.
33const { isNil } = require ( 'lodash' ) ;
4- const { MarketplaceItem } = require ( '../models' ) ;
4+ const { MarketplaceItem, ItemCategory } = require ( '../models' ) ;
55const asyncHandler = require ( './async_handler' ) ;
66const yaml = require ( 'js-yaml' ) ;
77const protocolValidator = require ( '../utils/protocol' ) ;
88const error = require ( '../models/error' ) ;
99
10- function checkReadPermission ( userInfo , item ) {
11- if ( userInfo . admin === true ) {
10+ async function checkWritePermission ( tokenInfo , item , categories ) {
11+ if ( tokenInfo . admin === true ) {
1212 return true ;
1313 }
14- if ( userInfo . username === item . author ) {
14+ if ( categories === undefined ) {
15+ categories = await MarketplaceItem . getCategories ( item ) ;
16+ }
17+ if (
18+ ! categories . some (
19+ category => category . name === ItemCategory . OFFICIAL_EXAMPLE ,
20+ ) &&
21+ tokenInfo . username === item . author
22+ ) {
1523 return true ;
1624 }
17- if ( item . isPublic ) {
25+ return false ;
26+ }
27+
28+ async function checkReadPermission ( userInfo , item , categories ) {
29+ if (
30+ item . isPublic ||
31+ ( await checkWritePermission ( userInfo , item , categories ) )
32+ ) {
1833 return true ;
1934 }
2035 if ( ! item . isPrivate && ( userInfo . grouplist && item . groupList ) ) {
@@ -27,16 +42,6 @@ function checkReadPermission(userInfo, item) {
2742 return false ;
2843}
2944
30- function checkWritePermission ( tokenInfo , item ) {
31- if ( tokenInfo . admin === true ) {
32- return true ;
33- }
34- if ( tokenInfo . username === item . author ) {
35- return true ;
36- }
37- return false ;
38- }
39-
4045const list = asyncHandler ( async ( req , res , next ) => {
4146 try {
4247 const result = await MarketplaceItem . list (
@@ -96,7 +101,7 @@ const get = asyncHandler(async (req, res, next) => {
96101 if ( isNil ( result ) ) {
97102 return next ( error . createNotFound ( ) ) ;
98103 } else {
99- if ( checkReadPermission ( req . userInfo , result ) ) {
104+ if ( await checkReadPermission ( req . userInfo , result ) ) {
100105 res . status ( 200 ) . json ( result ) ;
101106 } else {
102107 return next (
@@ -114,7 +119,7 @@ const get = asyncHandler(async (req, res, next) => {
114119const update = asyncHandler ( async ( req , res , next ) => {
115120 try {
116121 let result = await MarketplaceItem . get ( req . params . itemId ) ;
117- if ( checkWritePermission ( req . tokenInfo , result ) ) {
122+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
118123 result = await MarketplaceItem . update ( req . params . itemId , req . body ) ;
119124 if ( isNil ( result ) ) {
120125 return next ( error . createNotFound ( ) ) ;
@@ -136,7 +141,7 @@ const update = asyncHandler(async (req, res, next) => {
136141const del = asyncHandler ( async ( req , res , next ) => {
137142 try {
138143 let result = await MarketplaceItem . get ( req . params . itemId ) ;
139- if ( checkWritePermission ( req . tokenInfo , result ) ) {
144+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
140145 result = await MarketplaceItem . del ( req . params . itemId ) ;
141146 if ( isNil ( result ) ) {
142147 return next ( error . createNotFound ( ) ) ;
@@ -158,7 +163,7 @@ const del = asyncHandler(async (req, res, next) => {
158163const listTags = asyncHandler ( async ( req , res , next ) => {
159164 try {
160165 let result = await MarketplaceItem . get ( req . params . itemId ) ;
161- if ( checkReadPermission ( req . userInfo , result ) ) {
166+ if ( await checkReadPermission ( req . userInfo , result ) ) {
162167 result = await MarketplaceItem . getTags ( result ) ;
163168 if ( isNil ( result ) ) {
164169 return next ( error . createNotFound ( ) ) ;
@@ -180,7 +185,7 @@ const listTags = asyncHandler(async (req, res, next) => {
180185const addTag = asyncHandler ( async ( req , res , next ) => {
181186 try {
182187 let result = await MarketplaceItem . get ( req . params . itemId ) ;
183- if ( checkReadPermission ( req . userInfo , result ) ) {
188+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
184189 result = await MarketplaceItem . addTag ( result , req . params . tagId ) ;
185190 if ( isNil ( result ) ) {
186191 return next ( error . createNotFound ( ) ) ;
@@ -202,7 +207,7 @@ const addTag = asyncHandler(async (req, res, next) => {
202207const deleteTag = asyncHandler ( async ( req , res , next ) => {
203208 try {
204209 let result = await MarketplaceItem . get ( req . params . itemId ) ;
205- if ( checkReadPermission ( req . userInfo , result ) ) {
210+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
206211 result = await MarketplaceItem . deleteTag ( result , req . params . tagId ) ;
207212 if ( isNil ( result ) ) {
208213 return next ( error . createNotFound ( ) ) ;
@@ -223,14 +228,13 @@ const deleteTag = asyncHandler(async (req, res, next) => {
223228
224229const listCategories = asyncHandler ( async ( req , res , next ) => {
225230 try {
226- let result = await MarketplaceItem . get ( req . params . itemId ) ;
227- if ( checkReadPermission ( req . userInfo , result ) ) {
228- result = await MarketplaceItem . getCategories ( result ) ;
229- if ( isNil ( result ) ) {
230- return next ( error . createNotFound ( ) ) ;
231- } else {
232- res . status ( 200 ) . json ( result ) ;
233- }
231+ const result = await MarketplaceItem . get ( req . params . itemId ) ;
232+ const categories = await MarketplaceItem . getCategories ( result ) ;
233+ if ( isNil ( result ) ) {
234+ return next ( error . createNotFound ( ) ) ;
235+ }
236+ if ( await checkReadPermission ( req . userInfo , result , categories ) ) {
237+ res . status ( 200 ) . json ( categories ) ;
234238 } else {
235239 return next (
236240 error . createForbidden (
@@ -246,7 +250,18 @@ const listCategories = asyncHandler(async (req, res, next) => {
246250const addCategory = asyncHandler ( async ( req , res , next ) => {
247251 try {
248252 let result = await MarketplaceItem . get ( req . params . itemId ) ;
249- if ( checkReadPermission ( req . userInfo , result ) ) {
253+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
254+ const category = await ItemCategory . get ( req . params . categoryId ) ;
255+ if (
256+ category . name === ItemCategory . OFFICIAL_EXAMPLE &&
257+ req . tokenInfo . admin !== true
258+ ) {
259+ return next (
260+ error . createForbidden (
261+ `Only admin can set "${ ItemCategory . OFFICIAL_EXAMPLE } " category.` ,
262+ ) ,
263+ ) ;
264+ }
250265 result = await MarketplaceItem . addCategory ( result , req . params . categoryId ) ;
251266 if ( isNil ( result ) ) {
252267 return next ( error . createNotFound ( ) ) ;
@@ -268,7 +283,7 @@ const addCategory = asyncHandler(async (req, res, next) => {
268283const deleteCategory = asyncHandler ( async ( req , res , next ) => {
269284 try {
270285 let result = await MarketplaceItem . get ( req . params . itemId ) ;
271- if ( checkReadPermission ( req . userInfo , result ) ) {
286+ if ( await checkWritePermission ( req . tokenInfo , result ) ) {
272287 result = await MarketplaceItem . deleteCategory (
273288 result ,
274289 req . params . categoryId ,
0 commit comments