Differences From
Artifact [56f7ddd740]:
282 282 elseif path.ct == 1 then
283 283 lib.render.docpage(co, rstring.null())
284 284 else
285 285 co:complain(404, 'no such documentation', 'invalid documentation URL')
286 286 end
287 287 end
288 288
289 -terra http.tweet_page(co: &lib.srv.convo, path: hpath, meth: method.t)
289 +terra http.tweet_page(co: &lib.srv.convo, path: hpath)
290 290 var pid, ok = lib.math.shorthand.parse(path(1).ptr, path(1).ct)
291 291 if not ok then
292 292 co:complain(400, 'bad post ID', 'that post ID is not valid')
293 293 return
294 294 end
295 295 var post = co.srv:post_fetch(pid)
296 296 var rt: lib.store.notice
................................................................................
306 306 end
307 307 defer post:free() -- NOP on null
308 308
309 309 if path.ct == 3 then
310 310 var lnk: lib.str.acc lnk:compose('/post/', path(1))
311 311 var lnkp = lnk:finalize() defer lnkp:free()
312 312 if post:ref() and path(2):cmp(lib.str.lit 'snitch') then
313 - if meth_get(meth) then
313 + if meth_get(co.method) then
314 314 var ui = data.view.report {
315 315 badtweet = lib.render.tweet(co, post.ptr, nil);
316 316 clnk = lnkp;
317 317 }
318 318
319 319 co:stdpage([lib.srv.convo.page] {
320 320 title = 'post :: report';
................................................................................
326 326 end
327 327 return
328 328 elseif post:ref() and post(0).author ~= co.who.id then
329 329 co:complain(403, 'forbidden', 'you cannot alter other people\'s posts')
330 330 return
331 331 elseif post:ref() and path(2):cmp(lib.str.lit 'edit') then
332 332 if not co:assertpow('edit') then return end
333 - if meth_get(meth) then
333 + if meth_get(co.method) then
334 334 lib.render.compose(co, post.ptr, nil)
335 335 return
336 - elseif meth == method.post then
336 + elseif co.method == method.post then
337 337 var newbody = co:postv('post')._0
338 338 var newacl = co:postv('acl')._0
339 339 var newsubj = co:postv('subject')._0
340 340 if newbody ~= nil then post(0).body = newbody end
341 341 if newacl ~= nil then post(0).acl = newacl end
342 342 if newsubj ~= nil then post(0).subject = newsubj end
343 343 post(0):save(true)
344 344 co:reroute(lnkp.ptr)
345 345 end
346 346 return
347 347 elseif path(2):cmp(lib.str.lit 'del') then
348 - if meth_get(meth) then
348 + if meth_get(co.method) then
349 349 var conf: data.view.confirm
350 350 if post:ref() then
351 351 conf = data.view.confirm {
352 - title = 'delete post';
353 - query = 'are you sure you want to delete this post?';
352 + title = 'delete post';
353 + query = 'are you sure you want to delete this post?';
354 354 cancel = lnkp
355 355 }
356 356 else
357 357 conf = data.view.confirm {
358 - title = 'cancel retweet';
359 - query = 'are you sure you want to undo this retweet?';
358 + title = 'cancel retweet';
359 + query = 'are you sure you want to undo this retweet?';
360 360 cancel = '/';
361 361 }
362 362 end
363 363 var body = conf:poolstr(&co.srv.pool) --defer body:free()
364 364 co:stdpage([lib.srv.convo.page] {
365 - title = 'post :: delete';
366 - class = 'query';
365 + title = 'post :: delete';
366 + class = 'query';
367 367 body = body; cache = false;
368 368 })
369 369 return
370 - elseif meth == method.post then
370 + elseif co.method == method.post then
371 371 var act = co:ppostv('act')
372 372 if act:cmp('confirm') then
373 373 if post:ref() then
374 374 post().source:post_destroy(post().id)
375 375 elseif rt.kind ~= 0 then
376 376 co.srv:post_act_cancel(pid)
377 377 end
................................................................................
378 378 co:reroute('/') -- TODO maybe return to parent or conversation if possible
379 379 return
380 380 else goto badop end
381 381 end
382 382 else goto badurl end
383 383 end
384 384
385 - if post:ref() and meth == method.post then
385 + if post:ref() and co.method == method.post then
386 386 if co.aid == 0 then goto noauth end
387 387 var act = co:ppostv('act')
388 - if act:cmp( 'like') and not co.srv:post_liked_uid(co.who.id,pid) then
388 + if act:cmp('like') and not co.srv:post_liked_uid(co.who.id,pid) then
389 389 co.srv:post_like(co.who.id, pid, false)
390 390 post.ptr.likes = post.ptr.likes + 1
391 - elseif act:cmp( 'dislike') and co.srv:post_liked_uid(co.who.id,pid) then
391 + elseif act:cmp('dislike') and co.srv:post_liked_uid(co.who.id,pid) then
392 392 co.srv:post_like(co.who.id, pid, true)
393 393 post.ptr.likes = post.ptr.likes - 1
394 - elseif act:cmp( 'rt') then
394 + elseif act:cmp('rt') then
395 395 co.srv:post_retweet(co.who.id, pid, false)
396 396 post.ptr.rts = post.ptr.rts + 1
397 - elseif act:cmp( 'post') then
397 + elseif act:cmp('post') then
398 398 var replytext = co:ppostv('post')
399 399 var acl = co:ppostv('acl')
400 400 var subj = co:ppostv('subject')
401 - if not acl then acl = 'all' end
401 + if not acl then acl = 'all' end
402 402 if not replytext then goto badop end
403 403
404 404 var reply = lib.store.post {
405 405 author = co.who.id, parent = pid;
406 406 subject = subj.ptr, acl = acl.ptr, body = replytext.ptr;
407 407 }
408 408
409 409 reply:publish(co.srv)
410 410 else goto badop end
411 411 end
412 412
413 413 if not post then goto badurl end
414 414
415 - lib.render.tweet_page(co, path, post.ptr)
415 + if co:matchmime(lib.http.mime.html) then
416 + lib.render.tweet_page(co, path, post.ptr)
417 + elseif co:matchmime(lib.http.mime.json) then
418 + co:json(lib.api.lp.tweet(co, post.ptr, false))
419 + else goto notacc end
416 420 do return end
417 421
418 422 ::noauth:: do co:fail(401) return end
419 423 ::badurl:: do co:fail(404) return end
420 424 ::badop :: do co:fail(405) return end
425 + ::notacc:: do co:fail(406) return end
421 426 end
422 427
423 428 local terra
424 429 credsec_for_uid(co: &lib.srv.convo, uid: uint64)
425 430 var act = co:ppostv('act')
426 431 if not act then return true end
427 432 lib.dbg('handling credential action')
................................................................................
465 470 var fr = co.srv.pool:frame()
466 471 var hmac = lib.crypt.hmacp(&co.srv.pool, lib.crypt.alg.sha256, co.srv.cfg.secret:blob(), nonce)
467 472 if not lib.math.truncate64(hmac.ptr, hmac.ct) == noncevld then
468 473 co:complain(403,'nice try','what exactly are you trying to accomplish here, buddy')
469 474 return false
470 475 end
471 476
472 - var pkres = lib.crypt.loadpub(rsapub.ptr,rsapub.ct+1) -- needs NUL
477 + var pkres = lib.crypt.loadpub(binblob{rsapub.ptr,rsapub.ct+1}) -- needs NUL
473 478 if not pkres.ok then
474 479 co:complain(400,'invalid key','the key you have supplied is not a valid PEM or DER file')
475 480 return false
476 481 end
477 482 var pk = pkres.val
478 483 defer pk:free()
479 484
................................................................................
972 977 else co:reroute_cookie('/','auth=; Path=/')
973 978 end
974 979 else -- hierarchical routes
975 980 var path = lib.http.hier(&co.srv.pool, uri) --defer path:free()
976 981 if path.ct > 1 and path(0):cmp('user') then
977 982 http.actor_profile_uid(co, path)
978 983 elseif path.ct > 1 and path(0):cmp('post') then
979 - http.tweet_page(co, path, meth)
984 + http.tweet_page(co, path)
980 985 elseif path(0):cmp('tl') then
981 986 http.timeline(co, path)
982 987 elseif path(0):cmp('.well-known') then
983 988 if path(1):cmp('webfinger') then
984 989 if not co:matchmime(lib.http.mime.json) then goto nacc end
985 990 lib.api.webfinger(co)
986 991 end