Fossil SCM

Reorganized json_page_artifact(), fixed a C99ism, fixed permissions check.

stephan 2011-10-02 11:16 UTC json-multitag-test
Commit c9261700345bb9fcf68198b08520da70c6aceeeb
1 file changed +31 -27
--- src/json_artifact.c
+++ src/json_artifact.c
@@ -170,11 +170,12 @@
170170
{"wiki", NULL, perms_can_read},
171171
{NULL,NULL,NULL}
172172
};
173173
174174
/*
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.
176177
*/
177178
cson_value * json_page_artifact(){
178179
cson_value * payV = NULL;
179180
cson_object * pay = NULL;
180181
char const * zName = NULL;
@@ -181,10 +182,11 @@
181182
char const * zType = NULL;
182183
char const * zUuid = NULL;
183184
Blob uuid = empty_blob;
184185
int rc;
185186
int rid;
187
+ ArtifactDispatchEntry const * dispatcher = &ArtifactDispatchList[0];
186188
zName = g.isHTTP
187189
? json_getenv_cstr("uuid")
188190
: find_option("uuid","u",1);
189191
if(!zName||!*zName){
190192
zName = json_command_arg(g.json.dispatchDepth+1);
@@ -195,15 +197,15 @@
195197
}
196198
197199
if( validate16(zName, strlen(zName)) ){
198200
if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%q*'", zName) ){
199201
zType = "ticket";
200
- goto end_ok;
202
+ goto handle_entry;
201203
}
202204
if( db_exists("SELECT 1 FROM tag WHERE tagname GLOB 'event-%q*'", zName) ){
203205
zType = "tag";
204
- goto end_ok;
206
+ goto handle_entry;
205207
}
206208
}
207209
blob_set(&uuid,zName);
208210
rc = name_to_uuid(&uuid,-1,"*");
209211
if(1==rc){
@@ -221,56 +223,58 @@
221223
}
222224
if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid)
223225
|| db_exists("SELECT 1 FROM plink WHERE cid=%d", rid)
224226
|| db_exists("SELECT 1 FROM plink WHERE pid=%d", rid)){
225227
zType = "checkin";
226
- goto end_ok;
228
+ goto handle_entry;
227229
}else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
228230
" WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
229231
zType = "wiki";
230
- goto end_ok;
232
+ goto handle_entry;
231233
}else if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
232234
" WHERE rid=%d AND tagname LIKE 'tkt-%%'", rid) ){
233235
zType = "ticket";
234
- goto end_ok;
236
+ goto handle_entry;
235237
}else{
236238
g.json.resultCode = FSL_JSON_E_RESOURCE_NOT_FOUND;
237239
goto error;
238240
}
239241
240242
error:
241243
assert( 0 != g.json.resultCode );
242244
goto veryend;
243245
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)){
255250
continue;
256251
}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;
264254
}
265255
break;
266256
}
267257
}
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
+ }
271275
}
272276
veryend:
273277
blob_reset(&uuid);
274278
return payV;
275279
}
276280
277281
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button