Fossil SCM
Reorganized json_page_artifact(), fixed a C99ism, fixed permissions check.
Commit
c9261700345bb9fcf68198b08520da70c6aceeeb
Parent
f270f0b5c1f253b…
1 file changed
+31
-27
+31
-27
| --- src/json_artifact.c | ||
| +++ src/json_artifact.c | ||
| @@ -170,11 +170,12 @@ | ||
| 170 | 170 | {"wiki", NULL, perms_can_read}, |
| 171 | 171 | {NULL,NULL,NULL} |
| 172 | 172 | }; |
| 173 | 173 | |
| 174 | 174 | /* |
| 175 | -** Impl of /json/artifact | |
| 175 | +** Impl of /json/artifact. This basically just determines the type of | |
| 176 | +** an artifact and forwards the real work to another function. | |
| 176 | 177 | */ |
| 177 | 178 | cson_value * json_page_artifact(){ |
| 178 | 179 | cson_value * payV = NULL; |
| 179 | 180 | cson_object * pay = NULL; |
| 180 | 181 | char const * zName = NULL; |
| @@ -181,10 +182,11 @@ | ||
| 181 | 182 | char const * zType = NULL; |
| 182 | 183 | char const * zUuid = NULL; |
| 183 | 184 | Blob uuid = empty_blob; |
| 184 | 185 | int rc; |
| 185 | 186 | int rid; |
| 187 | + ArtifactDispatchEntry const * dispatcher = &ArtifactDispatchList[0]; | |
| 186 | 188 | zName = g.isHTTP |
| 187 | 189 | ? json_getenv_cstr("uuid") |
| 188 | 190 | : find_option("uuid","u",1); |
| 189 | 191 | if(!zName||!*zName){ |
| 190 | 192 | zName = json_command_arg(g.json.dispatchDepth+1); |
| @@ -195,15 +197,15 @@ | ||
| 195 | 197 | } |
| 196 | 198 | |
| 197 | 199 | if( validate16(zName, strlen(zName)) ){ |
| 198 | 200 | if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%q*'", zName) ){ |
| 199 | 201 | zType = "ticket"; |
| 200 | - goto end_ok; | |
| 202 | + goto handle_entry; | |
| 201 | 203 | } |
| 202 | 204 | if( db_exists("SELECT 1 FROM tag WHERE tagname GLOB 'event-%q*'", zName) ){ |
| 203 | 205 | zType = "tag"; |
| 204 | - goto end_ok; | |
| 206 | + goto handle_entry; | |
| 205 | 207 | } |
| 206 | 208 | } |
| 207 | 209 | blob_set(&uuid,zName); |
| 208 | 210 | rc = name_to_uuid(&uuid,-1,"*"); |
| 209 | 211 | if(1==rc){ |
| @@ -221,56 +223,58 @@ | ||
| 221 | 223 | } |
| 222 | 224 | if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) |
| 223 | 225 | || db_exists("SELECT 1 FROM plink WHERE cid=%d", rid) |
| 224 | 226 | || db_exists("SELECT 1 FROM plink WHERE pid=%d", rid)){ |
| 225 | 227 | zType = "checkin"; |
| 226 | - goto end_ok; | |
| 228 | + goto handle_entry; | |
| 227 | 229 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 228 | 230 | " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){ |
| 229 | 231 | zType = "wiki"; |
| 230 | - goto end_ok; | |
| 232 | + goto handle_entry; | |
| 231 | 233 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 232 | 234 | " WHERE rid=%d AND tagname LIKE 'tkt-%%'", rid) ){ |
| 233 | 235 | zType = "ticket"; |
| 234 | - goto end_ok; | |
| 236 | + goto handle_entry; | |
| 235 | 237 | }else{ |
| 236 | 238 | g.json.resultCode = FSL_JSON_E_RESOURCE_NOT_FOUND; |
| 237 | 239 | goto error; |
| 238 | 240 | } |
| 239 | 241 | |
| 240 | 242 | error: |
| 241 | 243 | assert( 0 != g.json.resultCode ); |
| 242 | 244 | goto veryend; |
| 243 | 245 | |
| 244 | - end_ok: | |
| 245 | - payV = cson_value_new_object(); | |
| 246 | - pay = cson_value_get_object(payV); | |
| 247 | - assert( NULL != zType ); | |
| 248 | - cson_object_set( pay, "type", json_new_string(zType) ); | |
| 249 | - /*cson_object_set( pay, "uuid", json_new_string(zUuid) );*/ | |
| 250 | - cson_object_set( pay, "name", json_new_string(zName ? zName : zUuid) ); | |
| 251 | - cson_object_set( pay, "rid", cson_value_new_integer(rid) ); | |
| 252 | - ArtifactDispatchEntry const * disp = &ArtifactDispatchList[0]; | |
| 253 | - for( ; disp->name; ++disp ){ | |
| 254 | - if(0!=strcmp(disp->name, zType)){ | |
| 246 | + handle_entry: | |
| 247 | + assert( (NULL != zType) && "Internal dispatching error." ); | |
| 248 | + for( ; dispatcher->name; ++dispatcher ){ | |
| 249 | + if(0!=strcmp(dispatcher->name, zType)){ | |
| 255 | 250 | continue; |
| 256 | 251 | }else{ |
| 257 | - cson_value * entry; | |
| 258 | - if( ! (*disp->permCheck)() ){ | |
| 259 | - break; | |
| 260 | - } | |
| 261 | - entry = (*disp->func)(rid); | |
| 262 | - if(entry){ | |
| 263 | - cson_object_set(pay, "artifact", entry); | |
| 252 | + if( ! (*dispatcher->permCheck)() ){ | |
| 253 | + g.json.resultCode = FSL_JSON_E_DENIED; | |
| 264 | 254 | } |
| 265 | 255 | break; |
| 266 | 256 | } |
| 267 | 257 | } |
| 268 | - if( !disp->name ){ | |
| 269 | - cson_object_set(pay,"artifact", | |
| 270 | - json_new_string("TODO: handle this artifact type!")); | |
| 258 | + if(!g.json.resultCode){ | |
| 259 | + payV = cson_value_new_object(); | |
| 260 | + pay = cson_value_get_object(payV); | |
| 261 | + assert( NULL != zType ); | |
| 262 | + cson_object_set( pay, "type", json_new_string(zType) ); | |
| 263 | + /*cson_object_set( pay, "uuid", json_new_string(zUuid) );*/ | |
| 264 | + cson_object_set( pay, "name", json_new_string(zName ? zName : zUuid) ); | |
| 265 | + cson_object_set( pay, "rid", cson_value_new_integer(rid) ); | |
| 266 | + if( !dispatcher->name ){ | |
| 267 | + cson_object_set(pay,"artifact", | |
| 268 | + json_new_string("TODO: handle this artifact type!")); | |
| 269 | + }else { | |
| 270 | + cson_value * entry = (*dispatcher->func)(rid); | |
| 271 | + if(entry){ | |
| 272 | + cson_object_set(pay, "artifact", entry); | |
| 273 | + } | |
| 274 | + } | |
| 271 | 275 | } |
| 272 | 276 | veryend: |
| 273 | 277 | blob_reset(&uuid); |
| 274 | 278 | return payV; |
| 275 | 279 | } |
| 276 | 280 | |
| 277 | 281 |
| --- src/json_artifact.c | |
| +++ src/json_artifact.c | |
| @@ -170,11 +170,12 @@ | |
| 170 | {"wiki", NULL, perms_can_read}, |
| 171 | {NULL,NULL,NULL} |
| 172 | }; |
| 173 | |
| 174 | /* |
| 175 | ** Impl of /json/artifact |
| 176 | */ |
| 177 | cson_value * json_page_artifact(){ |
| 178 | cson_value * payV = NULL; |
| 179 | cson_object * pay = NULL; |
| 180 | char const * zName = NULL; |
| @@ -181,10 +182,11 @@ | |
| 181 | char const * zType = NULL; |
| 182 | char const * zUuid = NULL; |
| 183 | Blob uuid = empty_blob; |
| 184 | int rc; |
| 185 | int rid; |
| 186 | zName = g.isHTTP |
| 187 | ? json_getenv_cstr("uuid") |
| 188 | : find_option("uuid","u",1); |
| 189 | if(!zName||!*zName){ |
| 190 | zName = json_command_arg(g.json.dispatchDepth+1); |
| @@ -195,15 +197,15 @@ | |
| 195 | } |
| 196 | |
| 197 | if( validate16(zName, strlen(zName)) ){ |
| 198 | if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%q*'", zName) ){ |
| 199 | zType = "ticket"; |
| 200 | goto end_ok; |
| 201 | } |
| 202 | if( db_exists("SELECT 1 FROM tag WHERE tagname GLOB 'event-%q*'", zName) ){ |
| 203 | zType = "tag"; |
| 204 | goto end_ok; |
| 205 | } |
| 206 | } |
| 207 | blob_set(&uuid,zName); |
| 208 | rc = name_to_uuid(&uuid,-1,"*"); |
| 209 | if(1==rc){ |
| @@ -221,56 +223,58 @@ | |
| 221 | } |
| 222 | if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) |
| 223 | || db_exists("SELECT 1 FROM plink WHERE cid=%d", rid) |
| 224 | || db_exists("SELECT 1 FROM plink WHERE pid=%d", rid)){ |
| 225 | zType = "checkin"; |
| 226 | goto end_ok; |
| 227 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 228 | " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){ |
| 229 | zType = "wiki"; |
| 230 | goto end_ok; |
| 231 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 232 | " WHERE rid=%d AND tagname LIKE 'tkt-%%'", rid) ){ |
| 233 | zType = "ticket"; |
| 234 | goto end_ok; |
| 235 | }else{ |
| 236 | g.json.resultCode = FSL_JSON_E_RESOURCE_NOT_FOUND; |
| 237 | goto error; |
| 238 | } |
| 239 | |
| 240 | error: |
| 241 | assert( 0 != g.json.resultCode ); |
| 242 | goto veryend; |
| 243 | |
| 244 | end_ok: |
| 245 | payV = cson_value_new_object(); |
| 246 | pay = cson_value_get_object(payV); |
| 247 | assert( NULL != zType ); |
| 248 | cson_object_set( pay, "type", json_new_string(zType) ); |
| 249 | /*cson_object_set( pay, "uuid", json_new_string(zUuid) );*/ |
| 250 | cson_object_set( pay, "name", json_new_string(zName ? zName : zUuid) ); |
| 251 | cson_object_set( pay, "rid", cson_value_new_integer(rid) ); |
| 252 | ArtifactDispatchEntry const * disp = &ArtifactDispatchList[0]; |
| 253 | for( ; disp->name; ++disp ){ |
| 254 | if(0!=strcmp(disp->name, zType)){ |
| 255 | continue; |
| 256 | }else{ |
| 257 | cson_value * entry; |
| 258 | if( ! (*disp->permCheck)() ){ |
| 259 | break; |
| 260 | } |
| 261 | entry = (*disp->func)(rid); |
| 262 | if(entry){ |
| 263 | cson_object_set(pay, "artifact", entry); |
| 264 | } |
| 265 | break; |
| 266 | } |
| 267 | } |
| 268 | if( !disp->name ){ |
| 269 | cson_object_set(pay,"artifact", |
| 270 | json_new_string("TODO: handle this artifact type!")); |
| 271 | } |
| 272 | veryend: |
| 273 | blob_reset(&uuid); |
| 274 | return payV; |
| 275 | } |
| 276 | |
| 277 |
| --- src/json_artifact.c | |
| +++ src/json_artifact.c | |
| @@ -170,11 +170,12 @@ | |
| 170 | {"wiki", NULL, perms_can_read}, |
| 171 | {NULL,NULL,NULL} |
| 172 | }; |
| 173 | |
| 174 | /* |
| 175 | ** Impl of /json/artifact. This basically just determines the type of |
| 176 | ** an artifact and forwards the real work to another function. |
| 177 | */ |
| 178 | cson_value * json_page_artifact(){ |
| 179 | cson_value * payV = NULL; |
| 180 | cson_object * pay = NULL; |
| 181 | char const * zName = NULL; |
| @@ -181,10 +182,11 @@ | |
| 182 | char const * zType = NULL; |
| 183 | char const * zUuid = NULL; |
| 184 | Blob uuid = empty_blob; |
| 185 | int rc; |
| 186 | int rid; |
| 187 | ArtifactDispatchEntry const * dispatcher = &ArtifactDispatchList[0]; |
| 188 | zName = g.isHTTP |
| 189 | ? json_getenv_cstr("uuid") |
| 190 | : find_option("uuid","u",1); |
| 191 | if(!zName||!*zName){ |
| 192 | zName = json_command_arg(g.json.dispatchDepth+1); |
| @@ -195,15 +197,15 @@ | |
| 197 | } |
| 198 | |
| 199 | if( validate16(zName, strlen(zName)) ){ |
| 200 | if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%q*'", zName) ){ |
| 201 | zType = "ticket"; |
| 202 | goto handle_entry; |
| 203 | } |
| 204 | if( db_exists("SELECT 1 FROM tag WHERE tagname GLOB 'event-%q*'", zName) ){ |
| 205 | zType = "tag"; |
| 206 | goto handle_entry; |
| 207 | } |
| 208 | } |
| 209 | blob_set(&uuid,zName); |
| 210 | rc = name_to_uuid(&uuid,-1,"*"); |
| 211 | if(1==rc){ |
| @@ -221,56 +223,58 @@ | |
| 223 | } |
| 224 | if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) |
| 225 | || db_exists("SELECT 1 FROM plink WHERE cid=%d", rid) |
| 226 | || db_exists("SELECT 1 FROM plink WHERE pid=%d", rid)){ |
| 227 | zType = "checkin"; |
| 228 | goto handle_entry; |
| 229 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 230 | " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){ |
| 231 | zType = "wiki"; |
| 232 | goto handle_entry; |
| 233 | }else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" |
| 234 | " WHERE rid=%d AND tagname LIKE 'tkt-%%'", rid) ){ |
| 235 | zType = "ticket"; |
| 236 | goto handle_entry; |
| 237 | }else{ |
| 238 | g.json.resultCode = FSL_JSON_E_RESOURCE_NOT_FOUND; |
| 239 | goto error; |
| 240 | } |
| 241 | |
| 242 | error: |
| 243 | assert( 0 != g.json.resultCode ); |
| 244 | goto veryend; |
| 245 | |
| 246 | handle_entry: |
| 247 | assert( (NULL != zType) && "Internal dispatching error." ); |
| 248 | for( ; dispatcher->name; ++dispatcher ){ |
| 249 | if(0!=strcmp(dispatcher->name, zType)){ |
| 250 | continue; |
| 251 | }else{ |
| 252 | if( ! (*dispatcher->permCheck)() ){ |
| 253 | g.json.resultCode = FSL_JSON_E_DENIED; |
| 254 | } |
| 255 | break; |
| 256 | } |
| 257 | } |
| 258 | if(!g.json.resultCode){ |
| 259 | payV = cson_value_new_object(); |
| 260 | pay = cson_value_get_object(payV); |
| 261 | assert( NULL != zType ); |
| 262 | cson_object_set( pay, "type", json_new_string(zType) ); |
| 263 | /*cson_object_set( pay, "uuid", json_new_string(zUuid) );*/ |
| 264 | cson_object_set( pay, "name", json_new_string(zName ? zName : zUuid) ); |
| 265 | cson_object_set( pay, "rid", cson_value_new_integer(rid) ); |
| 266 | if( !dispatcher->name ){ |
| 267 | cson_object_set(pay,"artifact", |
| 268 | json_new_string("TODO: handle this artifact type!")); |
| 269 | }else { |
| 270 | cson_value * entry = (*dispatcher->func)(rid); |
| 271 | if(entry){ |
| 272 | cson_object_set(pay, "artifact", entry); |
| 273 | } |
| 274 | } |
| 275 | } |
| 276 | veryend: |
| 277 | blob_reset(&uuid); |
| 278 | return payV; |
| 279 | } |
| 280 | |
| 281 |