Commit Graph

180 Commits

Author SHA1 Message Date
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
Xavier Del Campo Romero 7e2e37d40a
main.c: Ensure essential directories on startup
So far, slcl failed with poorly described error messages when any of the
essential directories were missing. Now, these are created automatically
so that the initial setup is easier.
2023-03-16 01:46:49 +01:00
Xavier Del Campo Romero 955ae07f55
slcl.1: Update TODO
- User quota was implemented by commit ff8da797a.
- Public file sharing was implemented by commit 2e1b1313.
2023-03-16 01:18:04 +01:00
Xavier Del Campo Romero 69a059e0df
page.c: Fix wrong error message 2023-03-09 02:04:52 +01:00
Xavier Del Campo Romero d18243c019
main.c: Call form_free instead of repeating code 2023-03-09 02:04:52 +01:00
Xavier Del Campo Romero 2e1b131396
Implement public file sharing
An HTML form is now added next to each regular file, that generates a
POST request. Then, slcl replies with a HTML document with a link to the
public resource (which are implemented as symlinks).

Limitations:

- For now, only regular files can be shared i.e., sharing directories is
not possible. While feasible, it still requires a larger refactor to
list_dir and resource_layout, so that read-only access to the directory
is provided to anonymous users.
2023-03-09 02:02:40 +01:00
Xavier Del Campo Romero 13f96054f6
page.c: Provide meaningful description on HTTP 404 2023-03-09 01:23:02 +01:00
Xavier Del Campo Romero 8016f537ca
page.c: Implement function for common <head> nodes
This will be used by future commits.
2023-03-09 01:20:18 +01:00
Xavier Del Campo Romero a4c12e7ccc
Translate whitespace to '+' in append_form
Otherwise, every function calling get_forms must implement this.
2023-03-09 01:17:37 +01:00
Xavier Del Campo Romero ad7fb045ad
Move decode_hex into its own file
- Error detection against strotul(3) has been improved, as done in other
places.
- New function encode_hex has been implemented, which will be used
by future commits.
2023-03-09 01:14:10 +01:00
Xavier Del Campo Romero e0fc222f1d
http.c: Minor formatting change 2023-03-08 18:52:36 +01:00
Xavier Del Campo Romero c4488c5e81
page.c: Set common <head> parameters 2023-03-08 18:52:03 +01:00
Xavier Del Campo Romero f4c16b8e56
main.c: Always append trailing slash to directories
Otherwise, slcl would fail to generate the URLs for the elements inside
a directory, because of how cust_dirname worked, which also turned out
to be redundant.
2023-03-08 18:50:15 +01:00