data.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* snac - A simple, minimalistic ActivityPub instance */
  2. /* copyright (c) 2022 grunfink - MIT license */
  3. #include "xs.h"
  4. #include "xs_io.h"
  5. #include "xs_json.h"
  6. #include "snac.h"
  7. int srv_open(char *basedir)
  8. /* opens a server */
  9. {
  10. int ret = 0;
  11. xs *cfg_file = NULL;
  12. FILE *f;
  13. srv_basedir = xs_str_new(basedir);
  14. cfg_file = xs_fmt("%s/server.json", basedir);
  15. if ((f = fopen(cfg_file, "r")) == NULL)
  16. srv_log(xs_fmt("error opening '%s'", cfg_file));
  17. else {
  18. xs *cfg_data;
  19. /* read full config file */
  20. cfg_data = xs_readall(f);
  21. /* parse */
  22. srv_config = xs_json_loads(cfg_data);
  23. if (srv_config == NULL)
  24. srv_log(xs_fmt("cannot parse '%s'", cfg_file));
  25. else {
  26. char *host;
  27. char *prefix;
  28. char *dbglvl;
  29. host = xs_dict_get(srv_config, "host");
  30. prefix = xs_dict_get(srv_config, "prefix");
  31. dbglvl = xs_dict_get(srv_config, "dbglevel");
  32. if (host == NULL || prefix == NULL)
  33. srv_log(xs_str_new("cannot get server data"));
  34. else {
  35. srv_baseurl = xs_fmt("https://%s%s", host, prefix);
  36. dbglevel = (int) xs_number_get(dbglvl);
  37. if ((dbglvl = getenv("DEBUG")) != NULL) {
  38. dbglevel = atoi(dbglvl);
  39. srv_log(xs_fmt("DEBUG level set to %d from environment", dbglevel));
  40. }
  41. ret = 1;
  42. }
  43. }
  44. }
  45. return ret;
  46. }
  47. void snac_free(snac *snac)
  48. /* frees a user snac */
  49. {
  50. free(snac->uid);
  51. free(snac->basedir);
  52. free(snac->config);
  53. free(snac->key);
  54. free(snac->actor);
  55. }
  56. int user_open(snac *snac, char *uid)
  57. /* opens a user */
  58. {
  59. int ret = 0;
  60. memset(snac, '\0', sizeof(struct _snac));
  61. if (validate_uid(uid)) {
  62. xs *cfg_file;
  63. FILE *f;
  64. snac->uid = xs_str_new(uid);
  65. snac->basedir = xs_fmt("%s/user/%s", srv_basedir, uid);
  66. cfg_file = xs_fmt("%s/user.json", snac->basedir);
  67. if ((f = fopen(cfg_file, "r")) != NULL) {
  68. xs *cfg_data;
  69. /* read full config file */
  70. cfg_data = xs_readall(f);
  71. fclose(f);
  72. if ((snac->config = xs_json_loads(cfg_data)) != NULL) {
  73. xs *key_file = xs_fmt("%s/key.json", snac->basedir);
  74. if ((f = fopen(key_file, "r")) != NULL) {
  75. xs *key_data;
  76. key_data = xs_readall(f);
  77. fclose(f);
  78. if ((snac->key = xs_json_loads(key_data)) != NULL) {
  79. snac->actor = xs_fmt("%s/%s", srv_baseurl, uid);
  80. ret = 1;
  81. }
  82. else
  83. srv_log(xs_fmt("cannot parse '%s'", key_file));
  84. }
  85. else
  86. srv_log(xs_fmt("error opening '%s'", key_file));
  87. }
  88. else
  89. srv_log(xs_fmt("cannot parse '%s'", cfg_file));
  90. }
  91. else
  92. srv_log(xs_fmt("error opening '%s'", cfg_file));
  93. }
  94. else
  95. srv_log(xs_fmt("invalid user '%s'", uid));
  96. if (!ret)
  97. snac_free(snac);
  98. return ret;
  99. }