Mercurial > paster
annotate page-search.c @ 64:e8d8eaa0da53
pasterd: support <title> in header
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 26 May 2022 13:28:10 +0200 |
parents | ecb0b90d94d8 |
children | 1a98bc0daa49 |
rev | line source |
---|---|
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * page-search.c -- page /search |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
60
ecb0b90d94d8
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <sys/types.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <assert.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdarg.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <stddef.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <stdint.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <string.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <kcgi.h> |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include "database.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include "fragment-language.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "page-index.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "page-search.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include "page.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include "paste.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #include "util.h" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 static const char *keywords[] = { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 "languages" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 }; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 static int |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 template(size_t keyword, void *arg) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 struct kreq *r = arg; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 switch (keyword) { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 case 0: |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 for (size_t i = 0; i < languagesz; ++i) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 fragment_language(r, languages[i], false); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 break; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 default: |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 break; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 return 1; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 static void |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 get(struct kreq *r) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 struct ktemplate kt = { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 .key = keywords, |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 .keysz = NELEM(keywords), |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 .cb = template, |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 .arg = r |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 }; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
64
e8d8eaa0da53
pasterd: support <title> in header
David Demelier <markand@malikania.fr>
parents:
60
diff
changeset
|
67 page(r, &kt, KHTTP_200, "pages/search.html", "Search pastes"); |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 static void |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 post(struct kreq *r) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 struct paste pastes[10] = {0}; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 size_t pastesz = NELEM(pastes); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 const char *title = NULL; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 const char *author = NULL; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 const char *language = NULL; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 for (size_t i = 0; i < r->fieldsz; ++i) { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 const char *key = r->fields[i].key; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 const char *val = r->fields[i].val; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 if (strcmp(key, "title") == 0) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 title = val; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 else if (strcmp(key, "author") == 0) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 author = val; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 else if (strcmp(key, "language") == 0) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 language = val; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 /* Sets to null if they are empty. */ |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 if (title && strlen(title) == 0) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 title = NULL; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 if (author && strlen(author) == 0) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 author = NULL; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 if (!database_search(pastes, &pastesz, title, author, language)) |
64
e8d8eaa0da53
pasterd: support <title> in header
David Demelier <markand@malikania.fr>
parents:
60
diff
changeset
|
98 page(r, NULL, KHTTP_500, "pages/500.html", "500"); |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 else |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 page_index_render(r, pastes, pastesz); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 for (size_t i = 0; i < pastesz; ++i) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 paste_finish(&pastes[i]); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 void |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 page_search(struct kreq *r) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 assert(r); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 switch (r->method) { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 case KMETHOD_GET: |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 get(r); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 break; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 case KMETHOD_POST: |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 post(r); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 break; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 default: |
64
e8d8eaa0da53
pasterd: support <title> in header
David Demelier <markand@malikania.fr>
parents:
60
diff
changeset
|
119 page(r, NULL, KHTTP_400, "pages/400.html", "400"); |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 break; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 } |