forked from Telodendria/Telodendria
Compare commits
10 commits
fd1172ff56
...
be3ee54bd8
Author | SHA1 | Date | |
---|---|---|---|
be3ee54bd8 | |||
|
5367ffca96 | ||
c5b2fcf586 | |||
2b43a93524 | |||
fd28f97449 | |||
745a208f14 | |||
8843b34ba6 | |||
b059f966f1 | |||
|
8bf8afd91d | ||
6db3f3c612 |
14 changed files with 145 additions and 751 deletions
|
@ -1,6 +0,0 @@
|
||||||
build
|
|
||||||
data
|
|
||||||
.env
|
|
||||||
*.patch
|
|
||||||
*.log
|
|
||||||
vgcore.*
|
|
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
build
|
||||||
|
data
|
||||||
|
.env
|
||||||
|
*.patch
|
||||||
|
*.log
|
||||||
|
vgcore.*
|
||||||
|
Cytoplasm/build
|
||||||
|
Cytoplasm/out
|
||||||
|
Cytoplasm/*-leaked.txt
|
||||||
|
contrib/.vagrant
|
||||||
|
src/Schema
|
||||||
|
src/include/Schema
|
|
@ -1,3 +0,0 @@
|
||||||
build
|
|
||||||
out
|
|
||||||
*-leaked.txt
|
|
78
Cytoplasm/README.md
Normal file
78
Cytoplasm/README.md
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
# Cytoplasm (libcytoplasm)
|
||||||
|
|
||||||
|
Cytoplasm is a general-purpose C library and runtime stub for creating high-level (particularly networked and multi-threaded) C applications. It allows applications to take advantage of the speed, flexibility, and simplicity of the C programming language, while providing helpful code to perform various complex tasks. Cytoplasm provides high-level data structures, a basic logging facility, an HTTP client and server, and more.
|
||||||
|
|
||||||
|
Cytoplasm aims not to only do one thing well, but to do many things good enough. The primary target of Cytoplasm is simple, yet higher level C applications that have to perform relatively complex tasks, but don't want to pull in a large number of dependencies.
|
||||||
|
|
||||||
|
Cytoplasm is extremely opinionated on the way programs using it are written. It strives to create a comprehensive and tightly-integrated programming environment, while also maintaining C programming correctness. It doesn't do any macro magic or make C look like anything other than C. It is written entirely in C89, and depends only on a POSIX environment. This differentiates it from other general-purpose libraries that often require modern compilers and non-standard language and environment features. Cytoplasm is intended to be extremely portable and simple, while still providing some of the functionality expected in higher-level programming languages in a platform-agnostic manner. In the case of TLS, Cytoplasm wraps low-level TLS libraries to offer a single, unified interface to TLS so that programs do not have to care about the underlying implementation.
|
||||||
|
|
||||||
|
Cytoplasm is probably not suitable for embedded programming. It makes liberal use of the heap, and while data structures are designed to conserve memory where possible and practical, minimal memory usage is not really a design goal for Cytoplasm, although Cytoplasm takes care not to use any more memory than it absolutely needs. Cytoplasm also wraps a few standard libraries with additional logic and checking. While this ensures better runtime safetly, this inevitably adds a little overhead.
|
||||||
|
|
||||||
|
Originally a part of Telodendria (https://telodendria.io), a Matrix homeserver written in C, Cytoplasm was split off into its own project due to the desire of some Telodendria developers to use Telodendria's code in other projects. Cytoplasm is still a Telodendria project, and is maintained along side of Telodendria itself, even living in the same CVS module, but it is designed specifically to be distributed and used totally independent of Telodendria.
|
||||||
|
|
||||||
|
The name "Cytoplasm" was chosen for a few reasons. It plays off the precedent set up by the Matrix organization in naming projects after the parts of a neuron. It also speaks to the function of Cytoplasm. The cytoplasm of a cell is the supporting material. It is what gives the cell its shape, and it facilitates the movement of materials to the other cell parts. Likewise, Cytoplasm aims to provide a support mechanism for C applications that have to perform complex tasks.
|
||||||
|
|
||||||
|
Cytoplasm also starts with a C, which I think is a nice touch for C libraries. It's also fun to say and unique enough that searching for "libcytoplasm" should bring you to this project and not some other one.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
If your operating system or software distribution provides a pre-built package of Cytoplasm, you should prefer to use that instead of building it from source.
|
||||||
|
|
||||||
|
Cytoplasm aims to have zero dependencies beyond what is mandated by POSIX. You only need the standard math and pthread libraries to build it. TLS support can optionally be enabled by setting the TLS_IMPL environment variable. The supported TLS implementations are as follows:
|
||||||
|
|
||||||
|
- OpenSSL
|
||||||
|
- LibreSSL
|
||||||
|
|
||||||
|
If TLS support is not enabled, all APIs that use it should fall back to non-TLS behavior in a sensible manner. For example, if TLS support is not enabled, then the HTTP client API will simply return an error if a TLS connection is requested. Cytoplasm uses a custom build script instead of Make, for the sake of portability. To build everything, just run the script:
|
||||||
|
|
||||||
|
$ sh make.sh
|
||||||
|
|
||||||
|
This will produce the following out/ directory:
|
||||||
|
|
||||||
|
```
|
||||||
|
out/
|
||||||
|
lib/
|
||||||
|
libcytoplasm.so - The Cytoplasm shared library.
|
||||||
|
libcytoplasm.a - The Cytoplasm static library.
|
||||||
|
cytoplasm.o - The Cytoplasm runtime stub.
|
||||||
|
bin/
|
||||||
|
hdoc - The documentation generator tool.
|
||||||
|
man/ - All Cytoplasm API documentation.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Cytoplasm provides the typical .so and .a files, which can be used to link programs with it in the usual way. However, Cytoplasm also provides a minimal runtime environment that is intended to be used with the library. As such, it also provides a runtime stub, which is intended to be linked in with programs using Cytoplasm. This stub is responsible for setting up and tearing down some Cytoplasm APIs. While it isn't required by any means, it makes Cytoplasm a lot easier to use for programmers by abstracting out all of the common logic that most programs will want to use.
|
||||||
|
|
||||||
|
Here is the canonical Hello World written with Cytoplasm:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <Log.h>
|
||||||
|
|
||||||
|
int Main(void)
|
||||||
|
{
|
||||||
|
Log(LOG_INFO, "Hello World!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If this file is Hello.c, then you can compile it by doing something like this:
|
||||||
|
|
||||||
|
$ cc -o hello Hello.c cytoplasm.o -lcytoplasm
|
||||||
|
|
||||||
|
This command assumes that the runtime stub resides in the current working directory, and that libcytoplasm.so is in your library path. If you're using the version of Cytoplasm installed by your operating system or software distribution, consult the documentation for the location of the runtime stub. It may be located in /usr/local/libexec or some other similar location. If you've built Cytoplasm from source and wish to link to it from there, you may wish to do something like this:
|
||||||
|
|
||||||
|
$ export CYTOPLASM=/path/to/Cytoplasm/out/lib
|
||||||
|
$ cc -o hello Hello.c "${CYTOPLASM}/cytoplasm.o" \
|
||||||
|
"-L${CYTOPLASM}" -lcytoplasm
|
||||||
|
|
||||||
|
As you may have noticed, C programs using Cytoplasm's runtime stub don't write the main() function. Instead, they use Main(). The main() function is provided by the runtime stub. The full form of Main() expected by the stub is as follows:
|
||||||
|
|
||||||
|
```c
|
||||||
|
int Main(Array *args, HashMap *env);
|
||||||
|
```
|
||||||
|
|
||||||
|
The first argument is a Cytoplasm array of the command line arguments, and the second is a Cytoplasm hash map of environment variables. Most linkers will let programs omit the env argument, or both arguments if you don't need either. The return value of Main() is returned to the operating system.
|
||||||
|
|
||||||
|
Note that both arguments to Main may be treated like any other array or hash map. However, do not invoke ArrayFree() or HashMapFree() on the passed pointers, because memory is cleaned up after Main() returns.
|
||||||
|
|
|
@ -1,158 +0,0 @@
|
||||||
Cytoplasm (libcytoplasm)
|
|
||||||
========================================================================
|
|
||||||
|
|
||||||
Cytoplasm is a general-purpose C library and runtime stub for
|
|
||||||
creating high-level (particularly networked and multi-threaded) C
|
|
||||||
applications. It allows applications to take advantage of the speed,
|
|
||||||
flexibility, and simplicity of the C programming language, while
|
|
||||||
providing helpful code to perform various complex tasks. Cytoplasm
|
|
||||||
provides high-level data structures, a basic logging facility, an
|
|
||||||
HTTP client and server, and more.
|
|
||||||
|
|
||||||
Cytoplasm aims not to only do one thing well, but to do many things
|
|
||||||
good enough. The primary target of Cytoplasm is simple, yet higher
|
|
||||||
level C applications that have to perform relatively complex tasks,
|
|
||||||
but don't want to pull in a large number of dependencies.
|
|
||||||
|
|
||||||
Cytoplasm is extremely opinionated on the way programs using it are
|
|
||||||
written. It strives to create a comprehensive and tightly-integrated
|
|
||||||
programming environment, while also maintaining C programming
|
|
||||||
correctness. It doesn't do any macro magic or make C look like
|
|
||||||
anything other than C. It is written entirely in C89, and depends
|
|
||||||
only on a POSIX environment. This differentiates it from other
|
|
||||||
general-purpose libraries that often require modern compilers and
|
|
||||||
non-standard language and environment features. Cytoplasm is intended
|
|
||||||
to be extremely portable and simple, while still providing some of
|
|
||||||
the functionality expected in higher-level programming languages
|
|
||||||
in a platform-agnostic manner. In the case of TLS, Cytoplasm wraps
|
|
||||||
low-level TLS libraries to offer a single, unified interface to TLS
|
|
||||||
so that programs do not have to care about the underlying
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
Cytoplasm is probably not suitable for embedded programming. It makes
|
|
||||||
liberal use of the heap, and while data structures are designed to
|
|
||||||
conserve memory where possible and practical, minimal memory usage
|
|
||||||
is not really a design goal for Cytoplasm, although Cytoplasm takes
|
|
||||||
care not to use any more memory than it absolutely needs. Cytoplasm
|
|
||||||
also wraps a few standard libraries with additional logic and
|
|
||||||
checking. While this ensures better runtime safetly, this inevitably
|
|
||||||
adds a little overhead.
|
|
||||||
|
|
||||||
Originally a part of Telodendria (https://telodendria.io), a Matrix
|
|
||||||
homeserver written in C, Cytoplasm was split off into its own project
|
|
||||||
due to the desire of some Telodendria developers to use Telodendria's
|
|
||||||
code in other projects. Cytoplasm is still a Telodendria project,
|
|
||||||
and is maintained along side of Telodendria itself, even living in
|
|
||||||
the same CVS module, but it is designed specifically to be distributed
|
|
||||||
and used totally independent of Telodendria.
|
|
||||||
|
|
||||||
The name "Cytoplasm" was chosen for a few reasons. It plays off the
|
|
||||||
precedent set up by the Matrix organization in naming projects after
|
|
||||||
the parts of a neuron. It also speaks to the function of Cytoplasm.
|
|
||||||
The cytoplasm of a cell is the supporting material. It is what gives
|
|
||||||
the cell its shape, and it facilitates the movement of materials
|
|
||||||
to the other cell parts. Likewise, Cytoplasm aims to provide a
|
|
||||||
support mechanism for C applications that have to perform complex
|
|
||||||
tasks.
|
|
||||||
|
|
||||||
Cytoplasm also starts with a C, which I think is a nice touch for C
|
|
||||||
libraries. It's also fun to say and unique enough that searching for
|
|
||||||
"libcytoplasm" should bring you to this project and not some other
|
|
||||||
one.
|
|
||||||
|
|
||||||
Building
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
If your operating system or software distribution provides a pre-built
|
|
||||||
package of Cytoplasm, you should prefer to use that instead of
|
|
||||||
building it from source.
|
|
||||||
|
|
||||||
Cytoplasm aims to have zero dependencies beyond what is mandated
|
|
||||||
by POSIX. You only need the standard math and pthread libraries to
|
|
||||||
build it. TLS support can optionally be enabled by setting the
|
|
||||||
TLS_IMPL environment variable. The supported TLS implementations
|
|
||||||
are as follows:
|
|
||||||
|
|
||||||
* OpenSSL
|
|
||||||
* LibreSSL
|
|
||||||
|
|
||||||
If TLS support is not enabled, all APIs that use it should fall
|
|
||||||
back to non-TLS behavior in a sensible manner. For example, if TLS
|
|
||||||
support is not enabled, then the HTTP client API will simply return
|
|
||||||
an error if a TLS connection is requested.
|
|
||||||
|
|
||||||
Cytoplasm uses a custom build script instead of Make, for the sake
|
|
||||||
of portability. To build everything, just run the script:
|
|
||||||
|
|
||||||
$ sh make.sh
|
|
||||||
|
|
||||||
This will produce the following out/ directory:
|
|
||||||
|
|
||||||
out/
|
|
||||||
lib/
|
|
||||||
libcytoplasm.so - The Cytoplasm shared library.
|
|
||||||
libcytoplasm.a - The Cytoplasm static library.
|
|
||||||
cytoplasm.o - The Cytoplasm runtime stub.
|
|
||||||
bin/
|
|
||||||
hdoc - The documentation generator tool.
|
|
||||||
man/ - All Cytoplasm API documentation.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Cytoplasm provides the typical .so and .a files, which can be used
|
|
||||||
to link programs with it in the usual way. However, Cytoplasm also
|
|
||||||
provides a minimal runtime environment that is intended to be used
|
|
||||||
with the library. As such, it also provides a runtime stub, which
|
|
||||||
is intended to be linked in with programs using Cytoplasm. This
|
|
||||||
stub is responsible for setting up and tearing down some Cytoplasm
|
|
||||||
APIs. While it isn't required by any means, it makes Cytoplasm a
|
|
||||||
lot easier to use for programmers by abstracting out all of the
|
|
||||||
common logic that most programs will want to use.
|
|
||||||
|
|
||||||
Here is the canonical Hello World written with Cytoplasm:
|
|
||||||
|
|
||||||
#include <Log.h>
|
|
||||||
|
|
||||||
int Main(void)
|
|
||||||
{
|
|
||||||
Log(LOG_INFO, "Hello World!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
If this file is Hello.c, then you can compile it by doing something
|
|
||||||
like this:
|
|
||||||
|
|
||||||
$ cc -o hello Hello.c cytoplasm.o -lcytoplasm
|
|
||||||
|
|
||||||
This command assumes that the runtime stub resides in the current
|
|
||||||
working directory, and that libcytoplasm.so is in your library path.
|
|
||||||
If you're using the version of Cytoplasm installed by your operating
|
|
||||||
system or software distribution, consult the documentation for the
|
|
||||||
location of the runtime stub. It may be located in
|
|
||||||
/usr/local/libexec or some other similar location. If you've built
|
|
||||||
Cytoplasm from source and wish to link to it from there, you may wish
|
|
||||||
to do something like this:
|
|
||||||
|
|
||||||
$ export CYTOPLASM=/path/to/Cytoplasm/out/lib
|
|
||||||
$ cc -o hello Hello.c "${CYTOPLASM}/cytoplasm.o" \
|
|
||||||
"-L${CYTOPLASM}" -lcytoplasm
|
|
||||||
|
|
||||||
As you may have noticed, C programs using Cytoplasm's runtime stub
|
|
||||||
don't write the main() function. Instead, they use Main(). The main()
|
|
||||||
function is provided by the runtime stub. The full form of Main()
|
|
||||||
expected by the stub is as follows:
|
|
||||||
|
|
||||||
int Main(Array *args, HashMap *env);
|
|
||||||
|
|
||||||
The first argument is a Cytoplasm array of the command line
|
|
||||||
arguments, and the second is a Cytoplasm hash map of environment
|
|
||||||
variables. Most linkers will let programs omit the env argument,
|
|
||||||
or both arguments if you don't need either. The return value of
|
|
||||||
Main() is returned to the operating system.
|
|
||||||
|
|
||||||
Note that both arguments to Main may be treated like any other
|
|
||||||
array or hash map. However, do not invoke ArrayFree() or HashMapFree()
|
|
||||||
on the passed pointers, because memory is cleaned up after Main()
|
|
||||||
returns.
|
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
**Telodendria** is an open source Matrix homeserver implementation written from scratch in ANSI C and designed to be lightweight and simple, yet functional.
|
**Telodendria** is an open source Matrix homeserver implementation written from scratch in ANSI C and designed to be lightweight and simple, yet functional.
|
||||||
|
|
||||||
**Important:** This project is not developed on GitHub, or even with Git. As such, GitHub Pull Requests are not accepted. But that doesn't mean we don't want your contribution! You're more than welcome to clone this repo and use Git to make changes to the project if you'd prefer it to CVS, but when it comes time to actually submit your changes to this project, use [git format-patch](https://git-scm.com/docs/git-format-patch) to generate patch files, then submit them to the official Matrix room: [#telodendria-patches:bancino.net](https://matrix.to/#/#telodendria-patches:bancino.net).
|
**Important:** This project is not developed on GitHub or CVS anymore, but instead on a dedicated [Gitea forge](https://git.telodendria.io/Telodendria/telodendria).
|
||||||
|
|
||||||
Please see the `README.txt` file for the actual project `README`, which simply details the repository structure a little bit. All of **Telodendria**'s user and developer documentation is available as `man` pages, or online.
|
Please see the `README.txt` file for the actual project `README`, which simply details the repository structure a little bit. All of **Telodendria**'s user and developer documentation is available as `man` pages, or online.
|
||||||
|
|
126
TODO.txt
126
TODO.txt
|
@ -1,126 +0,0 @@
|
||||||
Telodendria To-Do List
|
|
||||||
======================
|
|
||||||
|
|
||||||
Key:
|
|
||||||
|
|
||||||
[ ] Not Started
|
|
||||||
[x] Done
|
|
||||||
[~] In Progress
|
|
||||||
[!] Won't Do
|
|
||||||
|
|
||||||
Milestone: v0.4.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[~] /_telodendria/admin/config endpoint
|
|
||||||
[ ] Update only certain values
|
|
||||||
|
|
||||||
[~] Client-Server API
|
|
||||||
[x] 6: Filtering
|
|
||||||
[x] Finish validating filters before saving them.
|
|
||||||
[~] 7: Events
|
|
||||||
[x] Compute size of JSON object in Canonical JSON
|
|
||||||
[x] Rename Sha2.h to just Sha; add Sha1() function
|
|
||||||
[x] Make Sha256() return raw bytes; add function to
|
|
||||||
convert to hex string.
|
|
||||||
[~] 8: Rooms
|
|
||||||
[~] 9: User Data
|
|
||||||
[x] Profiles
|
|
||||||
[~] Directory
|
|
||||||
|
|
||||||
[ ] Admin API
|
|
||||||
[ ] Registration token endpoints
|
|
||||||
|
|
||||||
[~] Cytoplasm
|
|
||||||
[~] Debug OpenSSL
|
|
||||||
[x] Database corruption
|
|
||||||
[ ] File descriptor exhaustion
|
|
||||||
[ ] Fix tp on NetBSD
|
|
||||||
[ ] Random memory corruption after many requests.
|
|
||||||
[ ] HOST_NAME_MAX not defined on some systems?
|
|
||||||
- Check if POSIX
|
|
||||||
- Might be enough to #define it when it doesn't exist.
|
|
||||||
[~] j2s
|
|
||||||
[x] Properly support arrays of primitives.
|
|
||||||
[ ] How to set default value of true on boolean?
|
|
||||||
- defaults probably need to be set at parser level, not
|
|
||||||
enough to set it after.
|
|
||||||
- Or booleans should default to -1 if not specified, let the
|
|
||||||
higher level logic set the default from there.
|
|
||||||
[ ] Write man page.
|
|
||||||
|
|
||||||
[x] Refactor MatrixErrorCreate() to take a custom message or NULL to
|
|
||||||
use the default. This will make debugging a lot easier.
|
|
||||||
[ ] Use detailed error messages for HTTP 500s at the minimum. Other
|
|
||||||
error messages might also be useful.
|
|
||||||
[x] Make sure admin registration token is printed to log, not stdout.
|
|
||||||
Unless they are the same, of course.
|
|
||||||
[ ] Refactor Config to use j2s.
|
|
||||||
[ ] Refactor other endpoints to use j2s for validating request bodies.
|
|
||||||
|
|
||||||
[ ] Add parser API to parse the identifier grammers
|
|
||||||
[ ] Use in alias endpoints
|
|
||||||
[ ] Finish RouteRoomAliases
|
|
||||||
[ ] Get from "id" in aliases
|
|
||||||
[ ] Note to check permissions according to spec
|
|
||||||
[ ] Finish RouteAliasDirectory
|
|
||||||
[ ] Add "id" objects when putting aliases
|
|
||||||
[ ] Delete from "id" when deleting alias
|
|
||||||
[x] Add alias admin privilege to allow admins to manage aliases
|
|
||||||
[ ] Fix note link on website main page.
|
|
||||||
|
|
||||||
Milestone: v0.5.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[~] Client-Server API
|
|
||||||
[ ] Modules
|
|
||||||
[ ] Content Repository
|
|
||||||
|
|
||||||
[ ] HTTP/1.1 support
|
|
||||||
[ ] Content-Length
|
|
||||||
[ ] Keep connections open
|
|
||||||
[ ] Chunked encoding
|
|
||||||
[ ] Refactor Memory API to use mmap().
|
|
||||||
|
|
||||||
Milestone: v0.6.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[~] Client-Server API
|
|
||||||
[ ] Modules
|
|
||||||
[ ] Instant Messaging
|
|
||||||
[ ] Voice over IP
|
|
||||||
[ ] Receipts
|
|
||||||
[ ] Fully Read Markers
|
|
||||||
[ ] Send-To-Device Messaging
|
|
||||||
[ ] 10: Security (Rate Limiting)
|
|
||||||
|
|
||||||
Milestone: v0.7.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[ ] Server-Server API
|
|
||||||
|
|
||||||
Milestone: v0.8.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[ ] Application Service API
|
|
||||||
|
|
||||||
Milestone: v0.9.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[ ] Identity Service API
|
|
||||||
|
|
||||||
Milestone: v1.7.0
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
[ ] Push Gateway API
|
|
||||||
[ ] Room Versions
|
|
||||||
|
|
||||||
Milestone v1.7.1
|
|
||||||
----------------
|
|
||||||
|
|
||||||
[ ] Database upgrades/migration path
|
|
||||||
[ ] Create a command line tool to manage Telodendria
|
|
||||||
[ ] User management
|
|
||||||
[ ] Room management
|
|
||||||
[ ] Migrate from Synapse or Dendrite, whichever is more mainstream by
|
|
||||||
the time we get here.
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
.vagrant
|
|
54
docs/ROADMAP.md
Normal file
54
docs/ROADMAP.md
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# Telodendria Matrix Specification Roadmap
|
||||||
|
|
||||||
|
This document provides a high-level overview of Telodendria's roadmap as it pertains to implementing the Matrix specification. Essentially, the Matrix specification is divided up into manageable portions amongst Telodendria releases, so that each release up until the first stable release implements a small portion of it.
|
||||||
|
|
||||||
|
**Note:** The first stable release of Telodendria will implement Matrix v1.7, no newer version. The Matrix specification changes too frequently, so I had to just pick a version in order to make this project manageable. Once v1.7 is complete, then we can move on to later specs.
|
||||||
|
|
||||||
|
This document will be updated to include more implementation details as they come up. It contains the big picture for far-out releases, and more relevant implementation details for near releases.
|
||||||
|
|
||||||
|
## Milestone v0.4.0
|
||||||
|
|
||||||
|
- [ ] Client-Server API
|
||||||
|
- [ ] **7:** Events
|
||||||
|
- [x] Compute size of JSON object in `CanonicalJson`
|
||||||
|
- [x] Rename `Sha2.h` to just `Sha.h`; add `Sha1()` function
|
||||||
|
- [x] Make `Sha256()` just return raw bytes; add function to convert to hex string.
|
||||||
|
- [ ] **8:** Rooms
|
||||||
|
- [ ] **9:** User Data
|
||||||
|
- [x] Profiles
|
||||||
|
- [ ] Directory
|
||||||
|
|
||||||
|
## Milestone v0.5.0
|
||||||
|
|
||||||
|
- [ ] Client-Server API
|
||||||
|
- [ ] Modules
|
||||||
|
- [ ] Content Repository
|
||||||
|
|
||||||
|
## Milestone v0.6.0
|
||||||
|
|
||||||
|
- [ ] Client-Server API
|
||||||
|
- [ ] Modules
|
||||||
|
- [ ] Instant Messaging
|
||||||
|
- [ ] Voice over IP
|
||||||
|
- [ ] Receipts
|
||||||
|
- [ ] Fully Read Markers
|
||||||
|
- [ ] Send-To-Device Messaging
|
||||||
|
- [ ] Security (Rate Limiting)
|
||||||
|
|
||||||
|
## Milestone v0.7.0
|
||||||
|
|
||||||
|
- [ ] Server-Server API
|
||||||
|
|
||||||
|
## Milestone v0.8.0
|
||||||
|
|
||||||
|
- [ ] Application Service API
|
||||||
|
- [ ] YAML parser?
|
||||||
|
|
||||||
|
## Milestone v0.9.0
|
||||||
|
|
||||||
|
- [ ] Identity Service API
|
||||||
|
|
||||||
|
## Milestone v1.7.0 (Stable Release!)
|
||||||
|
|
||||||
|
- [ ] Push Gateway API
|
||||||
|
- [ ] Room Versions
|
|
@ -1 +0,0 @@
|
||||||
mandoc.db
|
|
|
@ -1,453 +0,0 @@
|
||||||
.Dd $Mdocdate: April 16 2023 $
|
|
||||||
.Dt ADMIN 7
|
|
||||||
.Os Telodendria Project
|
|
||||||
.Sh NAME
|
|
||||||
.Nm Admin
|
|
||||||
.Nd Suggestion on a Telodendria Admin API
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
.Pp
|
|
||||||
This is a suggestion of how the admin API should work; it is subject
|
|
||||||
to heavy changes.
|
|
||||||
.Pp
|
|
||||||
It also acts as a suggestion on how suggestions should be written. It
|
|
||||||
might not be accepted, or the format might be changed heavily.
|
|
||||||
.Ss Admin Users
|
|
||||||
.Pp
|
|
||||||
Like in Synapse, there should be a field dictating if the user is an
|
|
||||||
admin, and unlike Synapse, there should be privilege levels.
|
|
||||||
.Pp
|
|
||||||
In the
|
|
||||||
.Pa users/[user].json
|
|
||||||
file, there should be a field called
|
|
||||||
.Dv privileges
|
|
||||||
which contains a list of strings.
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"devices": {
|
|
||||||
"foobar": { ... }
|
|
||||||
},
|
|
||||||
"salt": "salt goes here",
|
|
||||||
"deactivated": false,
|
|
||||||
"createdOn": 1700000000000,
|
|
||||||
"password": "hash goes here",
|
|
||||||
"privileges": [
|
|
||||||
"DEACTIVATE",
|
|
||||||
"ISSUE_TOKENS"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Privileges list
|
|
||||||
.Pp
|
|
||||||
Here are all of the admin privileges a user can have:
|
|
||||||
.Bl -tag -width Ds
|
|
||||||
.It Dv DEACTIVATE
|
|
||||||
This allows an user to deactivate any users using
|
|
||||||
the
|
|
||||||
.Em DELETE
|
|
||||||
/_telodendria/admin/disable/[localpart]
|
|
||||||
endpoint.
|
|
||||||
.It Dv ISSUE_TOKENS
|
|
||||||
This allows users to create, modify and delete registration
|
|
||||||
tokens.
|
|
||||||
.It Dv CONFIG
|
|
||||||
Users with this privilege can modify Telodendria's configuration.
|
|
||||||
.It Dv GRANT_PRIVILEGES
|
|
||||||
Users with this privilege can modify their own privileges or
|
|
||||||
the privileges of others.
|
|
||||||
.It Dv ALL
|
|
||||||
Users with this privilege can use
|
|
||||||
.Em any
|
|
||||||
admin endpoint(and some others).
|
|
||||||
.Em THIS PRIVILEGE SHOULD ONLY BE USED WITH TRUSTED USERS.
|
|
||||||
.Sh API ENDPOINTS
|
|
||||||
.Ss Sy GET No /_telodendria/admin/privileges
|
|
||||||
.Pp
|
|
||||||
Get the priviledges of the user that owns the provided access token.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Requires Token;Rate Limited
|
|
||||||
Yes;Yes
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
200;Privileges successfully returned.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
privileges;list;The same data structure described in the database.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"privileges": [
|
|
||||||
"DEACTIVATE",
|
|
||||||
"REMOVE_DEVICES"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy DELETE No /_telodendria/admin/deactivate/[localpart]
|
|
||||||
.Pp
|
|
||||||
Deactivates a local user, optionally with a reason.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;DEACTIVATE
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
Request JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l l.
|
|
||||||
Field;Type;Description;Required
|
|
||||||
reason;string;A reason why the user was deactivated;No
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
Request Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"reason": "Being mean in a lot of rooms."
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
200;User was successfully deactivated.
|
|
||||||
403;User does not have the DEACTIVATE permission.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
user;localpart;The deactivated user's localpart
|
|
||||||
reason;string;T{
|
|
||||||
The reason why the user was deactivated.
|
|
||||||
Defaults to: ``Deactivated by admin''
|
|
||||||
T}
|
|
||||||
banned_by;localpart;T{
|
|
||||||
The localpart of the admin who deactivated the user.
|
|
||||||
T}
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
errcode;string;Set to ``M_FORBIDDEN''
|
|
||||||
error;string;Human-readable explanation of the privilege issue.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"user": "evan",
|
|
||||||
"reason": "Being mean in a lot of rooms",
|
|
||||||
"banned_by": "alice"
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
403 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Forbidden access. Bad permissions or not authenticated."
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy PUT No /_telodendria/admin/deactivate/[localpart]
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;DEACTIVATE
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.Em Description:
|
|
||||||
Reactivates a local user.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
204;User was successfully reactivated.
|
|
||||||
403;User does not have the DEACTIVATE permission.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
errcode;string;Set to ``M_FORBIDDEN''
|
|
||||||
error;string;Human-readable explanation of the privilege issue.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
403 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Forbidden access. Bad permissions or not authenticated."
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy GET No /_telodendria/admin/tokens
|
|
||||||
.Pp
|
|
||||||
Gets a list of
|
|
||||||
.Em all
|
|
||||||
tokens present, and additional information.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;ISSUE_TOKENS
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
200;Token list was successfully retrieved.
|
|
||||||
403;User does not have the ISSUE_TOKENS permission.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
tokens;list[TokenInfo];A list of tokens and other information.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.Dv TokenInfo
|
|
||||||
JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
name;string;The token's name.
|
|
||||||
created_by;localpart;The user who has created token.
|
|
||||||
created_on;timestamp;The creation date of the token.
|
|
||||||
expires_on;timestamp;T{
|
|
||||||
The token's expiration date, or 0 if it does not
|
|
||||||
expire.
|
|
||||||
T}
|
|
||||||
used;integer;The number of times the token was used.
|
|
||||||
uses;integer;T{
|
|
||||||
The number of uses remaining for the token, or -1 if
|
|
||||||
there are an unlimited number of uses remaining.
|
|
||||||
T}
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
errcode;string;Set to ``M_FORBIDDEN''
|
|
||||||
error;string;Human-readable explanation of the privilege issue.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"tokens": [
|
|
||||||
{
|
|
||||||
"name": "forbob",
|
|
||||||
"created_by": "alice",
|
|
||||||
"created_on": 1234567890123,
|
|
||||||
"expires_on": 2147483647000,
|
|
||||||
"used": 1,
|
|
||||||
"uses": 3
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Forbidden access. Bad permissions or not authenticated."
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy GET No /_telodendria/admin/tokens/[token]
|
|
||||||
.Pp
|
|
||||||
Returns information about a specific registration token.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;ISSUE_TOKENS
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
200;Token information successfully retrieved.
|
|
||||||
403;User does not have the ISSUE_TOKENS permission.
|
|
||||||
404;The specified token does not exist.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
name;string;The token's name.
|
|
||||||
created_by;localpart;The user who created the token.
|
|
||||||
created_on;timestamp;The creation date of the token.
|
|
||||||
expires_on;timestamp;The token's expiration date, if provided.
|
|
||||||
used;integer;The number of times the token was used.
|
|
||||||
uses;integer;T{
|
|
||||||
The number of remaining uses for the token, if set.
|
|
||||||
Otherwise, there are unlimited uses remaining.
|
|
||||||
T}
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"name": "forbob",
|
|
||||||
"created_by": "alice",
|
|
||||||
"created_on": 1234567890123,
|
|
||||||
"used": 1,
|
|
||||||
"uses": 3
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy POST No /_telodendria/admin/tokens
|
|
||||||
.Pp
|
|
||||||
Adds a registration token, and setup expiry date and max uses.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;ISSUE_TOKENS
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
Request JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l l.
|
|
||||||
Field;Type;Description;Required
|
|
||||||
lifetime;timestamp;T{
|
|
||||||
How long this token should be good for
|
|
||||||
T};NO
|
|
||||||
max_uses;integer;T{
|
|
||||||
The maximum number of uses for this token
|
|
||||||
T};NO
|
|
||||||
name;string;T{
|
|
||||||
A name for the token. If none is provided, then a name
|
|
||||||
is randomly generated.
|
|
||||||
T};NO
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
Request Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"name": "OnlyClownsM7iAhUJD",
|
|
||||||
"expires": 2147484637000,
|
|
||||||
"max_uses": 5
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
200;Token was successfully created.
|
|
||||||
403;User does not have the ISSUE_TOKENS permission.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response JSON Format:
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Field;Type;Description
|
|
||||||
name;string;The token's name.
|
|
||||||
created_by;localpart;The user who created the token.
|
|
||||||
created_on;timestamp;The creation date of the token.
|
|
||||||
expires_on;timestamp;T{
|
|
||||||
The token's expiration date, if set. If not set, the
|
|
||||||
token never expires.
|
|
||||||
T}
|
|
||||||
used;integer;The number of times the token was used.
|
|
||||||
uses;integer;T{
|
|
||||||
The number of uses remaining for the token, if set. If
|
|
||||||
not set, the token has an unlimited number of uses.
|
|
||||||
T}
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
200 Response Example:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"name": "OnlyClownsM7iAhUJD",
|
|
||||||
"created_by": "donald",
|
|
||||||
"created_on": 1234567890123,
|
|
||||||
"expires_on": 2147484637000,
|
|
||||||
"used": 0,
|
|
||||||
"uses": 5
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Forbidden access. Bad permissions or not authenticated."
|
|
||||||
}
|
|
||||||
.Ed
|
|
||||||
.Ss Sy DELETE No /_telodendria/admin/tokens/[tokenname]
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l l.
|
|
||||||
Requires Token;Rate Limited;Permissions
|
|
||||||
Yes;Yes;ISSUE_TOKENS
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
.Em Description:
|
|
||||||
Deletes an existing registration token.
|
|
||||||
.Pp
|
|
||||||
.TS
|
|
||||||
tab(;) allbox center;
|
|
||||||
l l.
|
|
||||||
Error Response;Description
|
|
||||||
204;Token was successfully deleted.
|
|
||||||
403;User does not have the ISSUE_TOKENS permission.
|
|
||||||
.TE
|
|
||||||
.Pp
|
|
||||||
403 Response JSON Format:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
{
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Forbidden access. Bad permissions or not authenticated."
|
|
||||||
}
|
|
||||||
.Ed
|
|
|
@ -1 +0,0 @@
|
||||||
Schema
|
|
|
@ -1 +0,0 @@
|
||||||
Schema
|
|
0
tools/bin/td
Normal file → Executable file
0
tools/bin/td
Normal file → Executable file
Loading…
Reference in a new issue