data.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. #include <glob.h>
  8. int srv_open(char *basedir)
  9. /* opens a server */
  10. {
  11. int ret = 0;
  12. xs *cfg_file = NULL;
  13. FILE *f;
  14. srv_basedir = xs_str_new(basedir);
  15. cfg_file = xs_fmt("%s/server.json", basedir);
  16. if ((f = fopen(cfg_file, "r")) == NULL)
  17. srv_log(xs_fmt("error opening '%s'", cfg_file));
  18. else {
  19. xs *cfg_data;
  20. /* read full config file */
  21. cfg_data = xs_readall(f);
  22. /* parse */
  23. srv_config = xs_json_loads(cfg_data);
  24. if (srv_config == NULL)
  25. srv_log(xs_fmt("cannot parse '%s'", cfg_file));
  26. else {
  27. char *host;
  28. char *prefix;
  29. char *dbglvl;
  30. host = xs_dict_get(srv_config, "host");
  31. prefix = xs_dict_get(srv_config, "prefix");
  32. dbglvl = xs_dict_get(srv_config, "dbglevel");
  33. if (host == NULL || prefix == NULL)
  34. srv_log(xs_str_new("cannot get server data"));
  35. else {
  36. srv_baseurl = xs_fmt("https://%s%s", host, prefix);
  37. dbglevel = (int) xs_number_get(dbglvl);
  38. if ((dbglvl = getenv("DEBUG")) != NULL) {
  39. dbglevel = atoi(dbglvl);
  40. srv_log(xs_fmt("DEBUG level set to %d from environment", dbglevel));
  41. }
  42. ret = 1;
  43. }
  44. }
  45. }
  46. return ret;
  47. }
  48. void user_free(snac *snac)
  49. /* frees a user snac */
  50. {
  51. free(snac->uid);
  52. free(snac->basedir);
  53. free(snac->config);
  54. free(snac->key);
  55. free(snac->actor);
  56. }
  57. int user_open(snac *snac, char *uid)
  58. /* opens a user */
  59. {
  60. int ret = 0;
  61. memset(snac, '\0', sizeof(struct _snac));
  62. if (validate_uid(uid)) {
  63. xs *cfg_file;
  64. FILE *f;
  65. snac->uid = xs_str_new(uid);
  66. snac->basedir = xs_fmt("%s/user/%s", srv_basedir, uid);
  67. cfg_file = xs_fmt("%s/user.json", snac->basedir);
  68. if ((f = fopen(cfg_file, "r")) != NULL) {
  69. xs *cfg_data;
  70. /* read full config file */
  71. cfg_data = xs_readall(f);
  72. fclose(f);
  73. if ((snac->config = xs_json_loads(cfg_data)) != NULL) {
  74. xs *key_file = xs_fmt("%s/key.json", snac->basedir);
  75. if ((f = fopen(key_file, "r")) != NULL) {
  76. xs *key_data;
  77. key_data = xs_readall(f);
  78. fclose(f);
  79. if ((snac->key = xs_json_loads(key_data)) != NULL) {
  80. snac->actor = xs_fmt("%s/%s", srv_baseurl, uid);
  81. ret = 1;
  82. }
  83. else
  84. srv_log(xs_fmt("cannot parse '%s'", key_file));
  85. }
  86. else
  87. srv_log(xs_fmt("error opening '%s'", key_file));
  88. }
  89. else
  90. srv_log(xs_fmt("cannot parse '%s'", cfg_file));
  91. }
  92. else
  93. srv_log(xs_fmt("error opening '%s'", cfg_file));
  94. }
  95. else
  96. srv_log(xs_fmt("invalid user '%s'", uid));
  97. if (!ret)
  98. user_free(snac);
  99. return ret;
  100. }
  101. d_char *user_list(void)
  102. /* returns the list of user ids */
  103. {
  104. d_char *list;
  105. xs *spec;
  106. glob_t globbuf;
  107. globbuf.gl_offs = 1;
  108. list = xs_list_new();
  109. spec = xs_fmt("%s/user/*", srv_basedir); /**/
  110. if (glob(spec, 0, NULL, &globbuf) == 0) {
  111. int n;
  112. char *p;
  113. for (n = 0; (p = globbuf.gl_pathv[n]) != NULL; n++) {
  114. if ((p = strrchr(p, '/')) != NULL)
  115. list = xs_list_append(list, p + 1);
  116. }
  117. }
  118. globfree(&globbuf);
  119. return list;
  120. }