Commit Graph

92 Commits

Author SHA1 Message Date
Xavier Del Campo Romero 2da827c9f8
Rely on make(1) 2023-07-06 02:45:35 +02:00
Xavier Del Campo Romero 9cc9d80008
WIP thumbnail 2023-07-06 02:45:26 +02:00
Xavier Del Campo Romero 74b7f7a902
cftw.c: Check errors from readdir(3)
According to POSIX.1-2017, applications are advised to assign errno(3)
to 0 before a call to readdir(3), and compare errno(3) after the call to
check for errors.
2023-07-06 01:56:43 +02:00
Xavier Del Campo Romero 36ff7d8143
main.c: Use ISO C99-compatible declaration for main
C99 §5.1.2.2.1 only defines the following declarations for main:

- int main(void)
- int main(int argc, char *argv[])

While the use of equivalent types (e.g.: char **argv) is allowed, const
char ** would not be considered equivalent, and thus an invalid
declaration depending on the implementation.
2023-07-06 00:56:27 +02:00
Xavier Del Campo Romero 640210a7f6
server.c: Fix typo 2023-07-06 00:42:12 +02:00
Xavier Del Campo Romero 7bd56e69dc
http.c: Accept resources with '&' or '?'
Otherwise, client requests to resources such as '/me & you', '/?' or
'/??preview=1' would fail.
2023-07-06 00:19:05 +02:00
Xavier Del Campo Romero 15c905f150
server.c: Fix undefined behaviour on >1 clients
server.c kept an array of all of its active clients, calling realloc(3)
everytime its size had to be modified. However, reallocating this array
had the undesired consequence of moving other active clients to other
memory locations.

Potentially, this would result in dangling pointers from other
components that also kept pointers to struct server_client instances
e.g.: handler.c.

For this reason, the array-based approach has been completely dropped,
in favour of a doubly-linked list.
2023-07-03 13:40:12 +02:00
Xavier Del Campo Romero 5a6c92d69b
Implement search
This new feature adds a HTML form on each directory listing that allows
to search files recursively, starting from the current user directory.
Wildcard patterns are also allowed.
2023-06-06 03:52:16 +02:00
Xavier Del Campo Romero 6e9ce3a25b
ctfw.c: Avoid trailing forward slash
Otherwise, this would generate strings such as "directory//resource" if
dirpath contained a trailing slash, which could be problematic for users
relying on ctfw.
2023-06-06 03:48:51 +02:00
Xavier Del Campo Romero 6adf1c44ad
wildcard_cmp.c: Fix a couple of bugs
wildcard_cmp would otherwise fail with the following use cases:

s = "mymi", p = "*mi*"
s = "mymi", p = "*mi"
2023-06-06 03:48:51 +02:00
Xavier Del Campo Romero 0d7ead4638
wildcard_cmp.c: Remove leftovers
These statements had no effect since it was always executed when
n == 0.
2023-06-06 03:48:51 +02:00
Xavier Del Campo Romero 6e5c001c28
wildcard_cmp: Allow case-insensitive searches
The new search feature will require them.
2023-06-06 03:48:50 +02:00
Xavier Del Campo Romero d4c8a8062f
Split wildcard_cmp into its own component
Future commits will make use of this function outside handler.c.
2023-06-06 03:48:50 +02:00
Xavier Del Campo Romero c4a3d54ac9
page.c: Apply minor fixes and improvements to stylesheet
- Rules applying to body already apply to input.
- input already had a "margin: auto" rule.
- Missing whitespace on "margin:auto" rule.
2023-06-06 03:48:36 +02:00
Xavier Del Campo Romero 3102e0da4b
page.c: Call page_not_found on ENOTDIR
ENOTDIR is another non-fatal errno value that can be returned by
stat(2).
2023-06-06 02:22:28 +02:00
Xavier Del Campo Romero 17502e7e32
page.c: Display login forms as grid
While commit 1ffba8f5 fixed a wrong display of the mkdir, upload and
logout forms, it did not take login forms into consideration, which must
displayed as grid.
2023-06-02 09:03:57 +02:00
Xavier Del Campo Romero 800dde6838
page.c: Add padding to mkdir, logout, and upload forms 2023-06-02 08:59:19 +02:00
Xavier Del Campo Romero 1ffba8f5f9
page.c: Do not display forms as grid
Otherwise, each element from the form would be stacked on top of
another, which is confusing to users.
2023-06-02 08:57:44 +02:00
Xavier Del Campo Romero 759a16a460
page.c: Apply max-width to table
This will help users to read tables with long file names.
2023-05-30 08:34:05 +02:00
Xavier Del Campo Romero 054f2a628d
page.c: Apply lightgray background to even cells
This will help users to navigate through large tables.
2023-05-30 08:16:06 +02:00
Xavier Del Campo Romero f1bf2fb684
auth.c: Fix wrong size check
Otherwise, sb.st_size + 1 would exceed SIZE_MAX.
2023-05-28 12:57:28 +02:00
Xavier Del Campo Romero 95a0adfe78
cftw.c: Add missing portability definition 2023-05-28 12:07:38 +02:00
Xavier Del Campo Romero f3178012f2
Makefile: Use dynstr's own Makefile
dynstr has been recently modified so as to allow building also from
make(1).
2023-05-28 12:07:38 +02:00
Xavier Del Campo Romero 20afa79038
usergen: Force newline after password input 2023-05-28 12:07:37 +02:00
Xavier Del Campo Romero 83b00b2cda
usergen: Do not print password to tty 2023-05-18 20:02:55 +02:00
Xavier Del Campo Romero 9c7a2e9128
Avoid crashing on SIGPIPE
Under some circumstances, clients could cause SIGPIPE to slcl. Since
this signal was not handled by server.c (i.e., via sigaction(3)), slcl
would crash without any error messages printed to stderr.

In such situation, SIGPIPE should not be usually considered a fatal
error, so it is preferrable to close the connection and keep working.
2023-05-01 04:13:25 +02:00
Xavier Del Campo Romero 7d1e41f9c5
http.c: Decode URL resource and parameters separately
Given the following contrived example request:

/example%FB%DC&arg%DE1=examplevalue%AA

slcl must decode each token separately, so that percent-encoded
characters '&', '=' or '?' do not get accidently intepreted.
2023-05-01 04:13:25 +02:00
Xavier Del Campo Romero 291d951ee1
usergen: Fix wrong password and username usage
Due to the lack of double quotes, passwords with whitespaces were not
passed correctly to printf(1), thus making users not able to log into
their account.

OTOH, for some reason usernames containing whitespaces made jq(1)
complain, so it has been decided not to support them.
2023-05-01 04:13:25 +02:00
Xavier Del Campo Romero 401c5dcf44
Fix missing error checks for strtoul(3) 2023-05-01 04:13:25 +02:00
Xavier Del Campo Romero cfd0a6f774
Return error if write_ctx_free fails
Otherwise, write_body_mem and write_body_mem would silently fail,
causing undefined behaviour.

Notes:

The return value for write_ctx_free is currently assigned to that of
fclose(3), which can be either 0 on success or EOF on failure.
However, it makes sense for write_body_mem and write_body_mem to simply
check against non-zero.

Also, it would not be sensible to return EOF to caller functions, which
expect either 0 (success), -1 (fatal error) or 1 (input error).
2023-05-01 04:13:25 +02:00
Xavier Del Campo Romero a557091ad1
Makefile: remove .SUFFIXES
According to POSIX.1-2008, .c and .o are already included by the default
.SUFFIX rule, among other suffixes.
2023-05-01 04:13:24 +02:00
Xavier Del Campo Romero 30a101717c
Remove HTTP/1.0 support
Considering http.h defined HTTP/1.1-only responses such as "303 See
Other", as well as incoming HTTP/1.1-only features (e.g.: byte serving),
it did not make much sense to keep a somewhat broken compatibility
against HTTP/1.0.

Unfortunately, this breaks support with some existing clients such
as lynx(1), even if HTTP/1.0 was already deprecated many years ago.
However, even lynx(1) can be configured to support HTTP/1.1.
2023-05-01 04:13:24 +02:00
Xavier Del Campo Romero dc063b90cb
Replace select(2) with poll(2)
select(2) has a number of well-known issues (e.g.: FD_SETSIZE limiting
the maximum amount of file descriptors to watch) that are mostly solved
by poll(2) and thus can be used as a drop-in replacement.
2023-05-01 04:13:16 +02:00
Xavier Del Campo Romero fa997aa2c1
Implement file previews
When using HTTP "Content-Disposition: attachment;", users are forced to
download files in order to use them, whereas others might prefer to open
them in the browser.

Therefore, now that URL parameters are supported by http.h, previews can
be forced by adding "preview=1" or "preview=true" (case-insensitive) as
a URL parameters. Any other parameters are ignored by slcl.

For users, a "Preview" link has been added next to the "Share" button
for each file.
2023-04-23 05:19:27 +02:00
Xavier Del Campo Romero 011807e1d6
Support URL parameters
Now, http_payload includes a list of human-readable parameters that can
be read (but not modified) by users. Given the following example link:

/test?key1=value1&key2=value2

This will generate two parameters, with the following values:

{
	.args =
	{
		[0] = {.key = "key1", .value = "value1"},
		[1] = {.key = "key2", .value = "value2"}
	},

	.n_args = 2
}

As expected, if any URL parameters are given, struct http_payload member
"resource" is accordingly trimmed so as not to include any parameters.
Therefore, considering the example above:

{.args = {...}, .resource = "/test"}

Limitations:

- Since the definition of struct http_arg is both shared by http.h
(as a read-only pointer within struct http_payload) and http.c
(as a read/write pointer within struct ctx), its members (namely key
and value) must remain as read/write pointers, even if they must not
be modified by users of http.h.
2023-04-23 05:09:53 +02:00
Xavier Del Campo Romero 2e2c9b4c93
Improve CSS and apply to list_dir 2023-04-17 03:01:19 +02:00
Xavier Del Campo Romero d9923273da
Makefile: make -MF write to .d file instead of stdout
This way, the default rule for .c.o can be used, simplifying the
Makefile a bit more.
2023-03-29 23:40:25 +02:00
Xavier Del Campo Romero ee6809eac5
auth.c: Ensure absolute path for a->dir
Otherwise, slcl would create broken symbolic links if the user passes a
relative path as command line argument.
2023-03-25 09:57:19 +01:00
Xavier Del Campo Romero 09a157d307
main.c: Use S_ISDIR in ensure_dir 2023-03-25 09:49:24 +01:00
Xavier Del Campo Romero b3ef22ac2a
Define _POSIX_C_SOURCE
This allows using the default compiler defined by make(1) (i.e.,
c99(1)), thus improving POSIX compatibility.
2023-03-24 02:49:11 +01:00
Xavier Del Campo Romero 4501c66ebd
http.c: Add missing #include
As required by strncasecmp(3).
2023-03-24 02:46:55 +01:00
Xavier Del Campo Romero d9bb874591
Send response on quota exceeded
So far, slcl would just close the connection with a client when the
Content-Length of an incoming request exceeded the user quota, without
any meaningful information given back to the user.

Now, slcl responds with a HTML file with meaningful information about
the error.

Limitations:

- While this commits has been successfully tested on ungoogled-chromium,
LibreWolf (and I assume Firefox and any other derivates too) does not
seem to receive the response from the server.
    - However, this issue only occurred during local testing, but not
on remote instances.
2023-03-20 10:57:20 +01:00
Xavier Del Campo Romero d51b191ab7
README.md: Fix wrong links 2023-03-20 00:10:26 +01:00
Xavier Del Campo Romero f0936adb34
README.md: Update according to current status 2023-03-19 23:59:45 +01:00
Xavier Del Campo Romero 66bc98275f
main.c: Fix double free(3) and refactor form handling
- When a non-empty username and an empty password was given, slcl would
crash due to a double free(3). This happened because append_form would
grow the form list before sanitizing the input and, since the output
pointer was not updated to the caller function, the latter would attempt
to free a now-old pointer.
- Additionally, some compilers such as clang complained about the
potential use of an uninitialized variable when calling forms_free.
- Also, it was a good opportunity to refactor get_forms and its caller
functions, as get_forms was not differentiate fatal errors from user
input errors.
2023-03-19 23:58:03 +01:00
Xavier Del Campo Romero 9624e81144
main.c: Fix undefined value for cur
As otherwise reported by clang 14.0.0:

main.c:679:14: warning: variable 'cur' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized]
    else if (available && quota_current(a, username, &cur))

This was a minor issue after all, as pq was not used unless available
were set.
2023-03-16 02:23:05 +01:00
Xavier Del Campo Romero fa474603cc
auth.c: Add friendly reminder 2023-03-16 01:59:17 +01:00
Xavier Del Campo Romero aefd6c6fda
Add man page for usergen(1) 2023-03-16 01:57:04 +01:00
Xavier Del Campo Romero f6fd20fdc4
Make usergen a bit more useful
So far, usergen printed a JSON object over standard output that had to
be manually copied into db.json. Now, this step is done automatically,
thanks to jq(1). OTOH, user directory is now also created by usergen.
2023-03-16 01:55:22 +01:00
Xavier Del Campo Romero 27b8a69718
page.c: Set Content-Disposition when serving files
So far, slcl used the default browser behaviour (i.e.,
Content-Disposition: inline), which means files were typically shown on
the web browser itself. However, this caused two issues:

- Users would have to right-click -> "Save Link As..." to download a
file, which might be inconvenient for some users.
- The original file name would not be retrieved for publicly shared
files.

Now, file download is always requested to the browser, and the original
file path is retrieved via readlink(2).
2023-03-16 01:49:18 +01:00