Compare commits
357 Commits
Author | SHA1 | Date | |
---|---|---|---|
e5f58c2898 | |||
f83863ef01 | |||
837f069cf5 | |||
9f057dc29a | |||
c4904f176c | |||
d3a5aba703 | |||
9e283e427c | |||
133ba31d66 | |||
241a65a92a | |||
0b54795bab | |||
6208193de5 | |||
c53321532f | |||
34f25e3e06 | |||
c46244366e | |||
6518af04fc | |||
bf137ff1f7 | |||
1877955b62 | |||
50d0875de2 | |||
bf151e6b7d | |||
82893402d0 | |||
8049102787 | |||
f42cc3d9fd | |||
5f9a5208db | |||
6df506d238 | |||
2bd3354256 | |||
b55aaa1d18 | |||
34e19505bd | |||
6e06ec0904 | |||
a5814074fe | |||
d7479df5a2 | |||
34508aa0ae | |||
ae096b2c9c | |||
95d036e34a | |||
4af5e8ec42 | |||
2a5f71bd5d | |||
97fb63dda1 | |||
87d42e3b3b | |||
0394129a4c | |||
3c499c834b | |||
17d6cc7d46 | |||
646bd7dc38 | |||
56e483782d | |||
e1b9066b26 | |||
7114ce2516 | |||
9240c6570a | |||
f80a44ccd7 | |||
e6f5eb244e | |||
ab62e83110 | |||
aeefb9e536 | |||
ee0efa536a | |||
2523130fdc | |||
c024777184 | |||
5951d7cd2d | |||
011670c70b | |||
6cebd6c769 | |||
546ae5cbf1 | |||
f543cc642e | |||
8ac3c5ea22 | |||
63918f0680 | |||
bfb3d8b8a2 | |||
e38ff99607 | |||
b0e3d922c8 | |||
a15bb8e994 | |||
6f487100cd | |||
0693a2315f | |||
f360e886ff | |||
6ea08cc5dc | |||
347c706d6f | |||
5f5e6616c7 | |||
657bcadc7e | |||
107666cc60 | |||
b37669184a | |||
163a01f224 | |||
3d58094199 | |||
463951a4f1 | |||
34804d5162 | |||
3895c33915 | |||
17f4eb1a56 | |||
0abdffdea6 | |||
d32999f178 | |||
f621feb843 | |||
8d277f029d | |||
1788a02338 | |||
ba0800d16c | |||
4008c7d8f6 | |||
610a2e2afc | |||
6f3715d1eb | |||
b78ecaa814 | |||
e6f5399d53 | |||
0e5806cadd | |||
68c9d4afa7 | |||
f0ea38fe49 | |||
b0332f923e | |||
8a76c25394 | |||
fd96126e3e | |||
ff3fbedc18 | |||
8791419f8e | |||
5447b247a0 | |||
aabbb10564 | |||
3ccd6c9a3e | |||
c290240de7 | |||
8e799b174b | |||
a9c3a93989 | |||
3ef8698f42 | |||
fa4e843c30 | |||
9a4d11f4d9 | |||
eed2b8d618 | |||
13f02c2aca | |||
d50f8fbc8b | |||
155238a516 | |||
427fcdbdca | |||
ca05d402a7 | |||
c5a80b68ca | |||
c1fb15b135 | |||
4b2c131836 | |||
9ca1e69b3c | |||
082d041d44 | |||
221f276c4b | |||
24cec21465 | |||
9f71ec6194 | |||
bb36afc390 | |||
b53bf0ff64 | |||
3ebc6f2436 | |||
2eef6778a6 | |||
81fabec810 | |||
dc6e7924b5 | |||
48dec5a2c8 | |||
9b500e1da9 | |||
a038820112 | |||
70a15973b6 | |||
09b6a00731 | |||
883c3cf0e9 | |||
a46bb8183c | |||
d5d5a7b012 | |||
a120efdc91 | |||
d48f4b06eb | |||
f078912736 | |||
63b0f0dedd | |||
84c22dbf5f | |||
b8cd1232be | |||
a518ab07f4 | |||
9e5a1ee975 | |||
95bf3f0316 | |||
d69dd513bc | |||
525cdf571a | |||
9cfe0a8804 | |||
50b54599ef | |||
ed6bef6d24 | |||
71268636df | |||
568729ecd6 | |||
9139725be6 | |||
969a8da6bf | |||
2338b26329 | |||
d4df206740 | |||
8a93cdd33c | |||
92b31de4a9 | |||
5452f3f623 | |||
256614dbaf | |||
049449b213 | |||
85b46336b1 | |||
590afa7b01 | |||
574292b798 | |||
21cf503a59 | |||
3630cdbfe0 | |||
0f3be229e6 | |||
8e5a024d3d | |||
410bb7c09d | |||
9de8b0f449 | |||
d47c3a1222 | |||
df99b3aa90 | |||
0090850e10 | |||
9efd64bd18 | |||
b16c37e48b | |||
3ee2c00726 | |||
d5a7e19f1a | |||
9b52415b35 | |||
dbe24494d9 | |||
3eab5a5f70 | |||
548febfb22 | |||
b40f72443a | |||
2c03496373 | |||
b6a937c954 | |||
63776d40bd | |||
cb3c7afade | |||
991022adfc | |||
2bc71a18a6 | |||
57ca864fbb | |||
a09edfb612 | |||
7997a739ab | |||
248b258413 | |||
0423ed7fb4 | |||
c29378c2f8 | |||
163fbd85e7 | |||
58bb86ebe1 | |||
c5140ee8e8 | |||
6270fd8118 | |||
3fff706848 | |||
c259defab5 | |||
e5fee5c306 | |||
9d35b4bdfb | |||
9497d7cf64 | |||
c7d3e602cb | |||
0076eb4ed4 | |||
6070bde413 | |||
c7a6d426f0 | |||
f66cf0f802 | |||
e4b6c81024 | |||
44d784cd04 | |||
0394201113 | |||
e270c16516 | |||
4c10538632 | |||
71329c5532 | |||
feb4bf9e87 | |||
5d5567e94c | |||
684e6fb9cb | |||
ee21fa6d03 | |||
7a2974e54f | |||
f4dfc1dd98 | |||
2eebfa9a7a | |||
10097ffeb8 | |||
cbe1f54a2a | |||
4d8f081a59 | |||
29e79c9484 | |||
ba35869b0a | |||
580688381e | |||
e63d69a440 | |||
be64fe04fb | |||
801ab20723 | |||
d974a5e044 | |||
1be94ae0be | |||
b883e6a485 | |||
a0210379ae | |||
e56dc207d1 | |||
523c9c9ad2 | |||
74bb2151c1 | |||
f79d7b35a4 | |||
3b36496dac | |||
4ebd6c24a9 | |||
05451d98b3 | |||
22a4bce3c8 | |||
76d499f00b | |||
f0772f9b99 | |||
46e711f0a5 | |||
abffac3f82 | |||
27b275548e | |||
93ce253d1e | |||
a5af312b39 | |||
4b5e8e8a43 | |||
443dd4d168 | |||
907479df84 | |||
9887a78e98 | |||
f669371349 | |||
24c720c79a | |||
4485234980 | |||
b6871c0b1f | |||
47838d5e48 | |||
69fccd56d3 | |||
ca00c4fb5d | |||
427ca3f265 | |||
c1a80e50e7 | |||
52962f3a5e | |||
b3f095b61f | |||
a5004c8ba9 | |||
7d9b1b508b | |||
5e265dfc83 | |||
3a43d6f8ac | |||
11a6649847 | |||
7caf4a0173 | |||
385524352c | |||
5ca5323782 | |||
ba6da856bb | |||
c0e72246cc | |||
c7ab5447ea | |||
5fdd461159 | |||
421955f2a0 | |||
a28f6985ed | |||
8244dddab7 | |||
a5ca436eaa | |||
d7fc1c2c88 | |||
382627ef8d | |||
17667b4cf8 | |||
5231ec22e7 | |||
929ae1b709 | |||
f01f7a5ab9 | |||
a2dce833f8 | |||
de6c7a4fd4 | |||
4edee0f7f6 | |||
988a807fa4 | |||
5258e4253d | |||
09ba86dec5 | |||
78d8a1aa23 | |||
22def15209 | |||
4cbda7a849 | |||
be85a620ef | |||
0b07b678b4 | |||
4733ce9287 | |||
48d6bf4c15 | |||
8c759bcbac | |||
b5ed7014f6 | |||
6cd9dea186 | |||
202b416acf | |||
93d46f5610 | |||
c5ddf3ac99 | |||
a9cb913a47 | |||
b7b5d4f1a5 | |||
a947396bad | |||
d528bc808e | |||
c6fd05c2cf | |||
d6bb9d311a | |||
53b4cbbf8c | |||
628716ec28 | |||
bd14168627 | |||
96037d4da6 | |||
5448e773d8 | |||
848ef21c7c | |||
2ecae7da93 | |||
d9ce569eb9 | |||
eacaf392b1 | |||
ce16592b6a | |||
295d76d354 | |||
23b3c998bd | |||
b5e966c9a1 | |||
96cb6f4b12 | |||
e2c0f82ec0 | |||
dbf28c03e6 | |||
26165e30de | |||
c52331a23a | |||
8007e71e1d | |||
28d08e013f | |||
64bbd383de | |||
8a9f53102b | |||
0412b97170 | |||
c8b8a8fc03 | |||
95d3090b9b | |||
49129ee6dd | |||
6a7ecb0d4a | |||
1ceeed1007 | |||
a7922ff44e | |||
a421604ed5 | |||
7d182db32f | |||
c5cb9979d3 | |||
b9a73106ed | |||
c674cca482 | |||
81d1228b92 | |||
6ae61d5b81 | |||
9cb872eec2 | |||
68e8c010b7 | |||
9671413906 | |||
4c8d24c319 | |||
e50144bd34 | |||
9f3171e3f1 | |||
cc92748747 | |||
0a0b0c1adb | |||
92a74026a6 | |||
3fa1c6c420 | |||
b04eccdbda | |||
9ce30dee70 |
35
.gitea/workflows/build.yaml
Normal file
35
.gitea/workflows/build.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: Build Tilde Friends
|
||||||
|
run-name: ${{ gitea.actor }} running 🚀
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Build-All:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
valid_volumes: ['/opt/keys']
|
||||||
|
volumes:
|
||||||
|
- /opt/keys:/opt/keys
|
||||||
|
steps:
|
||||||
|
- name: check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
- run: ln -s /opt/keys .keys
|
||||||
|
- name: Setup JDK
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '17'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- name: Setup Android SDK
|
||||||
|
uses: android-actions/setup-android@v3
|
||||||
|
with:
|
||||||
|
packages: 'tools platform-tools build-tools;34.0.0 platforms;android-34 ndk;26.3.11579264'
|
||||||
|
- run: sudo apt update && sudo apt install -y doxygen graphviz mingw-w64
|
||||||
|
- run: ANDROID_SDK=$HOME/.android/sdk make -j`nproc` all docs
|
||||||
|
- run: docker build .
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
path: out/TildeFriends-release.fdroid.apk
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
path: out/winrelease/tildefriends.exe
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,10 +1,17 @@
|
|||||||
|
build/
|
||||||
|
*.core
|
||||||
db.*
|
db.*
|
||||||
deps/ios_toolchain/
|
deps/ios_toolchain/
|
||||||
deps/openssl/
|
deps/openssl/
|
||||||
dist/
|
dist/
|
||||||
.keys
|
.keys
|
||||||
|
logs/
|
||||||
**/node_modules
|
**/node_modules
|
||||||
out
|
out
|
||||||
|
repo/
|
||||||
|
result
|
||||||
*.swo
|
*.swo
|
||||||
*.swp
|
*.swp
|
||||||
|
tmp/
|
||||||
|
unsigned/
|
||||||
.zsign_cache/
|
.zsign_cache/
|
||||||
|
28
.gitmodules
vendored
Normal file
28
.gitmodules
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
[submodule "deps/zlib"]
|
||||||
|
path = deps/zlib
|
||||||
|
url = https://github.com/madler/zlib.git
|
||||||
|
[submodule "deps/libsodium"]
|
||||||
|
path = deps/libsodium
|
||||||
|
url = https://github.com/jedisct1/libsodium.git
|
||||||
|
[submodule "deps/quickjs"]
|
||||||
|
path = deps/quickjs
|
||||||
|
url = https://github.com/bellard/quickjs.git
|
||||||
|
[submodule "deps/crypt_blowfish"]
|
||||||
|
path = deps/crypt_blowfish
|
||||||
|
url = https://github.com/openwall/crypt_blowfish.git
|
||||||
|
[submodule "deps/libbacktrace"]
|
||||||
|
path = deps/libbacktrace
|
||||||
|
url = https://github.com/ianlancetaylor/libbacktrace.git
|
||||||
|
[submodule "deps/libuv"]
|
||||||
|
path = deps/libuv
|
||||||
|
url = https://github.com/libuv/libuv.git
|
||||||
|
[submodule "deps/picohttpparser"]
|
||||||
|
path = deps/picohttpparser
|
||||||
|
url = https://github.com/h2o/picohttpparser.git
|
||||||
|
[submodule "deps/openssl_src"]
|
||||||
|
path = deps/openssl_src
|
||||||
|
url = https://github.com/openssl/openssl.git
|
||||||
|
shallow = true
|
||||||
|
[submodule "deps/c-ares"]
|
||||||
|
path = deps/c-ares
|
||||||
|
url = https://github.com/c-ares/c-ares.git
|
@ -2,6 +2,7 @@ node_modules
|
|||||||
src
|
src
|
||||||
deps
|
deps
|
||||||
.clang-format
|
.clang-format
|
||||||
|
flake.lock
|
||||||
|
|
||||||
# Minified files
|
# Minified files
|
||||||
**/*.min.css
|
**/*.min.css
|
||||||
|
326
GNUmakefile
326
GNUmakefile
@ -3,12 +3,12 @@
|
|||||||
MAKEFLAGS += --warn-undefined-variables
|
MAKEFLAGS += --warn-undefined-variables
|
||||||
MAKEFLAGS += --no-builtin-rules
|
MAKEFLAGS += --no-builtin-rules
|
||||||
|
|
||||||
VERSION_CODE := 17
|
VERSION_CODE := 27
|
||||||
VERSION_NUMBER := 0.0.17
|
VERSION_NUMBER := 0.0.23-wip
|
||||||
VERSION_NAME := Please enjoy responsibly.
|
VERSION_NAME := Me upon my pony on my boat.
|
||||||
|
|
||||||
SQLITE_URL := https://www.sqlite.org/2024/sqlite-amalgamation-3450200.zip
|
SQLITE_URL := https://www.sqlite.org/2024/sqlite-amalgamation-3460100.zip
|
||||||
LIBUV_URL := https://dist.libuv.org/dist/v1.48.0/libuv-v1.48.0.tar.gz
|
BUNDLETOOL_URL := https://github.com/google/bundletool/releases/download/1.17.0/bundletool-all-1.17.0.jar
|
||||||
|
|
||||||
PROJECT = tildefriends
|
PROJECT = tildefriends
|
||||||
BUILD_DIR ?= out
|
BUILD_DIR ?= out
|
||||||
@ -16,6 +16,12 @@ UNAME_S := $(shell uname -s)
|
|||||||
UNAME_M := $(shell uname -m)
|
UNAME_M := $(shell uname -m)
|
||||||
|
|
||||||
ANDROID_SDK ?= ~/Android/Sdk
|
ANDROID_SDK ?= ~/Android/Sdk
|
||||||
|
BUNDLETOOL = out/bundletool.jar
|
||||||
|
|
||||||
|
HAVE_WIN := 0
|
||||||
|
|
||||||
|
export SOURCE_DATE_EPOCH=1
|
||||||
|
export TZ=UTC
|
||||||
|
|
||||||
ifeq ($(UNAME_S),Darwin)
|
ifeq ($(UNAME_S),Darwin)
|
||||||
BUILD_TYPES := macosdebug macosrelease iosdebug iosrelease iossimdebug iossimrelease
|
BUILD_TYPES := macosdebug macosrelease iosdebug iosrelease iossimdebug iossimrelease
|
||||||
@ -29,7 +35,8 @@ BUILD_TYPES := debug release
|
|||||||
CFLAGS += -Dstatic_assert=_Static_assert
|
CFLAGS += -Dstatic_assert=_Static_assert
|
||||||
LDFLAGS += \
|
LDFLAGS += \
|
||||||
-lbsd \
|
-lbsd \
|
||||||
-lnetwork
|
-lnetwork \
|
||||||
|
-Wno-stringop-overflow
|
||||||
else ifeq ($(UNAME_S),OpenBSD)
|
else ifeq ($(UNAME_S),OpenBSD)
|
||||||
BUILD_TYPES := debug release
|
BUILD_TYPES := debug release
|
||||||
CFLAGS += \
|
CFLAGS += \
|
||||||
@ -39,7 +46,6 @@ LDFLAGS += \
|
|||||||
-lc++abi
|
-lc++abi
|
||||||
HAVE_ANDROID := 0
|
HAVE_ANDROID := 0
|
||||||
HAVE_LINUX_IOS := 0
|
HAVE_LINUX_IOS := 0
|
||||||
HAVE_WIN := 0
|
|
||||||
else
|
else
|
||||||
$(error Unexpected host platform $(UNAME_S).)
|
$(error Unexpected host platform $(UNAME_S).)
|
||||||
endif
|
endif
|
||||||
@ -49,18 +55,22 @@ CFLAGS += \
|
|||||||
-Wall \
|
-Wall \
|
||||||
-Wextra \
|
-Wextra \
|
||||||
-Wno-unused-parameter \
|
-Wno-unused-parameter \
|
||||||
|
-Wno-unknown-warning-option \
|
||||||
-MMD \
|
-MMD \
|
||||||
-MP \
|
-MP \
|
||||||
-ffunction-sections \
|
-ffunction-sections \
|
||||||
-fdata-sections \
|
-fdata-sections \
|
||||||
-fno-exceptions \
|
-fno-exceptions \
|
||||||
-g
|
-g
|
||||||
|
LDFLAGS += \
|
||||||
|
-Wno-attributes \
|
||||||
|
-flto=auto
|
||||||
|
|
||||||
ANDROID_BUILD_TOOLS := $(ANDROID_SDK)/build-tools/34.0.0
|
|
||||||
ANDROID_PLATFORM := $(ANDROID_SDK)/platforms/android-34
|
|
||||||
ANDROID_NDK ?= $(ANDROID_SDK)/ndk/26.2.11394342
|
|
||||||
ANDROID_MIN_SDK_VERSION := 24
|
ANDROID_MIN_SDK_VERSION := 24
|
||||||
ANDROID_TARGET_SDK_VERSION := 34
|
ANDROID_TARGET_SDK_VERSION := 34
|
||||||
|
ANDROID_BUILD_TOOLS := $(ANDROID_SDK)/build-tools/34.0.0
|
||||||
|
ANDROID_PLATFORM := $(ANDROID_SDK)/platforms/android-$(ANDROID_TARGET_SDK_VERSION)
|
||||||
|
ANDROID_NDK ?= $(ANDROID_SDK)/ndk/26.3.11579264
|
||||||
|
|
||||||
ANDROID_ARMV7A_TARGETS := \
|
ANDROID_ARMV7A_TARGETS := \
|
||||||
out/androiddebug-armv7a/tildefriends \
|
out/androiddebug-armv7a/tildefriends \
|
||||||
@ -89,7 +99,7 @@ BUILD_TYPES += \
|
|||||||
androidrelease-x86 \
|
androidrelease-x86 \
|
||||||
androiddebug-x86_64 \
|
androiddebug-x86_64 \
|
||||||
androidrelease-x86_64
|
androidrelease-x86_64
|
||||||
all: out/TildeFriends-arm-debug.apk out/TildeFriends-arm-release.apk out/TildeFriends-x86-debug.apk out/TildeFriends-x86-release.apk
|
all: out/TildeFriends-arm-debug.apk out/TildeFriends-arm-release.apk out/TildeFriends-x86-debug.apk out/TildeFriends-x86-release.apk out/TildeFriends-release.fdroid.apk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
WINDOWS_TARGETS := \
|
WINDOWS_TARGETS := \
|
||||||
@ -149,19 +159,24 @@ ANDROID_RELEASE_TARGETS := $(filter-out $(DEBUG_TARGETS),$(ANDROID_TARGETS))
|
|||||||
NONANDROID_RELEASE_TARGETS := $(filter-out $(ANDROID_ARM64_TARGETS),$(RELEASE_TARGETS))
|
NONANDROID_RELEASE_TARGETS := $(filter-out $(ANDROID_ARM64_TARGETS),$(RELEASE_TARGETS))
|
||||||
NONANDROID_TARGETS := $(filter-out $(ANDROID_TARGETS),$(ALL_TARGETS))
|
NONANDROID_TARGETS := $(filter-out $(ANDROID_TARGETS),$(ALL_TARGETS))
|
||||||
NONMACOS_TARGETS := $(filter-out $(MACOS_TARGETS) $(IOS_TARGETS) $(IOSSIM_TARGETS),$(ALL_TARGETS))
|
NONMACOS_TARGETS := $(filter-out $(MACOS_TARGETS) $(IOS_TARGETS) $(IOSSIM_TARGETS),$(ALL_TARGETS))
|
||||||
|
DEADSTRIP_TARGETS := $(filter-out $(ANDROID_TARGETS),$(NONMACOS_TARGETS))
|
||||||
|
$(NONMACOS_TARGETS): LDFLAGS += -static-libgcc
|
||||||
|
|
||||||
$(NONANDROID_TARGETS): CFLAGS += -fno-omit-frame-pointer
|
$(NONANDROID_TARGETS): CFLAGS += -fno-omit-frame-pointer
|
||||||
$(filter-out $(ANDROID_TARGETS) $(WINDOWS_TARGETS),$(ALL_TARGETS)): LDFLAGS += -rdynamic
|
$(filter-out $(WINDOWS_TARGETS),$(ALL_TARGETS)): LDFLAGS += -rdynamic
|
||||||
$(ANDROID_TARGETS): CFLAGS += \
|
$(ANDROID_TARGETS): CFLAGS += \
|
||||||
--sysroot $(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
|
--sysroot $(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
|
||||||
-fPIC \
|
-fPIC \
|
||||||
-fdebug-compilation-dir . \
|
-fdebug-compilation-dir . \
|
||||||
-fomit-frame-pointer \
|
-fomit-frame-pointer \
|
||||||
-fno-asynchronous-unwind-tables \
|
-fno-asynchronous-unwind-tables \
|
||||||
-funwind-tables
|
-funwind-tables \
|
||||||
|
-Wno-unknown-warning-option
|
||||||
$(ANDROID_TARGETS): LDFLAGS += --sysroot $(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC
|
$(ANDROID_TARGETS): LDFLAGS += --sysroot $(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC
|
||||||
$(DEBUG_TARGETS): CFLAGS += -DDEBUG -Og
|
$(DEBUG_TARGETS): CFLAGS += -DDEBUG -Og
|
||||||
$(RELEASE_TARGETS): CFLAGS += -DNDEBUG
|
$(RELEASE_TARGETS): CFLAGS += \
|
||||||
|
-DNDEBUG \
|
||||||
|
-flto
|
||||||
$(NONANDROID_RELEASE_TARGETS): CFLAGS += -O3
|
$(NONANDROID_RELEASE_TARGETS): CFLAGS += -O3
|
||||||
$(ANDROID_RELEASE_TARGETS): CFLAGS += -Oz
|
$(ANDROID_RELEASE_TARGETS): CFLAGS += -Oz
|
||||||
$(WINDOWS_TARGETS): CC = x86_64-w64-mingw32-gcc-win32
|
$(WINDOWS_TARGETS): CC = x86_64-w64-mingw32-gcc-win32
|
||||||
@ -204,7 +219,7 @@ $(ANDROID_X86_TARGETS): LDFLAGS += -Ldeps/openssl/android/x86/usr/local/lib
|
|||||||
$(ANDROID_X86_64_TARGETS): CFLAGS += -Ideps/openssl/android/x86_64/usr/local/include
|
$(ANDROID_X86_64_TARGETS): CFLAGS += -Ideps/openssl/android/x86_64/usr/local/include
|
||||||
$(ANDROID_X86_64_TARGETS): LDFLAGS += -Ldeps/openssl/android/x86_64/usr/local/lib
|
$(ANDROID_X86_64_TARGETS): LDFLAGS += -Ldeps/openssl/android/x86_64/usr/local/lib
|
||||||
$(NONMACOS_TARGETS): CFLAGS += -Wno-cast-function-type
|
$(NONMACOS_TARGETS): CFLAGS += -Wno-cast-function-type
|
||||||
$(NONMACOS_TARGETS): LDFLAGS += -Wl,--gc-sections
|
$(DEADSTRIP_TARGETS): LDFLAGS += -Wl,--gc-sections
|
||||||
$(IOS_TARGETS): CFLAGS += -mios-version-min=9.0 -Ideps/openssl/ios/ios64-xcrun/usr/local/include
|
$(IOS_TARGETS): CFLAGS += -mios-version-min=9.0 -Ideps/openssl/ios/ios64-xcrun/usr/local/include
|
||||||
$(IOS_TARGETS): LDFLAGS += -Ldeps/openssl/ios/ios64-xcrun/usr/local/lib
|
$(IOS_TARGETS): LDFLAGS += -Ldeps/openssl/ios/ios64-xcrun/usr/local/lib
|
||||||
$(IOSSIM_TARGETS): CFLAGS += -Ideps/openssl/ios/iossimulator-xcrun/usr/local/include
|
$(IOSSIM_TARGETS): CFLAGS += -Ideps/openssl/ios/iossimulator-xcrun/usr/local/include
|
||||||
@ -237,6 +252,8 @@ APP_SOURCES_ios := $(wildcard src/*.m)
|
|||||||
APP_OBJS := $(call get_objs,APP_SOURCES)
|
APP_OBJS := $(call get_objs,APP_SOURCES)
|
||||||
$(APP_OBJS): CFLAGS += \
|
$(APP_OBJS): CFLAGS += \
|
||||||
-Ideps/base64c/include \
|
-Ideps/base64c/include \
|
||||||
|
-Ideps/c-ares/include \
|
||||||
|
-Ideps/c-ares_config \
|
||||||
-Ideps/crypt_blowfish \
|
-Ideps/crypt_blowfish \
|
||||||
-Ideps/libbacktrace \
|
-Ideps/libbacktrace \
|
||||||
-Ideps/libsodium \
|
-Ideps/libsodium \
|
||||||
@ -255,6 +272,105 @@ $(filter-out $(BUILD_DIR)/android% $(BUILD_DIR)/macos% $(BUILD_DIR)/ios%,$(APP_O
|
|||||||
-fanalyzer
|
-fanalyzer
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ARES_SOURCES := \
|
||||||
|
deps/c-ares/src/lib/ares_platform.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_mapping.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_parse.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_write.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_name.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_record.c \
|
||||||
|
deps/c-ares/src/lib/record/ares_dns_multistring.c \
|
||||||
|
deps/c-ares/src/lib/ares_destroy.c \
|
||||||
|
deps/c-ares/src/lib/ares_data.c \
|
||||||
|
deps/c-ares/src/lib/ares_sysconfig.c \
|
||||||
|
deps/c-ares/src/lib/ares_cancel.c \
|
||||||
|
deps/c-ares/src/lib/ares_metrics.c \
|
||||||
|
deps/c-ares/src/lib/ares_getnameinfo.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_txt_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_naptr_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_create_query.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_mx_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_srv_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_ptr_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_caa_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_expand_name.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_uri_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_a_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_expand_string.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_fds.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_ns_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_parse_soa_reply.c \
|
||||||
|
deps/c-ares/src/lib/legacy/ares_getsock.c \
|
||||||
|
deps/c-ares/src/lib/windows_port.c \
|
||||||
|
deps/c-ares/src/lib/ares_qcache.c \
|
||||||
|
deps/c-ares/src/lib/ares_update_servers.c \
|
||||||
|
deps/c-ares/src/lib/ares_process.c \
|
||||||
|
deps/c-ares/src/lib/ares_getenv.c \
|
||||||
|
deps/c-ares/src/lib/ares_gethostbyname.c \
|
||||||
|
deps/c-ares/src/lib/ares_send.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__slist.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__htable.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__llist.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__htable_szvp.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__htable_asvp.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__htable_vpvp.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__htable_strvp.c \
|
||||||
|
deps/c-ares/src/lib/dsa/ares__array.c \
|
||||||
|
deps/c-ares/src/lib/ares__socket.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_poll.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_thread.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_select.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_kqueue.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_configchg.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_epoll.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_wake_pipe.c \
|
||||||
|
deps/c-ares/src/lib/event/ares_event_win32.c \
|
||||||
|
deps/c-ares/src/lib/ares_search.c \
|
||||||
|
deps/c-ares/src/lib/ares__parse_into_addrinfo.c \
|
||||||
|
deps/c-ares/src/lib/ares__hosts_file.c \
|
||||||
|
deps/c-ares/src/lib/ares_getaddrinfo.c \
|
||||||
|
deps/c-ares/src/lib/ares__addrinfo2hostent.c \
|
||||||
|
deps/c-ares/src/lib/ares_freeaddrinfo.c \
|
||||||
|
deps/c-ares/src/lib/ares_strerror.c \
|
||||||
|
deps/c-ares/src/lib/ares_version.c \
|
||||||
|
deps/c-ares/src/lib/ares_gethostbyaddr.c \
|
||||||
|
deps/c-ares/src/lib/ares__addrinfo_localhost.c \
|
||||||
|
deps/c-ares/src/lib/ares_free_hostent.c \
|
||||||
|
deps/c-ares/src/lib/ares__close_sockets.c \
|
||||||
|
deps/c-ares/src/lib/ares_free_string.c \
|
||||||
|
deps/c-ares/src/lib/ares_init.c \
|
||||||
|
deps/c-ares/src/lib/ares_options.c \
|
||||||
|
deps/c-ares/src/lib/str/ares_strcasecmp.c \
|
||||||
|
deps/c-ares/src/lib/str/ares__buf.c \
|
||||||
|
deps/c-ares/src/lib/str/ares_strsplit.c \
|
||||||
|
deps/c-ares/src/lib/str/ares_str.c \
|
||||||
|
deps/c-ares/src/lib/ares_sysconfig_mac.c \
|
||||||
|
deps/c-ares/src/lib/ares__sortaddrinfo.c \
|
||||||
|
deps/c-ares/src/lib/ares_sysconfig_files.c \
|
||||||
|
deps/c-ares/src/lib/util/ares__iface_ips.c \
|
||||||
|
deps/c-ares/src/lib/util/ares__timeval.c \
|
||||||
|
deps/c-ares/src/lib/util/ares_math.c \
|
||||||
|
deps/c-ares/src/lib/util/ares_rand.c \
|
||||||
|
deps/c-ares/src/lib/util/ares__threads.c \
|
||||||
|
deps/c-ares/src/lib/ares_query.c \
|
||||||
|
deps/c-ares/src/lib/ares_cookie.c \
|
||||||
|
deps/c-ares/src/lib/inet_net_pton.c \
|
||||||
|
deps/c-ares/src/lib/inet_ntop.c \
|
||||||
|
deps/c-ares/src/lib/ares_library_init.c \
|
||||||
|
deps/c-ares/src/lib/ares_android.c \
|
||||||
|
deps/c-ares/src/lib/ares_sysconfig_win.c \
|
||||||
|
deps/c-ares/src/lib/ares_timeout.c
|
||||||
|
ARES_OBJS := $(call get_objs,ARES_SOURCES)
|
||||||
|
$(ARES_OBJS): CFLAGS += \
|
||||||
|
-Ideps/c-ares/include \
|
||||||
|
-Ideps/c-ares/src/lib \
|
||||||
|
-Ideps/c-ares_config/ \
|
||||||
|
-D_GNU_SOURCE \
|
||||||
|
-Wno-unused-function \
|
||||||
|
-Wno-deprecated-declarations \
|
||||||
|
-Wno-unused-result
|
||||||
|
|
||||||
BLOWFISH_SOURCES := \
|
BLOWFISH_SOURCES := \
|
||||||
deps/crypt_blowfish/crypt_blowfish.c \
|
deps/crypt_blowfish/crypt_blowfish.c \
|
||||||
deps/crypt_blowfish/crypt_gensalt.c \
|
deps/crypt_blowfish/crypt_gensalt.c \
|
||||||
@ -386,6 +502,8 @@ $(UV_OBJS): CFLAGS += \
|
|||||||
-Wno-unused-but-set-variable \
|
-Wno-unused-but-set-variable \
|
||||||
-Wno-unused-result \
|
-Wno-unused-result \
|
||||||
-Wno-unused-variable
|
-Wno-unused-variable
|
||||||
|
$(UV_OBJS): CFLAGS += -fno-lto
|
||||||
|
$(filter out/win%,$(UV_OBJS)): CFLAGS += -Wno-cast-function-type
|
||||||
ifeq ($(UNAME_S),Linux)
|
ifeq ($(UNAME_S),Linux)
|
||||||
$(UV_OBJS): CFLAGS += \
|
$(UV_OBJS): CFLAGS += \
|
||||||
-D_GNU_SOURCE
|
-D_GNU_SOURCE
|
||||||
@ -461,6 +579,7 @@ ifneq ($(UNAME_S),OpenBSD)
|
|||||||
$(filter-out $(BUILD_DIR)/win%,$(SODIUM_OBJS)): CFLAGS += \
|
$(filter-out $(BUILD_DIR)/win%,$(SODIUM_OBJS)): CFLAGS += \
|
||||||
-DHAVE_ALLOCA_H
|
-DHAVE_ALLOCA_H
|
||||||
endif
|
endif
|
||||||
|
$(SODIUM_OBJS): CFLAGS := $(filter-out -flto,$(CFLAGS))
|
||||||
|
|
||||||
SQLITE_SOURCES := deps/sqlite/sqlite3.c
|
SQLITE_SOURCES := deps/sqlite/sqlite3.c
|
||||||
SQLITE_OBJS := $(call get_objs,SQLITE_SOURCES)
|
SQLITE_OBJS := $(call get_objs,SQLITE_SOURCES)
|
||||||
@ -620,6 +739,7 @@ all: $(BUILD_TYPES)
|
|||||||
|
|
||||||
ALL_APP_OBJS := \
|
ALL_APP_OBJS := \
|
||||||
$(APP_OBJS) \
|
$(APP_OBJS) \
|
||||||
|
$(ARES_OBJS) \
|
||||||
$(BLOWFISH_OBJS) \
|
$(BLOWFISH_OBJS) \
|
||||||
$(LIBBACKTRACE_OBJS) \
|
$(LIBBACKTRACE_OBJS) \
|
||||||
$(MINIUNZIP_OBJS) \
|
$(MINIUNZIP_OBJS) \
|
||||||
@ -684,20 +804,37 @@ out/res/drawable_icon.xml.flat: src/android/res/drawable/icon.xml
|
|||||||
@$(ANDROID_BUILD_TOOLS)/aapt2 compile -o out/res/ src/android/res/drawable/icon.xml
|
@$(ANDROID_BUILD_TOOLS)/aapt2 compile -o out/res/ src/android/res/drawable/icon.xml
|
||||||
|
|
||||||
out/apk/res.apk out/gen/com/unprompted/tildefriends/R.java: out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat src/android/AndroidManifest.xml
|
out/apk/res.apk out/gen/com/unprompted/tildefriends/R.java: out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat src/android/AndroidManifest.xml
|
||||||
@mkdir -p $(dir $@)
|
@echo [aapt2 link] res.apk
|
||||||
@$(ANDROID_BUILD_TOOLS)/aapt2 link -I $(ANDROID_PLATFORM)/android.jar out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat --manifest src/android/AndroidManifest.xml -o out/apk/res.apk --java out/gen/
|
@mkdir -p out/apk/
|
||||||
|
@$(ANDROID_BUILD_TOOLS)/aapt2 link -I $(ANDROID_PLATFORM)/android.jar out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat \
|
||||||
|
--min-sdk-version $(ANDROID_MIN_SDK_VERSION) \
|
||||||
|
--target-sdk-version $(ANDROID_TARGET_SDK_VERSION) \
|
||||||
|
--manifest src/android/AndroidManifest.xml \
|
||||||
|
-o out/apk/res.apk \
|
||||||
|
--java out/gen/
|
||||||
|
|
||||||
|
out/apk/res.fdroid.apk out/gen_fdroid/com/unprompted/tildefriends/R.java: out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat src/android/AndroidManifest.xml
|
||||||
|
@echo [aapt2 link] res.fdroid.apk
|
||||||
|
@mkdir -p out/apk/
|
||||||
|
@$(ANDROID_BUILD_TOOLS)/aapt2 link -I $(ANDROID_PLATFORM)/android.jar out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat \
|
||||||
|
--min-sdk-version $(ANDROID_MIN_SDK_VERSION) \
|
||||||
|
--target-sdk-version $(ANDROID_TARGET_SDK_VERSION) \
|
||||||
|
--rename-manifest-package com.unprompted.tildefriends.fdroid \
|
||||||
|
--manifest src/android/AndroidManifest.xml \
|
||||||
|
-o out/apk/res.fdroid.apk \
|
||||||
|
--java out/gen_fdroid/
|
||||||
|
|
||||||
JAVA_FILES := out/gen/com/unprompted/tildefriends/R.java $(wildcard src/android/com/unprompted/tildefriends/*.java)
|
JAVA_FILES := out/gen/com/unprompted/tildefriends/R.java $(wildcard src/android/com/unprompted/tildefriends/*.java)
|
||||||
CLASS_FILES := $(foreach src,$(JAVA_FILES),out/classes/com/unprompted/tildefriends/$(notdir $(src:.java=.class)))
|
CLASS_FILES := $(foreach src,$(JAVA_FILES),out/classes/com/unprompted/tildefriends/$(notdir $(src:.java=.class)))
|
||||||
|
|
||||||
$(CLASS_FILES) &: $(JAVA_FILES)
|
$(CLASS_FILES) &: $(JAVA_FILES)
|
||||||
@echo "[javac] $(CLASS_FILES)"
|
@echo "[javac] $(CLASS_FILES)"
|
||||||
@javac --release 8 -Xlint:deprecation -classpath $(ANDROID_PLATFORM)/android.jar -d out/classes $(JAVA_FILES)
|
@javac --release 8 -encoding UTF-8 -Xlint:deprecation -XDuseUnsharedTable=true -classpath $(ANDROID_PLATFORM)/android.jar:$(ANDROID_BUILD_TOOLS)/core-lambda-stubs.jar -d out/classes $(JAVA_FILES)
|
||||||
|
|
||||||
out/apk/classes.dex: $(CLASS_FILES)
|
out/apk/classes.dex: $(CLASS_FILES)
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
@echo "[d8] $@"
|
@echo "[d8] $@"
|
||||||
@$(ANDROID_BUILD_TOOLS)/d8 --$(BUILD_TYPE) --lib $(ANDROID_PLATFORM)/android.jar --output $(dir $@) out/classes/com/unprompted/tildefriends/*.class
|
@$(ANDROID_BUILD_TOOLS)/d8 --lib $(ANDROID_PLATFORM)/android.jar --output $(dir $@) out/classes/com/unprompted/tildefriends/*.class
|
||||||
|
|
||||||
PACKAGE_DIRS := \
|
PACKAGE_DIRS := \
|
||||||
apps/ \
|
apps/ \
|
||||||
@ -706,25 +843,79 @@ PACKAGE_DIRS := \
|
|||||||
deps/prettier/ \
|
deps/prettier/ \
|
||||||
deps/lit/
|
deps/lit/
|
||||||
|
|
||||||
RAW_FILES := $(filter-out apps/blog% apps/issues% apps/welcome% apps/journal% %.map, $(shell find $(PACKAGE_DIRS) -type f))
|
RAW_FILES := $(sort $(filter-out apps/blog% apps/issues% apps/welcome% apps/journal% %.map, $(shell find $(PACKAGE_DIRS) -type f -not -name '.*')))
|
||||||
|
|
||||||
out/apk/TildeFriends-arm-debug.unsigned.apk: BUILD_TYPE := debug
|
out/apk/TildeFriends-arm-debug.unsigned.apk: BUILD_TYPE := debug
|
||||||
out/apk/TildeFriends-arm-release.unsigned.apk: BUILD_TYPE := release
|
out/apk/TildeFriends-arm-release.unsigned.apk: BUILD_TYPE := release
|
||||||
out/apk/TildeFriends-x86-debug.unsigned.apk: BUILD_TYPE := debug
|
out/apk/TildeFriends-x86-debug.unsigned.apk: BUILD_TYPE := debug
|
||||||
out/apk/TildeFriends-x86-release.unsigned.apk: BUILD_TYPE := release
|
out/apk/TildeFriends-x86-release.unsigned.apk: BUILD_TYPE := release
|
||||||
|
out/apk/TildeFriends-release.fdroid.unsigned.apk: BUILD_TYPE := release
|
||||||
|
|
||||||
out/apk/TildeFriends-arm-debug.unsigned.apk: out/apk/classes.dex out/androiddebug/tildefriends out/androiddebug-armv7a/tildefriends $(RAW_FILES) out/apk/res.apk
|
out/apk/TildeFriends-arm-debug.unsigned.apk: out/apk/classes.dex out/androiddebug/tildefriends out/androiddebug-armv7a/tildefriends $(RAW_FILES) out/apk/res.apk
|
||||||
out/apk/TildeFriends-arm-release.unsigned.apk: out/apk/classes.dex out/androidrelease/tildefriends out/androidrelease-armv7a/tildefriends $(RAW_FILES) out/apk/res.apk
|
out/apk/TildeFriends-arm-release.unsigned.apk: out/apk/classes.dex out/androidrelease/tildefriends out/androidrelease-armv7a/tildefriends $(RAW_FILES) out/apk/res.apk
|
||||||
out/apk/TildeFriends-x86-debug.unsigned.apk: out/apk/classes.dex out/androiddebug-x86_64/tildefriends out/androiddebug-x86/tildefriends $(RAW_FILES) out/apk/res.apk
|
out/apk/TildeFriends-x86-debug.unsigned.apk: out/apk/classes.dex out/androiddebug-x86_64/tildefriends out/androiddebug-x86/tildefriends $(RAW_FILES) out/apk/res.apk
|
||||||
out/apk/TildeFriends-x86-release.unsigned.apk: out/apk/classes.dex out/androidrelease-x86_64/tildefriends out/androidrelease-x86/tildefriends $(RAW_FILES) out/apk/res.apk
|
out/apk/TildeFriends-x86-release.unsigned.apk: out/apk/classes.dex out/androidrelease-x86_64/tildefriends out/androidrelease-x86/tildefriends $(RAW_FILES) out/apk/res.apk
|
||||||
|
out/apk/TildeFriends-release.fdroid.unsigned.apk: out/apk/classes.dex out/androidrelease/tildefriends out/androidrelease-armv7a/tildefriends out/androidrelease-x86_64/tildefriends out/androidrelease-x86/tildefriends $(RAW_FILES) out/apk/res.fdroid.apk
|
||||||
|
|
||||||
|
$(BUNDLETOOL):
|
||||||
|
@echo [curl] $(BUNDLETOOL_URL) TO $@
|
||||||
|
@curl -q -L --create-dirs -o $@ $(BUNDLETOOL_URL)
|
||||||
|
|
||||||
|
out/TildeFriends.aab: out/apk/classes.dex $(filter-out %debug%, $(ANDROID_TARGETS)) $(RAW_FILES) out/apk/res.apk src/android/AndroidManifest.xml $(BUNDLETOOL)
|
||||||
|
@rm -rf out/aab/staging/
|
||||||
|
@mkdir -p out/aab/staging
|
||||||
|
@$(ANDROID_BUILD_TOOLS)/aapt2 link --proto-format -o out/aab/temporary.apk \
|
||||||
|
-I $(ANDROID_PLATFORM)/android.jar \
|
||||||
|
--min-sdk-version $(ANDROID_MIN_SDK_VERSION) \
|
||||||
|
--target-sdk-version $(ANDROID_TARGET_SDK_VERSION) \
|
||||||
|
--manifest src/android/AndroidManifest.xml \
|
||||||
|
-R out/res/layout_activity_main.xml.flat \
|
||||||
|
-R out/res/drawable_icon.xml.flat \
|
||||||
|
--auto-add-overlay
|
||||||
|
@unzip out/aab/temporary.apk -d out/aab/staging/
|
||||||
|
@mkdir -p out/aab/staging/root/deps
|
||||||
|
@mkdir -p out/aab/staging/classes
|
||||||
|
@mkdir -p out/aab/staging/dex
|
||||||
|
@mkdir -p out/aab/staging/manifest
|
||||||
|
@mv out/aab/staging/AndroidManifest.xml out/aab/staging/manifest/AndroidManifest.xml
|
||||||
|
@cp out/apk/classes.dex out/aab/staging/dex/
|
||||||
|
@rm -fv out/base.zip
|
||||||
|
@mkdir -p out/aab/staging/lib/arm64-v8a out/aab/staging/lib/armeabi-v7a out/aab/staging/lib/x86_64 out/aab/staging/lib/x86
|
||||||
|
@cp out/androidrelease/tildefriends out/aab/staging/lib/arm64-v8a/libtildefriends.so
|
||||||
|
@cp out/androidrelease-armv7a/tildefriends out/aab/staging/lib/armeabi-v7a/libtildefriends.so
|
||||||
|
@cp out/androidrelease-x86_64/tildefriends out/aab/staging/lib/x86_64/libtildefriends.so
|
||||||
|
@cp out/androidrelease-x86/tildefriends out/aab/staging/lib/x86/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/aab/staging/lib/arm64-v8a/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/aab/staging/lib/armeabi-v7a/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/aab/staging/lib/x86_64/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/aab/staging/lib/x86/libtildefriends.so
|
||||||
|
@cp -r apps/ out/aab/staging/root/
|
||||||
|
@rm -rf out/aab/staging/root/apps/welcome*
|
||||||
|
@cp -r core/ out/aab/staging/root/
|
||||||
|
@cp -r deps/prettier/ out/aab/staging/root/deps/
|
||||||
|
@cp -r deps/lit/ out/aab/staging/root/deps/
|
||||||
|
@cp -r deps/codemirror/ out/aab/staging/root/deps/
|
||||||
|
@cd out/aab/staging/; zip -r ../base.zip *; cd ../../../
|
||||||
|
@java -jar $(BUNDLETOOL) build-bundle --overwrite --config=src/android/BundleConfig.json --modules=out/aab/base.zip --output=$@
|
||||||
|
@jarsigner -keystore .keys/android.jks $@ androidKey -storepass android
|
||||||
|
|
||||||
|
aab: out/TildeFriends.aab
|
||||||
|
.PHONY: aab
|
||||||
|
|
||||||
|
out/TildeFriends.apks: out/TildeFriends.aab $(BUNDLETOOL)
|
||||||
|
@java -jar $(BUNDLETOOL) build-apks --bundle out/TildeFriends.aab --overwrite --output $@ --ks .keys/android.jks --ks-key-alias androidKey --ks-pass pass:android
|
||||||
|
|
||||||
|
aabgo: out/TildeFriends.apks $(BUNDLETOOL)
|
||||||
|
@java -jar $(BUNDLETOOL) install-apks --apks out/TildeFriends.apks
|
||||||
|
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
|
||||||
|
|
||||||
out/apk/TildeFriends-arm-%.unsigned.apk:
|
out/apk/TildeFriends-arm-%.unsigned.apk:
|
||||||
@mkdir -p $(dir $@) out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/ out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/
|
@mkdir -p $(dir $@) out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/ out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/
|
||||||
@echo "[aapt] $@"
|
@echo "[aapt] $@"
|
||||||
@cp out/android$(BUILD_TYPE)/tildefriends out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/tildefriends.so
|
@cp out/android$(BUILD_TYPE)/tildefriends out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/libtildefriends.so
|
||||||
@cp out/android$(BUILD_TYPE)-armv7a/tildefriends out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/tildefriends.so
|
@cp out/android$(BUILD_TYPE)-armv7a/tildefriends out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/libtildefriends.so
|
||||||
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/tildefriends.so
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-arm-$(BUILD_TYPE)/lib/arm64-v8a/libtildefriends.so
|
||||||
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/tildefriends.so
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-arm-$(BUILD_TYPE)/lib/armeabi-v7a/libtildefriends.so
|
||||||
@cp out/apk/res.apk $@.zip
|
@cp out/apk/res.apk $@.zip
|
||||||
@cp out/apk/classes.dex out/apk-arm-$(BUILD_TYPE)/
|
@cp out/apk/classes.dex out/apk-arm-$(BUILD_TYPE)/
|
||||||
@cd out/apk-arm-$(BUILD_TYPE) && zip -u ../../$@.zip -q -9 -r . && cd ../../
|
@cd out/apk-arm-$(BUILD_TYPE) && zip -u ../../$@.zip -q -9 -r . && cd ../../
|
||||||
@ -734,16 +925,38 @@ out/apk/TildeFriends-arm-%.unsigned.apk:
|
|||||||
out/apk/TildeFriends-x86-%.unsigned.apk:
|
out/apk/TildeFriends-x86-%.unsigned.apk:
|
||||||
@mkdir -p $(dir $@) out/apk-x86-$(BUILD_TYPE)/lib/x86_64/ out/apk-x86-$(BUILD_TYPE)/lib/x86/
|
@mkdir -p $(dir $@) out/apk-x86-$(BUILD_TYPE)/lib/x86_64/ out/apk-x86-$(BUILD_TYPE)/lib/x86/
|
||||||
@echo "[aapt] $@"
|
@echo "[aapt] $@"
|
||||||
@cp out/android$(BUILD_TYPE)-x86_64/tildefriends out/apk-x86-$(BUILD_TYPE)/lib/x86_64/tildefriends.so
|
@cp out/android$(BUILD_TYPE)-x86_64/tildefriends out/apk-x86-$(BUILD_TYPE)/lib/x86_64/libtildefriends.so
|
||||||
@cp out/android$(BUILD_TYPE)-x86/tildefriends out/apk-x86-$(BUILD_TYPE)/lib/x86/tildefriends.so
|
@cp out/android$(BUILD_TYPE)-x86/tildefriends out/apk-x86-$(BUILD_TYPE)/lib/x86/libtildefriends.so
|
||||||
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-x86-$(BUILD_TYPE)/lib/x86_64/tildefriends.so
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-x86-$(BUILD_TYPE)/lib/x86_64/libtildefriends.so
|
||||||
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-x86-$(BUILD_TYPE)/lib/x86/tildefriends.so
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-x86-$(BUILD_TYPE)/lib/x86/libtildefriends.so
|
||||||
@cp out/apk/res.apk $@.zip
|
@cp out/apk/res.apk $@.zip
|
||||||
@cp out/apk/classes.dex out/apk-x86-$(BUILD_TYPE)/
|
@cp out/apk/classes.dex out/apk-x86-$(BUILD_TYPE)/
|
||||||
@cd out/apk-x86-$(BUILD_TYPE) && zip -u ../../$@.zip -q -9 -r . && cd ../../
|
@cd out/apk-x86-$(BUILD_TYPE) && zip -u ../../$@.zip -q -9 -r . && cd ../../
|
||||||
@zip -u $@.zip -q -9 $(RAW_FILES)
|
@zip -u $@.zip -q -9 $(RAW_FILES)
|
||||||
@$(ANDROID_BUILD_TOOLS)/zipalign -f 4 $@.zip $@
|
@$(ANDROID_BUILD_TOOLS)/zipalign -f 4 $@.zip $@
|
||||||
|
|
||||||
|
out/apk/TildeFriends-%.fdroid.unsigned.apk:
|
||||||
|
@rm -rf out/apk-fdroid-$(BUILD_TYPE) out/apk-fdroid-$(BUILD_TYPE)-raw
|
||||||
|
@mkdir -p $(dir $@) out/apk-fdroid-$(BUILD_TYPE)/lib/x86_64/ out/apk-fdroid-$(BUILD_TYPE)/lib/x86/ out/apk-fdroid-$(BUILD_TYPE)/lib/arm64-v8a/ out/apk-fdroid-$(BUILD_TYPE)/lib/armeabi-v7a/
|
||||||
|
@echo "[aapt] $@"
|
||||||
|
@cp out/android$(BUILD_TYPE)-x86_64/tildefriends out/apk-fdroid-$(BUILD_TYPE)/lib/x86_64/libtildefriends.so
|
||||||
|
@cp out/android$(BUILD_TYPE)-x86/tildefriends out/apk-fdroid-$(BUILD_TYPE)/lib/x86/libtildefriends.so
|
||||||
|
@cp out/android$(BUILD_TYPE)/tildefriends out/apk-fdroid-$(BUILD_TYPE)/lib/arm64-v8a/libtildefriends.so
|
||||||
|
@cp out/android$(BUILD_TYPE)-armv7a/tildefriends out/apk-fdroid-$(BUILD_TYPE)/lib/armeabi-v7a/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-fdroid-$(BUILD_TYPE)/lib/x86_64/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-fdroid-$(BUILD_TYPE)/lib/x86/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-fdroid-$(BUILD_TYPE)/lib/arm64-v8a/libtildefriends.so
|
||||||
|
@$(ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip out/apk-fdroid-$(BUILD_TYPE)/lib/armeabi-v7a/libtildefriends.so
|
||||||
|
@cp out/apk/res.fdroid.apk $@.zip
|
||||||
|
@cp out/apk/classes.dex out/apk-fdroid-$(BUILD_TYPE)/classes.dex
|
||||||
|
@touch -d @0 out/apk-fdroid-$(BUILD_TYPE)/classes.dex out/apk-fdroid-$(BUILD_TYPE)/lib/*/libtildefriends.so
|
||||||
|
@chmod 755 out/apk-fdroid-$(BUILD_TYPE)/classes.dex out/apk-fdroid-$(BUILD_TYPE)/lib/*/libtildefriends.so
|
||||||
|
@cd out/apk-fdroid-$(BUILD_TYPE) && zip -X -u ../../$@.zip -q classes.dex lib/*/libtildefriends.so && cd ../../
|
||||||
|
@mkdir out/apk-fdroid-$(BUILD_TYPE)-raw
|
||||||
|
@for i in $(RAW_FILES); do mkdir -p $$(dirname out/apk-fdroid-$(BUILD_TYPE)-raw/$$i) && cp $$i out/apk-fdroid-$(BUILD_TYPE)-raw/$$i && touch -d @0 out/apk-fdroid-$(BUILD_TYPE)-raw/$$i && chmod 644 out/apk-fdroid-$(BUILD_TYPE)-raw/$$i; done
|
||||||
|
@cd out/apk-fdroid-$(BUILD_TYPE)-raw && zip -X -u ../../$@.zip -q $(RAW_FILES) && cd ../../
|
||||||
|
@$(ANDROID_BUILD_TOOLS)/zipalign -f 4 $@.zip $@
|
||||||
|
|
||||||
out/%.apk: out/apk/%.unsigned.apk
|
out/%.apk: out/apk/%.unsigned.apk
|
||||||
@echo "[apksigner] $(notdir $@)"
|
@echo "[apksigner] $(notdir $@)"
|
||||||
@$(ANDROID_BUILD_TOOLS)/apksigner sign --ks .keys/android.jks --ks-key-alias androidKey --ks-pass pass:android --key-pass pass:android --min-sdk-version $(ANDROID_MIN_SDK_VERSION) --out $@ $<
|
@$(ANDROID_BUILD_TOOLS)/apksigner sign --ks .keys/android.jks --ks-key-alias androidKey --ks-pass pass:android --key-pass pass:android --min-sdk-version $(ANDROID_MIN_SDK_VERSION) --out $@ $<
|
||||||
@ -756,9 +969,14 @@ out/%.zopfli.apk: out/%.apk
|
|||||||
release-apk: out/TildeFriends-arm-release.zopfli.apk out/TildeFriends-x86-release.zopfli.apk
|
release-apk: out/TildeFriends-arm-release.zopfli.apk out/TildeFriends-x86-release.zopfli.apk
|
||||||
.PHONY: release-apk
|
.PHONY: release-apk
|
||||||
|
|
||||||
|
apkgo: out/TildeFriends-arm-debug.apk
|
||||||
|
@adb install -r $<
|
||||||
|
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
|
||||||
|
.PHONY: apkgo
|
||||||
|
|
||||||
releaseapkgo: out/TildeFriends-arm-release.apk
|
releaseapkgo: out/TildeFriends-arm-release.apk
|
||||||
@adb install -r $<
|
@adb install -r $<
|
||||||
@adb shell am start com.unprompted.tildefriends/.MainActivity
|
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
|
||||||
.PHONY: releaseapkgo
|
.PHONY: releaseapkgo
|
||||||
|
|
||||||
# iOS Support
|
# iOS Support
|
||||||
@ -792,6 +1010,10 @@ out/%/tildefriends.standalone: out/%/tildefriends out/data.zip
|
|||||||
@echo "[standalone] $@"
|
@echo "[standalone] $@"
|
||||||
@cat $< out/data.zip > $@
|
@cat $< out/data.zip > $@
|
||||||
@chmod +x $@
|
@chmod +x $@
|
||||||
|
out/%/tildefriends.standalone.exe: out/%/tildefriends.exe out/data.zip
|
||||||
|
@echo "[standalone] $@"
|
||||||
|
@cat $< out/data.zip > $@
|
||||||
|
@chmod +x $@
|
||||||
|
|
||||||
iossimdebug-app: out/tildefriends-iossimdebug.app/tildefriends
|
iossimdebug-app: out/tildefriends-iossimdebug.app/tildefriends
|
||||||
iossimrelease-app: out/tildefriends-iossimrelease.app/tildefriends
|
iossimrelease-app: out/tildefriends-iossimrelease.app/tildefriends
|
||||||
@ -815,10 +1037,6 @@ apklog:
|
|||||||
.PHONY: apklog
|
.PHONY: apklog
|
||||||
|
|
||||||
fetchdeps:
|
fetchdeps:
|
||||||
@echo "[fetch] libuv"
|
|
||||||
@test -f out/deps/libuv.tar.gz && test "$$(cat out/deps/libuv.txt 2>/dev/null)" = $(LIBUV_URL) || (mkdir -p out/deps/ && curl -q $(LIBUV_URL) -o out/deps/libuv.tar.gz)
|
|
||||||
@test -d deps/libuv/ && test "$$(cat out/deps/libuv.txt 2>/dev/null)" = $(LIBUV_URL) || (rm -rf deps/libuv/ && mkdir -p deps/libuv/ && tar -C deps/libuv/ -m --strip=1 -xf out/deps/libuv.tar.gz)
|
|
||||||
@echo -n $(LIBUV_URL) > out/deps/libuv.txt
|
|
||||||
@echo "[fetch] sqlite"
|
@echo "[fetch] sqlite"
|
||||||
@test -f out/deps/sqlite.zip && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p out/deps/ && curl -q $(SQLITE_URL) -o out/deps/sqlite.zip)
|
@test -f out/deps/sqlite.zip && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p out/deps/ && curl -q $(SQLITE_URL) -o out/deps/sqlite.zip)
|
||||||
@test -d deps/sqlite/ && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p deps/sqlite/ && unzip -qDjo -d deps/sqlite/ out/deps/sqlite.zip)
|
@test -d deps/sqlite/ && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p deps/sqlite/ && unzip -qDjo -d deps/sqlite/ out/deps/sqlite.zip)
|
||||||
@ -832,7 +1050,7 @@ fetchdeps:
|
|||||||
|
|
||||||
ANDROID_DEPS := deps/openssl/android/arm64-v8a/usr/local/lib/libssl.a
|
ANDROID_DEPS := deps/openssl/android/arm64-v8a/usr/local/lib/libssl.a
|
||||||
$(ANDROID_DEPS):
|
$(ANDROID_DEPS):
|
||||||
+@tools/ssl-android
|
+@ANDROID_NDK_ROOT=$(ANDROID_NDK) tools/ssl-android
|
||||||
$(filter $(BUILD_DIR)/android%,$(APP_OBJS)): | $(ANDROID_DEPS)
|
$(filter $(BUILD_DIR)/android%,$(APP_OBJS)): | $(ANDROID_DEPS)
|
||||||
|
|
||||||
ifeq ($(HAVE_WIN),1)
|
ifeq ($(HAVE_WIN),1)
|
||||||
@ -849,15 +1067,28 @@ $(IOS_DEPS):
|
|||||||
$(filter $(BUILD_DIR)/ios%,$(APP_OBJS)): | $(IOS_DEPS)
|
$(filter $(BUILD_DIR)/ios%,$(APP_OBJS)): | $(IOS_DEPS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
out/Tilde_Friends-x86_64.AppImage: out/release/tildefriends out/data.zip
|
||||||
|
@mkdir -p out/AppDir/usr/bin
|
||||||
|
@mkdir -p out/AppDir/usr/share/applications
|
||||||
|
@mkdir -p out/AppDir/usr/share/icons/hicolor/scalable/apps
|
||||||
|
@echo "[Desktop Entry]\nName=Tilde Friends\nExec=tildefriends\nIcon=tildefriends\nType=Application\nCategories=Network" > out/AppDir/usr/share/applications/tildefriends.desktop
|
||||||
|
@cp src/ios/tildefriends.svg out/AppDir/usr/share/icons/hicolor/scalable/apps/
|
||||||
|
@cat out/release/tildefriends out/data.zip > out/AppDir/usr/bin/tildefriends
|
||||||
|
@chmod +x out/AppDir/usr/bin/tildefriends
|
||||||
|
@unset SOURCE_DATE_EPOCH; cd out; linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage; cd ..
|
||||||
|
|
||||||
|
appimage: out/Tilde_Friends-x86_64.AppImage
|
||||||
|
.PHONY: appimage
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIR)
|
rm -rf $(BUILD_DIR)
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
|
||||||
dist: release-apk iosrelease-ipa
|
tarball:
|
||||||
@echo [archive] dist/tildefriends-$(VERSION_NUMBER).tar.xz
|
@echo [archive] out/tildefriends-$(VERSION_NUMBER).tar.xz
|
||||||
@rm -rf out/tildefriends-$(VERSION_NUMBER)
|
@rm -rf out/tildefriends-$(VERSION_NUMBER)
|
||||||
@mkdir -p dist/ out/tildefriends-$(VERSION_NUMBER)
|
@mkdir -p out/tildefriends-$(VERSION_NUMBER)
|
||||||
@git archive HEAD | tar -x -C out/tildefriends-$(VERSION_NUMBER)
|
@git ls-files --recurse-submodules | tar -c -T- | tar -x -C out/tildefriends-$(VERSION_NUMBER)
|
||||||
@tar \
|
@tar \
|
||||||
--exclude=apps/welcome* \
|
--exclude=apps/welcome* \
|
||||||
--exclude=deps/libbacktrace/Isaac.Newton-Opticks.txt \
|
--exclude=deps/libbacktrace/Isaac.Newton-Opticks.txt \
|
||||||
@ -873,15 +1104,29 @@ dist: release-apk iosrelease-ipa
|
|||||||
--exclude=deps/sqlite/shell.c \
|
--exclude=deps/sqlite/shell.c \
|
||||||
--exclude=deps/zlib/contrib/vstudio \
|
--exclude=deps/zlib/contrib/vstudio \
|
||||||
--exclude=deps/zlib/doc \
|
--exclude=deps/zlib/doc \
|
||||||
-caf dist/tildefriends-$(VERSION_NUMBER).tar.xz \
|
-caf out/tildefriends-$(VERSION_NUMBER).tar.xz \
|
||||||
-C out/ \
|
-C out/ \
|
||||||
tildefriends-$(VERSION_NUMBER)
|
tildefriends-$(VERSION_NUMBER)
|
||||||
|
.PHONY: tarball
|
||||||
|
|
||||||
|
dist: release-apk iosrelease-ipa aab $(if $(HAVE_WIN), out/winrelease/tildefriends.standalone.exe) out/TildeFriends-release.fdroid.apk appimage
|
||||||
|
@mkdir -p dist/
|
||||||
|
@echo "[cp] tildefriends-$(VERSION_NUMBER).tar.xz"
|
||||||
|
@cp out/tildefriends-$(VERSION_NUMBER).tar.xz dist/tildefriends-$(VERSION_NUMBER).tar.xz
|
||||||
@echo "[cp] TildeFriends-x86-$(VERSION_NUMBER).apk"
|
@echo "[cp] TildeFriends-x86-$(VERSION_NUMBER).apk"
|
||||||
@cp out/TildeFriends-x86-release.zopfli.apk dist/TildeFriends-x86-$(VERSION_NUMBER).apk
|
@cp out/TildeFriends-x86-release.zopfli.apk dist/TildeFriends-x86-$(VERSION_NUMBER).apk
|
||||||
@echo "[cp] TildeFriends-arm-$(VERSION_NUMBER).apk"
|
@echo "[cp] TildeFriends-arm-$(VERSION_NUMBER).apk"
|
||||||
@cp out/TildeFriends-arm-release.zopfli.apk dist/TildeFriends-arm-$(VERSION_NUMBER).apk
|
@cp out/TildeFriends-arm-release.zopfli.apk dist/TildeFriends-arm-$(VERSION_NUMBER).apk
|
||||||
@echo "[cp] TildeFriends-$(VERSION_NUMBER).ipa"
|
@echo "[cp] TildeFriends-$(VERSION_NUMBER).ipa"
|
||||||
@cp out/tildefriends-release.ipa dist/TildeFriends-$(VERSION_NUMBER).ipa
|
@cp out/tildefriends-release.ipa dist/TildeFriends-$(VERSION_NUMBER).ipa
|
||||||
|
@test $(HAVE_WIN) && echo "[cp] tildefriends-$(VERSION_NUMBER).exe"
|
||||||
|
@test $(HAVE_WIN) && cp out/winrelease/tildefriends.standalone.exe dist/tildefriends-$(VERSION_NUMBER).exe
|
||||||
|
@echo "[cp] TildeFriends-$(VERSION_NUMBER).aab"
|
||||||
|
@cp out/TildeFriends.aab dist/TildeFriends-$(VERSION_NUMBER).aab
|
||||||
|
@echo "[cp] TildeFriends-$(VERSION_NUMBER).fdroid.apk"
|
||||||
|
@cp out/TildeFriends-release.fdroid.apk dist/TildeFriends-$(VERSION_NUMBER).fdroid.apk
|
||||||
|
@echo "[cp] TildeFriends-x86_64-$(VERSION_NUMBER).AppImage"
|
||||||
|
@cp out/Tilde_Friends-x86_64.AppImage dist/TildeFriends-x86_64-$(VERSION_NUMBER).AppImage
|
||||||
.PHONY: dist
|
.PHONY: dist
|
||||||
|
|
||||||
dist-test: dist
|
dist-test: dist
|
||||||
@ -902,3 +1147,6 @@ prettier:
|
|||||||
docs:
|
docs:
|
||||||
@doxygen
|
@doxygen
|
||||||
.PHONY: docs
|
.PHONY: docs
|
||||||
|
|
||||||
|
fdroid: out/apk/TildeFriends-release.fdroid.unsigned.apk
|
||||||
|
.PHONY: fdroid
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "🎛"
|
"emoji": "🎛",
|
||||||
|
"previous": "&R49FywYF8CXPhoSEydLbSCgvCddeyTiBwGuDU/gqY+M=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,38 @@
|
|||||||
<script>
|
<script>
|
||||||
const g_data = $data;
|
const g_data = $data;
|
||||||
</script>
|
</script>
|
||||||
|
<link rel="stylesheet" href="w3.css" />
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<style>
|
||||||
|
/* 2018 Valiant Poppy */
|
||||||
|
.w3-theme-l5 {color:#000 !important; background-color:#fbf3f3 !important}
|
||||||
|
.w3-theme-l4 {color:#000 !important; background-color:#f3d7d6 !important}
|
||||||
|
.w3-theme-l3 {color:#000 !important; background-color:#e6afae !important}
|
||||||
|
.w3-theme-l2 {color:#fff !important; background-color:#da8785 !important}
|
||||||
|
.w3-theme-l1 {color:#fff !important; background-color:#cd5f5d !important}
|
||||||
|
.w3-theme-d1 {color:#fff !important; background-color:#a93634 !important}
|
||||||
|
.w3-theme-d2 {color:#fff !important; background-color:#96302e !important}
|
||||||
|
.w3-theme-d3 {color:#fff !important; background-color:#832a28 !important}
|
||||||
|
.w3-theme-d4 {color:#fff !important; background-color:#702423 !important}
|
||||||
|
.w3-theme-d5 {color:#fff !important; background-color:#5e1e1d !important}
|
||||||
|
|
||||||
|
.w3-theme-light {color:#000 !important; background-color:#fbf3f3 !important}
|
||||||
|
.w3-theme-dark {color:#fff !important; background-color:#5e1e1d !important}
|
||||||
|
.w3-theme-action {color:#fff !important; background-color:#5e1e1d !important}
|
||||||
|
|
||||||
|
.w3-theme {color:#fff !important; background-color:#bd3d3a !important}
|
||||||
|
.w3-text-theme {color:#bd3d3a !important}
|
||||||
|
.w3-border-theme {border-color:#bd3d3a !important}
|
||||||
|
|
||||||
|
.w3-hover-theme:hover {color:#fff !important; background-color:#bd3d3a !important}
|
||||||
|
.w3-hover-text-theme:hover {color:#bd3d3a !important}
|
||||||
|
.w3-hover-border-theme:hover {border-color:#bd3d3a !important}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body style="color: #fff; width: 100%">
|
<body class="w3-theme-l4">
|
||||||
|
<header class="w3-row w3-padding w3-header w3-theme-l1">
|
||||||
<h1>Tilde Friends Administration</h1>
|
<h1>Tilde Friends Administration</h1>
|
||||||
|
</header>
|
||||||
</body>
|
</body>
|
||||||
<script type="module" src="script.js"></script>
|
<script type="module" src="script.js"></script>
|
||||||
</html>
|
</html>
|
||||||
|
@ -27,64 +27,87 @@ function global_settings_set(key, value) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function title_case(name) {
|
||||||
|
return name
|
||||||
|
.split('_')
|
||||||
|
.map((x) => x.charAt(0).toUpperCase() + x.substring(1))
|
||||||
|
.join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
window.addEventListener('load', function () {
|
window.addEventListener('load', function () {
|
||||||
const permission_template = (permission) => html` <code>${permission}</code>`;
|
const permission_template = (permission) => html` <code>${permission}</code>`;
|
||||||
function input_template(key, description) {
|
function input_template(key, description) {
|
||||||
if (description.type === 'boolean') {
|
if (description.type === 'boolean') {
|
||||||
return html`
|
return html`
|
||||||
<div style="margin-top: 1em">
|
<li class="w3-row">
|
||||||
<label for=${'gs_' + key} style="font-weight: bold">${key}: </label>
|
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold">${title_case(key)}</label>
|
||||||
<div>
|
<div class="w3-quarter w3-padding">${description.description}</div>
|
||||||
<input type="checkbox" ?checked=${description.value} id=${'gs_' + key}></input>
|
<div class="w3-quarter w3-padding w3-center"><input class="w3-check" type="checkbox" ?checked=${description.value} id=${'gs_' + key}></input></div>
|
||||||
<button @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.checked)}>Set</button>
|
<button class="w3-quarter w3-button w3-theme-action" @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.firstChild.checked)}>Set</button>
|
||||||
<div>${description.description}</div>
|
</li>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
`;
|
||||||
} else if (description.type === 'textarea') {
|
} else if (description.type === 'textarea') {
|
||||||
return html`
|
return html`
|
||||||
<div style="margin-top: 1em"">
|
<li class="w3-row">
|
||||||
<label for=${'gs_' + key} style="font-weight: bold">${key}: </label>
|
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold"
|
||||||
<div style="width: 100%; padding: 0; margin: 0">
|
>${title_case(key)}</label
|
||||||
<div style="width: 90%; padding: 0 margin: 0">
|
>
|
||||||
<textarea style="vertical-align: top; width: 100%" rows=20 cols=80 id=${'gs_' + key}>${description.value}</textarea>
|
<div class="w3-rest w3-padding">${description.description}</div>
|
||||||
</div>
|
<textarea
|
||||||
<button @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.firstElementChild.value)}>Set</button>
|
class="w3-input"
|
||||||
<div>${description.description}</div>
|
style="vertical-align: top; resize: vertical"
|
||||||
</div>
|
id=${'gs_' + key}
|
||||||
</div>
|
>
|
||||||
|
${description.value}</textarea
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="w3-button w3-right w3-quarter w3-theme-action"
|
||||||
|
@click=${(e) =>
|
||||||
|
global_settings_set(
|
||||||
|
key,
|
||||||
|
e.srcElement.previousElementSibling.value
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
Set
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
`;
|
`;
|
||||||
} else {
|
} else {
|
||||||
return html`
|
return html`
|
||||||
<div style="margin-top: 1em">
|
<li class="w3-row">
|
||||||
<label for=${'gs_' + key} style="font-weight: bold">${key}: </label>
|
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold">${title_case(key)}</label>
|
||||||
<div>
|
<div class="w3-quarter w3-padding">${description.description}</div>
|
||||||
<input type="text" value="${description.value}" id=${'gs_' + key}></input>
|
<input class="w3-input w3-quarter" type="text" value="${description.value}" id=${'gs_' + key}></input>
|
||||||
<button @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.value)}>Set</button>
|
<button class="w3-button w3-quarter w3-theme-action" @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.value)}>Set</button>
|
||||||
<div>${description.description}</div>
|
</li>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const user_template = (user, permissions) => html`
|
const user_template = (user, permissions) => html`
|
||||||
<li>
|
<li class="w3-card w3-margin">
|
||||||
<button @click=${(e) => delete_user(user)}>Delete</button>
|
<button
|
||||||
|
class="w3-button w3-theme-action"
|
||||||
|
@click=${(e) => delete_user(user)}
|
||||||
|
>
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
${user}: ${permissions.map((x) => permission_template(x))}
|
${user}: ${permissions.map((x) => permission_template(x))}
|
||||||
</li>
|
</li>
|
||||||
`;
|
`;
|
||||||
const users_template = (users) =>
|
const users_template = (users) =>
|
||||||
html`<h2>Users</h2>
|
html` <header class="w3-container w3-theme-l2"><h2>Users</h2></header>
|
||||||
<ul>
|
<ul class="w3-ul">
|
||||||
${Object.entries(users).map((u) => user_template(u[0], u[1]))}
|
${Object.entries(users).map((u) => user_template(u[0], u[1]))}
|
||||||
</ul>`;
|
</ul>`;
|
||||||
const page_template = (data) =>
|
const page_template = (data) =>
|
||||||
html`<div style="padding: 0; margin: 0; width: 100%; max-width: 100%">
|
html`<div style="padding: 0; margin: 0; width: 100%; max-width: 100%">
|
||||||
<h2>Global Settings</h2>
|
<header class="w3-container w3-theme-l2"><h2>Global Settings</h2></header>
|
||||||
<div>
|
<div class="w3-container">
|
||||||
|
<ul class="w3-ul">
|
||||||
${Object.keys(data.settings)
|
${Object.keys(data.settings)
|
||||||
.sort()
|
.sort()
|
||||||
.map((x) => html`${input_template(x, data.settings[x])}`)}
|
.map((x) => html`${input_template(x, data.settings[x])}`)}
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
${users_template(data.users)}
|
${users_template(data.users)}
|
||||||
</div> `;
|
</div> `;
|
||||||
|
235
apps/admin/w3.css
Normal file
235
apps/admin/w3.css
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */
|
||||||
|
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
|
||||||
|
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
|
||||||
|
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
|
||||||
|
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
|
||||||
|
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
|
||||||
|
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
|
||||||
|
a{background-color:transparent}a:active,a:hover{outline-width:0}
|
||||||
|
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
|
||||||
|
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
|
||||||
|
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
|
||||||
|
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
|
||||||
|
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
|
||||||
|
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
|
||||||
|
button,input{overflow:visible}button,select{text-transform:none}
|
||||||
|
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
|
||||||
|
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
|
||||||
|
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
|
||||||
|
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
|
||||||
|
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
|
||||||
|
[type=checkbox],[type=radio]{padding:0}
|
||||||
|
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
|
||||||
|
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
|
||||||
|
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
|
||||||
|
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
|
||||||
|
/* End extract */
|
||||||
|
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
|
||||||
|
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
|
||||||
|
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
|
||||||
|
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
|
||||||
|
hr{border:0;border-top:1px solid #eee;margin:20px 0}
|
||||||
|
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
|
||||||
|
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
|
||||||
|
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
|
||||||
|
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
|
||||||
|
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
|
||||||
|
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
|
||||||
|
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
|
||||||
|
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
|
||||||
|
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
|
||||||
|
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
|
||||||
|
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
|
||||||
|
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
|
||||||
|
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
|
||||||
|
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
|
||||||
|
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
|
||||||
|
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
|
||||||
|
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
|
||||||
|
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
|
||||||
|
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
|
||||||
|
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
|
||||||
|
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
|
||||||
|
.w3-main,#main{transition:margin-left .4s}
|
||||||
|
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
|
||||||
|
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
|
||||||
|
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
|
||||||
|
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
|
||||||
|
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
|
||||||
|
.w3-bar .w3-button{white-space:normal}
|
||||||
|
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
|
||||||
|
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
|
||||||
|
.w3-responsive{display:block;overflow-x:auto}
|
||||||
|
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
|
||||||
|
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
|
||||||
|
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
|
||||||
|
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
|
||||||
|
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
|
||||||
|
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
|
||||||
|
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
|
||||||
|
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
|
||||||
|
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
|
||||||
|
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
|
||||||
|
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
|
||||||
|
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
|
||||||
|
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
|
||||||
|
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
|
||||||
|
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
|
||||||
|
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
|
||||||
|
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
|
||||||
|
@media (max-width:1205px){.w3-auto{max-width:95%}}
|
||||||
|
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
|
||||||
|
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
|
||||||
|
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
|
||||||
|
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
|
||||||
|
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
|
||||||
|
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
|
||||||
|
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
|
||||||
|
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
|
||||||
|
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
|
||||||
|
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
|
||||||
|
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
|
||||||
|
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
|
||||||
|
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
|
||||||
|
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
|
||||||
|
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
|
||||||
|
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
|
||||||
|
.w3-display-position{position:absolute}
|
||||||
|
.w3-circle{border-radius:50%}
|
||||||
|
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
|
||||||
|
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
|
||||||
|
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
|
||||||
|
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
|
||||||
|
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
|
||||||
|
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
|
||||||
|
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
|
||||||
|
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
|
||||||
|
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
|
||||||
|
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
|
||||||
|
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
|
||||||
|
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
|
||||||
|
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
|
||||||
|
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
|
||||||
|
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
|
||||||
|
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
|
||||||
|
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
|
||||||
|
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
|
||||||
|
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
|
||||||
|
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
|
||||||
|
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
|
||||||
|
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
|
||||||
|
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
|
||||||
|
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
|
||||||
|
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
|
||||||
|
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
|
||||||
|
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
|
||||||
|
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
|
||||||
|
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
|
||||||
|
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
|
||||||
|
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
|
||||||
|
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
|
||||||
|
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
|
||||||
|
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
|
||||||
|
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
|
||||||
|
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
|
||||||
|
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
|
||||||
|
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
|
||||||
|
.w3-left{float:left!important}.w3-right{float:right!important}
|
||||||
|
.w3-button:hover{color:#000!important;background-color:#ccc!important}
|
||||||
|
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
|
||||||
|
.w3-hover-none:hover{box-shadow:none!important}
|
||||||
|
/* Colors */
|
||||||
|
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
|
||||||
|
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
|
||||||
|
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
|
||||||
|
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
|
||||||
|
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
|
||||||
|
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
|
||||||
|
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
|
||||||
|
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
|
||||||
|
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
|
||||||
|
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
|
||||||
|
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
|
||||||
|
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
|
||||||
|
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
|
||||||
|
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
|
||||||
|
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
|
||||||
|
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
|
||||||
|
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
|
||||||
|
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
|
||||||
|
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
|
||||||
|
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
|
||||||
|
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
|
||||||
|
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
|
||||||
|
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
|
||||||
|
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
|
||||||
|
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
|
||||||
|
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
|
||||||
|
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
|
||||||
|
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
|
||||||
|
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
|
||||||
|
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
|
||||||
|
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
|
||||||
|
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
|
||||||
|
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
|
||||||
|
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
|
||||||
|
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
|
||||||
|
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
|
||||||
|
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
|
||||||
|
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
|
||||||
|
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
|
||||||
|
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
|
||||||
|
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
|
||||||
|
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
|
||||||
|
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
|
||||||
|
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
|
||||||
|
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
|
||||||
|
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
|
||||||
|
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
|
||||||
|
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
|
||||||
|
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
|
||||||
|
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
|
||||||
|
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
|
||||||
|
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
|
||||||
|
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
|
||||||
|
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
|
||||||
|
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
|
||||||
|
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
|
||||||
|
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
|
||||||
|
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
|
||||||
|
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
|
||||||
|
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
|
||||||
|
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
|
||||||
|
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
|
||||||
|
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
|
||||||
|
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
|
||||||
|
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
|
||||||
|
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
|
||||||
|
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
|
||||||
|
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
|
||||||
|
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
|
||||||
|
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
|
||||||
|
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
|
||||||
|
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
|
||||||
|
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
|
||||||
|
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
|
||||||
|
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
|
||||||
|
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
|
||||||
|
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
|
||||||
|
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
|
||||||
|
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
|
||||||
|
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
|
||||||
|
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
|
||||||
|
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
|
||||||
|
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
|
||||||
|
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}
|
44
apps/blog/lit-all.min.js
vendored
44
apps/blog/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "🪪",
|
"emoji": "🪪",
|
||||||
"previous": "&kgukkyDk1RxgfzgMH6H/0QeDPIuwPZypLuAFax21ljk=.sha256"
|
"previous": "&zxsmzdLKsiG/WZt/Gw7JOxepgypoktNNbIyWiyFiJVc=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,38 @@ tfrpc.register(async function reload() {
|
|||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
let ids = await ssb.getIdentities();
|
let ids = await ssb.getIdentities();
|
||||||
|
let server_id = await ssb.getServerIdentity();
|
||||||
await app.setDocument(
|
await app.setDocument(
|
||||||
`<body style="color: #fff">
|
`
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="w3.css"></link>
|
||||||
|
<style>
|
||||||
|
/* "2018 Sargasso Sea" */
|
||||||
|
.w3-theme-l5 {color:#000 !important; background-color:#f3f4f7 !important}
|
||||||
|
.w3-theme-l4 {color:#000 !important; background-color:#d7dbe3 !important}
|
||||||
|
.w3-theme-l3 {color:#000 !important; background-color:#b0b6c8 !important}
|
||||||
|
.w3-theme-l2 {color:#fff !important; background-color:#8892ac !important}
|
||||||
|
.w3-theme-l1 {color:#fff !important; background-color:#636f8e !important}
|
||||||
|
.w3-theme-d1 {color:#fff !important; background-color:#40485c !important}
|
||||||
|
.w3-theme-d2 {color:#fff !important; background-color:#394052 !important}
|
||||||
|
.w3-theme-d3 {color:#fff !important; background-color:#323848 !important}
|
||||||
|
.w3-theme-d4 {color:#fff !important; background-color:#2b303d !important}
|
||||||
|
.w3-theme-d5 {color:#fff !important; background-color:#242833 !important}
|
||||||
|
|
||||||
|
.w3-theme-light {color:#000 !important; background-color:#f3f4f7 !important}
|
||||||
|
.w3-theme-dark {color:#fff !important; background-color:#242833 !important}
|
||||||
|
.w3-theme-action {color:#fff !important; background-color:#242833 !important}
|
||||||
|
|
||||||
|
.w3-theme {color:#fff !important; background-color:#485167 !important}
|
||||||
|
.w3-text-theme {color:#485167 !important}
|
||||||
|
.w3-border-theme {border-color:#485167 !important}
|
||||||
|
|
||||||
|
.w3-hover-theme:hover {color:#fff !important; background-color:#485167 !important}
|
||||||
|
.w3-hover-text-theme:hover {color:#485167 !important}
|
||||||
|
.w3-hover-border-theme:hover {border-color:#485167 !important}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="w3-theme-l3">
|
||||||
<script>const handler = {};</script>
|
<script>const handler = {};</script>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
import * as tfrpc from '/static/tfrpc.js';
|
||||||
@ -27,7 +57,8 @@ async function main() {
|
|||||||
let id = event.srcElement.dataset.id;
|
let id = event.srcElement.dataset.id;
|
||||||
let element = document.createElement('textarea');
|
let element = document.createElement('textarea');
|
||||||
element.value = await tfrpc.rpc.get_private_key(id);
|
element.value = await tfrpc.rpc.get_private_key(id);
|
||||||
element.style = 'width: 100%; read-only: true';
|
element.style = 'width: 100%; height: auto; read-only: true; resize: none';
|
||||||
|
element.classList.add('w3-input');
|
||||||
element.readOnly = true;
|
element.readOnly = true;
|
||||||
event.srcElement.parentElement.appendChild(element);
|
event.srcElement.parentElement.appendChild(element);
|
||||||
event.srcElement.onclick = event => handler.hide_id(event, element);
|
event.srcElement.onclick = event => handler.hide_id(event, element);
|
||||||
@ -48,7 +79,7 @@ async function main() {
|
|||||||
alert('Successfully created: ' + id);
|
alert('Successfully created: ' + id);
|
||||||
await tfrpc.rpc.reload();
|
await tfrpc.rpc.reload();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
alert('Error creating identity: ' + e);
|
alert('Error creating identity: ' + e.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handler.hide_id = function hide_id(event, element) {
|
handler.hide_id = function hide_id(event, element) {
|
||||||
@ -69,23 +100,36 @@ async function main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<h1>SSB Identity Management</h1>
|
<header class="w3-theme w3-padding"><h1>SSB Identity Management</h1></header>
|
||||||
<h2>Create a new identity</h2>
|
<div class="w3-card-4 w3-margin">
|
||||||
<button id="create_id" onclick="handler.create_id()">Create Identity</button>
|
<header class="w3-container w3-theme-l2"><h2>Create a new identity</h2></header>
|
||||||
<h2>Import an SSB Identity from 12 BIP39 English Words</h2>
|
<footer class="w3-padding">
|
||||||
<textarea id="add_id" style="width: 100%" rows="4"></textarea><button id="add" onclick="handler.add_id(event)">Import Identity</button>
|
<button id="create_id" onclick="handler.create_id()" class="w3-button w3-theme">Create Identity</button>
|
||||||
<h2>Identities</h2>
|
</footer>
|
||||||
<ul>` +
|
</div>
|
||||||
|
<div class="w3-card-4 w3-margin">
|
||||||
|
<header class="w3-container w3-theme-l2"><h2>Import an SSB Identity from 12 BIP39 English Words</h2></header>
|
||||||
|
<textarea id="add_id" style="width: 100%" rows="4" class="w3-input"></textarea>
|
||||||
|
<footer class="w3-padding">
|
||||||
|
<button id="add" onclick="handler.add_id(event)" class="w3-button w3-theme">Import Identity</button>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
<div class="w3-card-4 w3-margin">
|
||||||
|
<header class="w3-container w3-theme-l2"><h2>Identities</h2></header>
|
||||||
|
<ul class="w3-ul">` +
|
||||||
ids
|
ids
|
||||||
.map(
|
.map(
|
||||||
(id) => `<li>
|
(
|
||||||
<button onclick="handler.export_id(event)" data-id="${id}">Export Identity</button>
|
id
|
||||||
<button onclick="handler.delete_id(event)" data-id="${id}">Delete Identity</button>
|
) => `<li style="overflow: hidden; text-wrap: nowrap; text-overflow: ellipsis">
|
||||||
${id}
|
<button onclick="handler.export_id(event)" data-id="${id}" class="w3-button w3-theme">Export Identity</button>
|
||||||
|
<button onclick="handler.delete_id(event)" data-id="${id}" class="w3-button w3-theme">Delete Identity</button>
|
||||||
|
${id}${id == server_id ? ' <div class="w3-tag w3-theme-l4 w3-round">🖥 local server</div>' : ''}
|
||||||
</li>`
|
</li>`
|
||||||
)
|
)
|
||||||
.join('\n') +
|
.join('\n') +
|
||||||
` </ul>
|
` </ul>
|
||||||
|
</div>
|
||||||
</body>`
|
</body>`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
235
apps/identity/w3.css
Normal file
235
apps/identity/w3.css
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */
|
||||||
|
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
|
||||||
|
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
|
||||||
|
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
|
||||||
|
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
|
||||||
|
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
|
||||||
|
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
|
||||||
|
a{background-color:transparent}a:active,a:hover{outline-width:0}
|
||||||
|
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
|
||||||
|
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
|
||||||
|
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
|
||||||
|
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
|
||||||
|
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
|
||||||
|
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
|
||||||
|
button,input{overflow:visible}button,select{text-transform:none}
|
||||||
|
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
|
||||||
|
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
|
||||||
|
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
|
||||||
|
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
|
||||||
|
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
|
||||||
|
[type=checkbox],[type=radio]{padding:0}
|
||||||
|
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
|
||||||
|
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
|
||||||
|
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
|
||||||
|
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
|
||||||
|
/* End extract */
|
||||||
|
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
|
||||||
|
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
|
||||||
|
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
|
||||||
|
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
|
||||||
|
hr{border:0;border-top:1px solid #eee;margin:20px 0}
|
||||||
|
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
|
||||||
|
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
|
||||||
|
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
|
||||||
|
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
|
||||||
|
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
|
||||||
|
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
|
||||||
|
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
|
||||||
|
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
|
||||||
|
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
|
||||||
|
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
|
||||||
|
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
|
||||||
|
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
|
||||||
|
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
|
||||||
|
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
|
||||||
|
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
|
||||||
|
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
|
||||||
|
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
|
||||||
|
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
|
||||||
|
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
|
||||||
|
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
|
||||||
|
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
|
||||||
|
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
|
||||||
|
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
|
||||||
|
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
|
||||||
|
.w3-main,#main{transition:margin-left .4s}
|
||||||
|
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
|
||||||
|
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
|
||||||
|
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
|
||||||
|
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
|
||||||
|
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
|
||||||
|
.w3-bar .w3-button{white-space:normal}
|
||||||
|
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
|
||||||
|
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
|
||||||
|
.w3-responsive{display:block;overflow-x:auto}
|
||||||
|
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
|
||||||
|
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
|
||||||
|
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
|
||||||
|
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
|
||||||
|
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
|
||||||
|
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
|
||||||
|
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
|
||||||
|
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
|
||||||
|
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
|
||||||
|
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
|
||||||
|
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
|
||||||
|
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
|
||||||
|
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
|
||||||
|
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
|
||||||
|
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
|
||||||
|
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
|
||||||
|
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
|
||||||
|
@media (max-width:1205px){.w3-auto{max-width:95%}}
|
||||||
|
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
|
||||||
|
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
|
||||||
|
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
|
||||||
|
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
|
||||||
|
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
|
||||||
|
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
|
||||||
|
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
|
||||||
|
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
|
||||||
|
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
|
||||||
|
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
|
||||||
|
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
|
||||||
|
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
|
||||||
|
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
|
||||||
|
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
|
||||||
|
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
|
||||||
|
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
|
||||||
|
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
|
||||||
|
.w3-display-position{position:absolute}
|
||||||
|
.w3-circle{border-radius:50%}
|
||||||
|
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
|
||||||
|
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
|
||||||
|
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
|
||||||
|
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
|
||||||
|
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
|
||||||
|
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
|
||||||
|
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
|
||||||
|
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
|
||||||
|
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
|
||||||
|
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
|
||||||
|
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
|
||||||
|
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
|
||||||
|
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
|
||||||
|
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
|
||||||
|
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
|
||||||
|
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
|
||||||
|
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
|
||||||
|
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
|
||||||
|
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
|
||||||
|
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
|
||||||
|
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
|
||||||
|
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
|
||||||
|
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
|
||||||
|
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
|
||||||
|
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
|
||||||
|
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
|
||||||
|
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
|
||||||
|
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
|
||||||
|
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
|
||||||
|
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
|
||||||
|
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
|
||||||
|
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
|
||||||
|
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
|
||||||
|
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
|
||||||
|
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
|
||||||
|
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
|
||||||
|
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
|
||||||
|
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
|
||||||
|
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
|
||||||
|
.w3-left{float:left!important}.w3-right{float:right!important}
|
||||||
|
.w3-button:hover{color:#000!important;background-color:#ccc!important}
|
||||||
|
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
|
||||||
|
.w3-hover-none:hover{box-shadow:none!important}
|
||||||
|
/* Colors */
|
||||||
|
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
|
||||||
|
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
|
||||||
|
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
|
||||||
|
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
|
||||||
|
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
|
||||||
|
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
|
||||||
|
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
|
||||||
|
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
|
||||||
|
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
|
||||||
|
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
|
||||||
|
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
|
||||||
|
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
|
||||||
|
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
|
||||||
|
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
|
||||||
|
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
|
||||||
|
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
|
||||||
|
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
|
||||||
|
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
|
||||||
|
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
|
||||||
|
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
|
||||||
|
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
|
||||||
|
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
|
||||||
|
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
|
||||||
|
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
|
||||||
|
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
|
||||||
|
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
|
||||||
|
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
|
||||||
|
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
|
||||||
|
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
|
||||||
|
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
|
||||||
|
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
|
||||||
|
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
|
||||||
|
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
|
||||||
|
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
|
||||||
|
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
|
||||||
|
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
|
||||||
|
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
|
||||||
|
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
|
||||||
|
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
|
||||||
|
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
|
||||||
|
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
|
||||||
|
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
|
||||||
|
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
|
||||||
|
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
|
||||||
|
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
|
||||||
|
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
|
||||||
|
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
|
||||||
|
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
|
||||||
|
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
|
||||||
|
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
|
||||||
|
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
|
||||||
|
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
|
||||||
|
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
|
||||||
|
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
|
||||||
|
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
|
||||||
|
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
|
||||||
|
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
|
||||||
|
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
|
||||||
|
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
|
||||||
|
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
|
||||||
|
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
|
||||||
|
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
|
||||||
|
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
|
||||||
|
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
|
||||||
|
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
|
||||||
|
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
|
||||||
|
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
|
||||||
|
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
|
||||||
|
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
|
||||||
|
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
|
||||||
|
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
|
||||||
|
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
|
||||||
|
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
|
||||||
|
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
|
||||||
|
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
|
||||||
|
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
|
||||||
|
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
|
||||||
|
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
|
||||||
|
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
|
||||||
|
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
|
||||||
|
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
|
||||||
|
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
|
||||||
|
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
|
||||||
|
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "🦟",
|
"emoji": "🦟",
|
||||||
"previous": "&TegdzvFE+im94shygaHkgDYSaSrwY2h0OKUXSRPBQDM=.sha256"
|
"previous": "&cUqvSDUls3jn0haD85LPFAGdkc8wFuy347TtATNcJgg=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -67,9 +67,6 @@ tfrpc.register(function getHash(id, message) {
|
|||||||
tfrpc.register(function setHash(hash) {
|
tfrpc.register(function setHash(hash) {
|
||||||
return app.setHash(hash);
|
return app.setHash(hash);
|
||||||
});
|
});
|
||||||
ssb.addEventListener('message', async function (id) {
|
|
||||||
await tfrpc.rpc.notifyNewMessage(id);
|
|
||||||
});
|
|
||||||
tfrpc.register(async function store_blob(blob) {
|
tfrpc.register(async function store_blob(blob) {
|
||||||
if (Array.isArray(blob)) {
|
if (Array.isArray(blob)) {
|
||||||
blob = Uint8Array.from(blob);
|
blob = Uint8Array.from(blob);
|
||||||
@ -85,13 +82,18 @@ tfrpc.register(async function store_message(message) {
|
|||||||
tfrpc.register(function apps() {
|
tfrpc.register(function apps() {
|
||||||
return core.apps();
|
return core.apps();
|
||||||
});
|
});
|
||||||
|
tfrpc.register(function getActiveIdentity() {
|
||||||
|
return ssb.getActiveIdentity();
|
||||||
|
});
|
||||||
tfrpc.register(async function try_decrypt(id, content) {
|
tfrpc.register(async function try_decrypt(id, content) {
|
||||||
return await ssb.privateMessageDecrypt(id, content);
|
return await ssb.privateMessageDecrypt(id, content);
|
||||||
});
|
});
|
||||||
ssb.addEventListener('broadcasts', async function () {
|
core.register('onMessage', async function (id) {
|
||||||
|
await tfrpc.rpc.notifyNewMessage(id);
|
||||||
|
});
|
||||||
|
core.register('onBroadcastsChanged', async function () {
|
||||||
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
|
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
|
||||||
});
|
});
|
||||||
|
|
||||||
core.register('onConnectionsChanged', async function () {
|
core.register('onConnectionsChanged', async function () {
|
||||||
await tfrpc.rpc.set('connections', await ssb.connections());
|
await tfrpc.rpc.set('connections', await ssb.connections());
|
||||||
});
|
});
|
||||||
|
44
apps/issues/lit-all.min.js
vendored
44
apps/issues/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -4,48 +4,6 @@ import * as tfutils from './tf-utils.js';
|
|||||||
|
|
||||||
const k_project = '%Hr+4xEVtjplidSKBlRWi4Aw/0Tfw7B+1OR9BzlDKmOI=.sha256';
|
const k_project = '%Hr+4xEVtjplidSKBlRWi4Aw/0Tfw7B+1OR9BzlDKmOI=.sha256';
|
||||||
|
|
||||||
class TfIdPickerElement extends LitElement {
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
ids: {type: Array},
|
|
||||||
selected: {type: String},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
async load() {
|
|
||||||
this.selected = await tfrpc.rpc.localStorageGet('whoami');
|
|
||||||
this.ids = (await tfrpc.rpc.getIdentities()) || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
changed(event) {
|
|
||||||
this.selected = event.srcElement.value;
|
|
||||||
tfrpc.rpc.localStorageSet('whoami', this.selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
if (this.ids) {
|
|
||||||
return html`
|
|
||||||
<select @change=${this.changed} style="max-width: 100%">
|
|
||||||
${this.ids.map(
|
|
||||||
(id) =>
|
|
||||||
html`<option ?selected=${id == this.selected} value=${id}>
|
|
||||||
${id}
|
|
||||||
</option>`
|
|
||||||
)}
|
|
||||||
</select>
|
|
||||||
`;
|
|
||||||
} else {
|
|
||||||
return html`<div>Loading...</div>`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
customElements.define('tf-id-picker', TfIdPickerElement);
|
|
||||||
|
|
||||||
class TfComposeElement extends LitElement {
|
class TfComposeElement extends LitElement {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
return {
|
return {
|
||||||
@ -105,10 +63,10 @@ class TfIssuesAppElement extends LitElement {
|
|||||||
let issues = {};
|
let issues = {};
|
||||||
let messages = await tfrpc.rpc.query(
|
let messages = await tfrpc.rpc.query(
|
||||||
`
|
`
|
||||||
WITH issues AS (SELECT messages.* FROM messages_refs JOIN messages ON
|
WITH issues AS (SELECT messages.id, json(messages.content) AS content, messages.author, messages.timestamp FROM messages_refs JOIN messages ON
|
||||||
messages.id = messages_refs.message
|
messages.id = messages_refs.message
|
||||||
WHERE messages_refs.ref = ? AND json_extract(messages.content, '$.type') = 'issue'),
|
WHERE messages_refs.ref = ? AND json_extract(messages.content, '$.type') = 'issue'),
|
||||||
edits AS (SELECT messages.* FROM issues JOIN messages_refs ON
|
edits AS (SELECT messages.id, json(messages.content) AS content, messages.author, messages.timestamp FROM issues JOIN messages_refs ON
|
||||||
issues.id = messages_refs.ref JOIN messages ON
|
issues.id = messages_refs.ref JOIN messages ON
|
||||||
messages.id = messages_refs.message
|
messages.id = messages_refs.message
|
||||||
WHERE json_extract(messages.content, '$.type') IN ('issue-edit', 'post'))
|
WHERE json_extract(messages.content, '$.type') IN ('issue-edit', 'post'))
|
||||||
@ -206,7 +164,7 @@ class TfIssuesAppElement extends LitElement {
|
|||||||
if (
|
if (
|
||||||
confirm(`Are you sure you want to ${open ? 'open' : 'close'} this issue?`)
|
confirm(`Are you sure you want to ${open ? 'open' : 'close'} this issue?`)
|
||||||
) {
|
) {
|
||||||
let whoami = this.shadowRoot.getElementById('picker').selected;
|
let whoami = await tfrpc.rpc.getActiveIdentity();
|
||||||
await tfrpc.rpc.appendMessage(whoami, {
|
await tfrpc.rpc.appendMessage(whoami, {
|
||||||
type: 'issue-edit',
|
type: 'issue-edit',
|
||||||
issues: [
|
issues: [
|
||||||
@ -221,7 +179,7 @@ class TfIssuesAppElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async create_issue(event) {
|
async create_issue(event) {
|
||||||
let whoami = this.shadowRoot.getElementById('picker').selected;
|
let whoami = await tfrpc.rpc.getActiveIdentity();
|
||||||
await tfrpc.rpc.appendMessage(whoami, {
|
await tfrpc.rpc.appendMessage(whoami, {
|
||||||
type: 'issue',
|
type: 'issue',
|
||||||
project: k_project,
|
project: k_project,
|
||||||
@ -231,7 +189,7 @@ class TfIssuesAppElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async reply_to_issue(event) {
|
async reply_to_issue(event) {
|
||||||
let whoami = this.shadowRoot.getElementById('picker').selected;
|
let whoami = await tfrpc.rpc.getActiveIdentity();
|
||||||
await tfrpc.rpc.appendMessage(whoami, {
|
await tfrpc.rpc.appendMessage(whoami, {
|
||||||
type: 'post',
|
type: 'post',
|
||||||
text: event.detail.value,
|
text: event.detail.value,
|
||||||
@ -249,10 +207,7 @@ class TfIssuesAppElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let header = html`
|
let header = html` <h1>Tilde Friends Issues</h1> `;
|
||||||
<h1>Tilde Friends Issues</h1>
|
|
||||||
<tf-id-picker id="picker"></tf-id-picker>
|
|
||||||
`;
|
|
||||||
if (this.selected) {
|
if (this.selected) {
|
||||||
return html`
|
return html`
|
||||||
${header}
|
${header}
|
||||||
|
@ -55,7 +55,7 @@ function new_message() {
|
|||||||
return g_new_message_promise;
|
return g_new_message_promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssb.addEventListener('message', function (id) {
|
core.register('onMessage', function (id) {
|
||||||
let resolve = g_new_message_resolve;
|
let resolve = g_new_message_resolve;
|
||||||
g_new_message_promise = new Promise(function (resolve, reject) {
|
g_new_message_promise = new Promise(function (resolve, reject) {
|
||||||
g_new_message_resolve = resolve;
|
g_new_message_resolve = resolve;
|
||||||
|
44
apps/journal/lit-all.min.js
vendored
44
apps/journal/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "📦",
|
"emoji": "🚪",
|
||||||
"previous": "&IU+TwyM7TznD8NBfnw7tgW2zxVlMqTVxSqWFjuosLwo=.sha256"
|
"previous": "&HXCdDG8gGYXElTyEFbg85jqa6lDXNL2ENPIA9UoJNbI=.sha256"
|
||||||
}
|
}
|
||||||
|
44
apps/sneaker/lit-all.min.js
vendored
44
apps/sneaker/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "🐌",
|
"emoji": "🐌",
|
||||||
"previous": "&Xs1X5TzLCk6KVr+5IDc80JAHYxJyoD10cXKBUYpFqWQ=.sha256"
|
"previous": "&6oHPQCA26v+4nBXv+YUdCT43j2DpXDspxhHSSRydkiw=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ tfrpc.register(function getHash(id, message) {
|
|||||||
tfrpc.register(function setHash(hash) {
|
tfrpc.register(function setHash(hash) {
|
||||||
return app.setHash(hash);
|
return app.setHash(hash);
|
||||||
});
|
});
|
||||||
ssb.addEventListener('message', async function (id) {
|
core.register('onMessage', async function (id) {
|
||||||
await tfrpc.rpc.notifyNewMessage(id);
|
await tfrpc.rpc.notifyNewMessage(id);
|
||||||
});
|
});
|
||||||
tfrpc.register(async function store_blob(blob) {
|
tfrpc.register(async function store_blob(blob) {
|
||||||
@ -100,13 +100,19 @@ tfrpc.register(async function try_decrypt(id, content) {
|
|||||||
tfrpc.register(async function encrypt(id, recipients, content) {
|
tfrpc.register(async function encrypt(id, recipients, content) {
|
||||||
return await ssb.privateMessageEncrypt(id, recipients, content);
|
return await ssb.privateMessageEncrypt(id, recipients, content);
|
||||||
});
|
});
|
||||||
ssb.addEventListener('broadcasts', async function () {
|
tfrpc.register(async function getActiveIdentity() {
|
||||||
|
return await ssb.getActiveIdentity();
|
||||||
|
});
|
||||||
|
core.register('onBroadcastsChanged', async function () {
|
||||||
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
|
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
|
||||||
});
|
});
|
||||||
|
|
||||||
core.register('onConnectionsChanged', async function () {
|
core.register('onConnectionsChanged', async function () {
|
||||||
await tfrpc.rpc.set('connections', await ssb.connections());
|
await tfrpc.rpc.set('connections', await ssb.connections());
|
||||||
});
|
});
|
||||||
|
core.register('setActiveIdentity', async function (id) {
|
||||||
|
await tfrpc.rpc.set('identity', id);
|
||||||
|
});
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
if (typeof database !== 'undefined') {
|
if (typeof database !== 'undefined') {
|
||||||
|
@ -1,19 +1,23 @@
|
|||||||
function textNode(text) {
|
function textNode(text) {
|
||||||
const node = new commonmark.Node("text", undefined);
|
const node = new commonmark.Node('text', undefined);
|
||||||
node.literal = text;
|
node.literal = text;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
function linkNode(text, link) {
|
function linkNode(text, link) {
|
||||||
const linkNode = new commonmark.Node("link", undefined);
|
const linkNode = new commonmark.Node('link', undefined);
|
||||||
|
if (link.startsWith('#')) {
|
||||||
linkNode.destination = `#q=${encodeURIComponent(link)}`;
|
linkNode.destination = `#q=${encodeURIComponent(link)}`;
|
||||||
|
} else {
|
||||||
|
linkNode.destination = link;
|
||||||
|
}
|
||||||
linkNode.appendChild(textNode(text));
|
linkNode.appendChild(textNode(text));
|
||||||
return linkNode;
|
return linkNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
function splitMatches(text, regexp) {
|
function splitMatches(text, regexp) {
|
||||||
// Regexp must be sticky.
|
// Regexp must be sticky.
|
||||||
regexp = new RegExp(regexp, "gm");
|
regexp = new RegExp(regexp, 'gm');
|
||||||
|
|
||||||
let i = 0;
|
let i = 0;
|
||||||
const result = [];
|
const result = [];
|
||||||
@ -39,13 +43,13 @@ function splitMatches(text, regexp) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const regex = new RegExp("(?<!\\w)#[\\w-]+");
|
const regex = new RegExp('(?:https?://[^ ]+[^ .,])|(?:(?<!\\w)#[\\w-]+)|(?:@[A-Za-z0-9+/]+=.ed25519)|(?:[%&][A-Za-z0-9+/]+=.sha256)');
|
||||||
|
|
||||||
function split(textNodes) {
|
function split(textNodes) {
|
||||||
const text = textNodes.map(n => n.literal).join("");
|
const text = textNodes.map((n) => n.literal).join('');
|
||||||
const parts = splitMatches(text, regex);
|
const parts = splitMatches(text, regex);
|
||||||
|
|
||||||
return parts.map(part => {
|
return parts.map((part) => {
|
||||||
if (part[1]) {
|
if (part[1]) {
|
||||||
return linkNode(part[0], part[0]);
|
return linkNode(part[0], part[0]);
|
||||||
} else {
|
} else {
|
||||||
@ -61,17 +65,17 @@ export function transform(parsed) {
|
|||||||
let nodes = [];
|
let nodes = [];
|
||||||
while ((event = walker.next())) {
|
while ((event = walker.next())) {
|
||||||
const node = event.node;
|
const node = event.node;
|
||||||
if (event.entering && node.type === "text") {
|
if (event.entering && node.type === 'text') {
|
||||||
nodes.push(node);
|
nodes.push(node);
|
||||||
} else {
|
} else {
|
||||||
if (nodes.length > 0) {
|
if (nodes.length > 0) {
|
||||||
split(nodes)
|
split(nodes)
|
||||||
.reverse()
|
.reverse()
|
||||||
.forEach(newNode => {
|
.forEach((newNode) => {
|
||||||
nodes[0].insertAfter(newNode);
|
nodes[0].insertAfter(newNode);
|
||||||
});
|
});
|
||||||
|
|
||||||
nodes.forEach(n => n.unlink());
|
nodes.forEach((n) => n.unlink());
|
||||||
nodes = [];
|
nodes = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,10 +84,10 @@ export function transform(parsed) {
|
|||||||
if (nodes.length > 0) {
|
if (nodes.length > 0) {
|
||||||
split(nodes)
|
split(nodes)
|
||||||
.reverse()
|
.reverse()
|
||||||
.forEach(newNode => {
|
.forEach((newNode) => {
|
||||||
nodes[0].insertAfter(newNode);
|
nodes[0].insertAfter(newNode);
|
||||||
});
|
});
|
||||||
nodes.forEach(n => n.unlink());
|
nodes.forEach((n) => n.unlink());
|
||||||
}
|
}
|
||||||
|
|
||||||
return parsed;
|
return parsed;
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
function textNode(text) {
|
|
||||||
const node = new commonmark.Node("text", undefined);
|
|
||||||
node.literal = text;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
function linkNode(text, url) {
|
|
||||||
const urlNode = new commonmark.Node("link", undefined);
|
|
||||||
urlNode.destination = url;
|
|
||||||
urlNode.appendChild(textNode(text));
|
|
||||||
|
|
||||||
return urlNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
function splitMatches(text, regexp) {
|
|
||||||
// Regexp must be sticky.
|
|
||||||
regexp = new RegExp(regexp, "gm");
|
|
||||||
|
|
||||||
let i = 0;
|
|
||||||
const result = [];
|
|
||||||
|
|
||||||
let match = regexp.exec(text);
|
|
||||||
while (match) {
|
|
||||||
const matchText = match[0];
|
|
||||||
|
|
||||||
if (match.index > i) {
|
|
||||||
result.push([text.substring(i, match.index), false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
result.push([matchText, true]);
|
|
||||||
i = match.index + matchText.length;
|
|
||||||
|
|
||||||
match = regexp.exec(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i < text.length) {
|
|
||||||
result.push([text.substring(i, text.length), false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
const urlRegexp = new RegExp("https?://[^ ]+[^ .,]");
|
|
||||||
|
|
||||||
function splitURLs(textNodes) {
|
|
||||||
const text = textNodes.map(n => n.literal).join("");
|
|
||||||
const parts = splitMatches(text, urlRegexp);
|
|
||||||
|
|
||||||
return parts.map(part => {
|
|
||||||
if (part[1]) {
|
|
||||||
return linkNode(part[0], part[0]);
|
|
||||||
} else {
|
|
||||||
return textNode(part[0]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function transform(parsed) {
|
|
||||||
const walker = parsed.walker();
|
|
||||||
let event;
|
|
||||||
|
|
||||||
let nodes = [];
|
|
||||||
while ((event = walker.next())) {
|
|
||||||
const node = event.node;
|
|
||||||
if (event.entering && node.type === "text") {
|
|
||||||
nodes.push(node);
|
|
||||||
} else {
|
|
||||||
if (nodes.length > 0) {
|
|
||||||
splitURLs(nodes)
|
|
||||||
.reverse()
|
|
||||||
.forEach(newNode => {
|
|
||||||
nodes[0].insertAfter(newNode);
|
|
||||||
});
|
|
||||||
|
|
||||||
nodes.forEach(n => n.unlink());
|
|
||||||
nodes = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodes.length > 0) {
|
|
||||||
splitURLs(nodes)
|
|
||||||
.reverse()
|
|
||||||
.forEach(newNode => {
|
|
||||||
nodes[0].insertAfter(newNode);
|
|
||||||
});
|
|
||||||
nodes.forEach(n => n.unlink());
|
|
||||||
}
|
|
||||||
|
|
||||||
return parsed;
|
|
||||||
}
|
|
@ -1,3 +1,7 @@
|
|||||||
|
import * as tfrpc from '/static/tfrpc.js';
|
||||||
|
import {html, render} from './lit-all.min.js';
|
||||||
|
import {styles} from './tf-styles.js';
|
||||||
|
|
||||||
let g_emojis;
|
let g_emojis;
|
||||||
|
|
||||||
function get_emojis() {
|
function get_emojis() {
|
||||||
@ -10,19 +14,30 @@ function get_emojis() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function picker(callback, anchor) {
|
async function get_recent(author) {
|
||||||
get_emojis().then(function (json) {
|
let recent = await tfrpc.rpc.query(
|
||||||
|
`
|
||||||
|
SELECT DISTINCT content ->> '$.vote.expression' AS value
|
||||||
|
FROM messages
|
||||||
|
WHERE author = ? AND
|
||||||
|
content ->> '$.type' = 'vote'
|
||||||
|
ORDER BY timestamp DESC LIMIT 10
|
||||||
|
`,
|
||||||
|
[author]
|
||||||
|
);
|
||||||
|
return recent.map((x) => x.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function picker(callback, anchor, author) {
|
||||||
|
let json = await get_emojis();
|
||||||
|
let recent = await get_recent(author);
|
||||||
|
|
||||||
let div = document.createElement('div');
|
let div = document.createElement('div');
|
||||||
div.id = 'emoji_picker';
|
div.id = 'emoji_picker';
|
||||||
div.style.color = '#000';
|
div.style.color = '#000';
|
||||||
div.style.background = '#fff';
|
div.style.background = '#fff';
|
||||||
div.style.border = '1px solid #000';
|
div.style.border = '1px solid #000';
|
||||||
div.style.display = 'block';
|
div.style.display = 'block';
|
||||||
div.style.position = 'absolute';
|
|
||||||
div.style.minWidth = 'min(16em, 90vw)';
|
|
||||||
div.style.width = 'min(16em, 90vw)';
|
|
||||||
div.style.maxWidth = 'min(16em, 90vw)';
|
|
||||||
div.style.maxHeight = '16em';
|
|
||||||
div.style.overflow = 'scroll';
|
div.style.overflow = 'scroll';
|
||||||
div.style.fontWeight = 'bold';
|
div.style.fontWeight = 'bold';
|
||||||
div.style.fontSize = 'xx-large';
|
div.style.fontSize = 'xx-large';
|
||||||
@ -40,14 +55,6 @@ export function picker(callback, anchor) {
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
console.log('emoji cleanup');
|
|
||||||
div.parentElement.removeChild(div);
|
|
||||||
window.removeEventListener('keydown', key_down);
|
|
||||||
console.log('removing click');
|
|
||||||
document.body.removeEventListener('mousedown', cleanup);
|
|
||||||
}
|
|
||||||
|
|
||||||
function key_down(event) {
|
function key_down(event) {
|
||||||
if (event.key == 'Escape') {
|
if (event.key == 'Escape') {
|
||||||
cleanup();
|
cleanup();
|
||||||
@ -66,6 +73,40 @@ export function picker(callback, anchor) {
|
|||||||
}
|
}
|
||||||
let search = input.value.toLowerCase();
|
let search = input.value.toLowerCase();
|
||||||
let any_at_all = false;
|
let any_at_all = false;
|
||||||
|
if (recent) {
|
||||||
|
let emoji_to_name = {};
|
||||||
|
for (let row of Object.values(json)) {
|
||||||
|
for (let entry of Object.entries(row)) {
|
||||||
|
emoji_to_name[entry[1]] = entry[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let header = document.createElement('div');
|
||||||
|
header.appendChild(document.createTextNode('Recent'));
|
||||||
|
list.appendChild(header);
|
||||||
|
let any = false;
|
||||||
|
for (let entry of recent) {
|
||||||
|
if (
|
||||||
|
search &&
|
||||||
|
search.length &&
|
||||||
|
(emoji_to_name[entry] || '').toLowerCase().indexOf(search) == -1
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let emoji = document.createElement('span');
|
||||||
|
const k_size = '1.25em';
|
||||||
|
emoji.style.display = 'inline-block';
|
||||||
|
emoji.style.overflow = 'hidden';
|
||||||
|
emoji.style.cursor = 'pointer';
|
||||||
|
emoji.onclick = chosen;
|
||||||
|
emoji.title = emoji_to_name[entry] || entry;
|
||||||
|
emoji.appendChild(document.createTextNode(entry));
|
||||||
|
list.appendChild(emoji);
|
||||||
|
any = true;
|
||||||
|
}
|
||||||
|
if (!any) {
|
||||||
|
list.removeChild(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
for (let row of Object.entries(json)) {
|
for (let row of Object.entries(json)) {
|
||||||
let header = document.createElement('div');
|
let header = document.createElement('div');
|
||||||
header.appendChild(document.createTextNode(row[0]));
|
header.appendChild(document.createTextNode(row[0]));
|
||||||
@ -101,14 +142,23 @@ export function picker(callback, anchor) {
|
|||||||
}
|
}
|
||||||
refresh();
|
refresh();
|
||||||
input.oninput = refresh;
|
input.oninput = refresh;
|
||||||
document.body.appendChild(div);
|
let modal = html`
|
||||||
div.style.position = 'fixed';
|
<style>
|
||||||
div.style.top = '50%';
|
${styles}
|
||||||
div.style.left = '50%';
|
</style>
|
||||||
div.style.transform = 'translate(-50%, -50%)';
|
<div class="w3-modal" style="display: block">
|
||||||
|
<div class="w3-modal-content w3-card-4">${div}</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
let parent = document.createElement('div');
|
||||||
|
document.body.appendChild(parent);
|
||||||
|
function cleanup() {
|
||||||
|
parent.parentElement.removeChild(parent);
|
||||||
|
window.removeEventListener('keydown', key_down);
|
||||||
|
document.body.removeEventListener('mousedown', cleanup);
|
||||||
|
}
|
||||||
|
render(modal, parent);
|
||||||
input.focus();
|
input.focus();
|
||||||
console.log('adding click');
|
|
||||||
document.body.addEventListener('mousedown', cleanup);
|
document.body.addEventListener('mousedown', cleanup);
|
||||||
window.addEventListener('keydown', key_down);
|
window.addEventListener('keydown', key_down);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html style="color: #fff">
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Tilde Friends</title>
|
<title>Tilde Friends</title>
|
||||||
<base target="_top" />
|
<base target="_top" />
|
||||||
@ -10,14 +10,14 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body style="background-color: #223a5e">
|
<body style="margin: 0; padding: 0">
|
||||||
<tf-app class="w3-deep-purple" />
|
<tf-app></tf-app>
|
||||||
|
<tf-reactions-modal id="reactions_modal"></tf-reactions-modal>
|
||||||
<script>
|
<script>
|
||||||
window.litDisableBundleWarning = true;
|
window.litDisableBundleWarning = true;
|
||||||
</script>
|
</script>
|
||||||
<script src="filesaver.min.js"></script>
|
<script src="filesaver.min.js"></script>
|
||||||
<script src="commonmark.min.js"></script>
|
<script src="commonmark.min.js"></script>
|
||||||
<script src="commonmark-linkify.js" type="module"></script>
|
|
||||||
<script src="commonmark-hashtag.js" type="module"></script>
|
<script src="commonmark-hashtag.js" type="module"></script>
|
||||||
<script src="script.js" type="module"></script>
|
<script src="script.js" type="module"></script>
|
||||||
</body>
|
</body>
|
||||||
|
44
apps/ssb/lit-all.min.js
vendored
44
apps/ssb/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,13 +1,13 @@
|
|||||||
import {LitElement, html} from './lit-all.min.js';
|
import {LitElement, html} from './lit-all.min.js';
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
import * as tfrpc from '/static/tfrpc.js';
|
||||||
|
|
||||||
import * as tf_id_picker from './tf-id-picker.js';
|
|
||||||
import * as tf_app from './tf-app.js';
|
import * as tf_app from './tf-app.js';
|
||||||
import * as tf_message from './tf-message.js';
|
import * as tf_message from './tf-message.js';
|
||||||
import * as tf_user from './tf-user.js';
|
import * as tf_user from './tf-user.js';
|
||||||
import * as tf_compose from './tf-compose.js';
|
import * as tf_compose from './tf-compose.js';
|
||||||
import * as tf_news from './tf-news.js';
|
import * as tf_news from './tf-news.js';
|
||||||
import * as tf_profile from './tf-profile.js';
|
import * as tf_profile from './tf-profile.js';
|
||||||
|
import * as tf_reactions_modal from './tf-reactions-modal.js';
|
||||||
import * as tf_tab_mentions from './tf-tab-mentions.js';
|
import * as tf_tab_mentions from './tf-tab-mentions.js';
|
||||||
import * as tf_tab_news from './tf-tab-news.js';
|
import * as tf_tab_news from './tf-tab-news.js';
|
||||||
import * as tf_tab_news_feed from './tf-tab-news-feed.js';
|
import * as tf_tab_news_feed from './tf-tab-news-feed.js';
|
||||||
|
@ -52,13 +52,15 @@ class TfElement extends LitElement {
|
|||||||
self.broadcasts = value;
|
self.broadcasts = value;
|
||||||
} else if (name === 'connections') {
|
} else if (name === 'connections') {
|
||||||
self.connections = value;
|
self.connections = value;
|
||||||
|
} else if (name === 'identity') {
|
||||||
|
self.whoami = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.initial_load();
|
this.initial_load();
|
||||||
}
|
}
|
||||||
|
|
||||||
async initial_load() {
|
async initial_load() {
|
||||||
let whoami = await tfrpc.rpc.localStorageGet('whoami');
|
let whoami = await tfrpc.rpc.getActiveIdentity();
|
||||||
let ids = (await tfrpc.rpc.getIdentities()) || [];
|
let ids = (await tfrpc.rpc.getIdentities()) || [];
|
||||||
this.whoami = whoami ?? (ids.length ? ids[0] : undefined);
|
this.whoami = whoami ?? (ids.length ? ids[0] : undefined);
|
||||||
this.ids = ids;
|
this.ids = ids;
|
||||||
@ -193,29 +195,6 @@ class TfElement extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render_id_picker() {
|
|
||||||
return html`
|
|
||||||
<div style="display: flex; gap: 8px">
|
|
||||||
<tf-id-picker
|
|
||||||
id="picker"
|
|
||||||
style="flex: 1 1 auto"
|
|
||||||
selected=${this.whoami}
|
|
||||||
.ids=${this.ids}
|
|
||||||
.users=${this.users}
|
|
||||||
@change=${this._handle_whoami_changed}
|
|
||||||
></tf-id-picker>
|
|
||||||
<button
|
|
||||||
class="w3-button w3-dark-grey w3-border"
|
|
||||||
style="flex: 0 0 auto"
|
|
||||||
@click=${this.create_identity}
|
|
||||||
id="create_identity"
|
|
||||||
>
|
|
||||||
Create Identity
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async load_recent_tags() {
|
async load_recent_tags() {
|
||||||
let start = new Date();
|
let start = new Date();
|
||||||
this.tags = await tfrpc.rpc.query(
|
this.tags = await tfrpc.rpc.query(
|
||||||
@ -255,7 +234,15 @@ class TfElement extends LitElement {
|
|||||||
by_count.push({count: v.of, id: id});
|
by_count.push({count: v.of, id: id});
|
||||||
}
|
}
|
||||||
console.log(by_count.sort((x, y) => y.count - x.count).slice(0, 20));
|
console.log(by_count.sort((x, y) => y.count - x.count).slice(0, 20));
|
||||||
|
let start_time = new Date();
|
||||||
users = await this.fetch_about(Object.keys(following).sort(), users);
|
users = await this.fetch_about(Object.keys(following).sort(), users);
|
||||||
|
console.log(
|
||||||
|
'about took',
|
||||||
|
(new Date() - start_time) / 1000.0,
|
||||||
|
'seconds for',
|
||||||
|
Object.keys(users).length,
|
||||||
|
'users'
|
||||||
|
);
|
||||||
this.following = Object.keys(following);
|
this.following = Object.keys(following);
|
||||||
this.users = users;
|
this.users = users;
|
||||||
await tags;
|
await tags;
|
||||||
@ -277,6 +264,7 @@ class TfElement extends LitElement {
|
|||||||
hash=${this.hash}
|
hash=${this.hash}
|
||||||
.unread=${this.unread}
|
.unread=${this.unread}
|
||||||
@refresh=${() => (this.unread = [])}
|
@refresh=${() => (this.unread = [])}
|
||||||
|
?loading=${this.loading}
|
||||||
></tf-tab-news>
|
></tf-tab-news>
|
||||||
`;
|
`;
|
||||||
} else if (this.tab === 'connections') {
|
} else if (this.tab === 'connections') {
|
||||||
@ -352,18 +340,20 @@ class TfElement extends LitElement {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let tabs = html`
|
let tabs = html`
|
||||||
<div class="w3-bar w3-black">
|
<div class="w3-bar w3-theme-l1">
|
||||||
${Object.entries(k_tabs).map(
|
${Object.entries(k_tabs).map(
|
||||||
([k, v]) => html`
|
([k, v]) => html`
|
||||||
<button
|
<button
|
||||||
title=${v}
|
title=${v}
|
||||||
class="w3-bar-item w3-padding-large w3-hover-gray tab ${self.tab ==
|
class="w3-bar-item w3-padding w3-hover-theme tab ${self.tab == v
|
||||||
v
|
? 'w3-theme-l2'
|
||||||
? 'w3-red'
|
: 'w3-theme-l1'}"
|
||||||
: 'w3-black'}"
|
|
||||||
@click=${() => self.set_tab(v)}
|
@click=${() => self.set_tab(v)}
|
||||||
>
|
>
|
||||||
${k}
|
${k}
|
||||||
|
<span class=${self.tab == v ? '' : 'w3-hide-small'}
|
||||||
|
>${v.charAt(0).toUpperCase() + v.substring(1)}</span
|
||||||
|
>
|
||||||
</button>
|
</button>
|
||||||
`
|
`
|
||||||
)}
|
)}
|
||||||
@ -371,15 +361,27 @@ class TfElement extends LitElement {
|
|||||||
`;
|
`;
|
||||||
let contents = !this.loaded
|
let contents = !this.loaded
|
||||||
? this.loading
|
? this.loading
|
||||||
? html`<div>Loading...</div>`
|
? html`<div
|
||||||
|
class="w3-panel w3-theme-l5 w3-card-4 w3-padding-large w3-round-xlarge"
|
||||||
|
>
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
|
${this.render_tab()}`
|
||||||
: html`<div>Select or create an identity.</div>`
|
: html`<div>Select or create an identity.</div>`
|
||||||
: this.render_tab();
|
: this.render_tab();
|
||||||
return html`
|
return html`
|
||||||
${this.render_id_picker()} ${tabs}
|
<div
|
||||||
|
style="width: 100vw; min-height: 100vh; height: 100%"
|
||||||
|
class="w3-theme-dark"
|
||||||
|
>
|
||||||
|
${tabs}
|
||||||
|
<div style="padding: 8px">
|
||||||
${this.tags.map(
|
${this.tags.map(
|
||||||
(x) => html`<tf-tag tag=${x.tag} count=${x.count}></tf-tag>`
|
(x) => html`<tf-tag tag=${x.tag} count=${x.count}></tf-tag>`
|
||||||
)}
|
)}
|
||||||
${contents}
|
${contents}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {LitElement, html, unsafeHTML} from './lit-all.min.js';
|
import {LitElement, html, unsafeHTML, live} from './lit-all.min.js';
|
||||||
import * as tfutils from './tf-utils.js';
|
import * as tfutils from './tf-utils.js';
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
import * as tfrpc from '/static/tfrpc.js';
|
||||||
import {styles} from './tf-styles.js';
|
import {styles} from './tf-styles.js';
|
||||||
@ -13,6 +13,7 @@ class TfComposeElement extends LitElement {
|
|||||||
branch: {type: String},
|
branch: {type: String},
|
||||||
apps: {type: Object},
|
apps: {type: Object},
|
||||||
drafts: {type: Object},
|
drafts: {type: Object},
|
||||||
|
author: {type: String},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ class TfComposeElement extends LitElement {
|
|||||||
this.branch = undefined;
|
this.branch = undefined;
|
||||||
this.apps = undefined;
|
this.apps = undefined;
|
||||||
this.drafts = {};
|
this.drafts = {};
|
||||||
|
this.author = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
process_text(text) {
|
process_text(text) {
|
||||||
@ -64,7 +66,7 @@ class TfComposeElement extends LitElement {
|
|||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
if (updated) {
|
if (updated) {
|
||||||
this.requestUpdate();
|
setTimeout(() => this.notify(draft), 0);
|
||||||
}
|
}
|
||||||
return tfutils.markdown(text);
|
return tfutils.markdown(text);
|
||||||
}
|
}
|
||||||
@ -72,14 +74,12 @@ class TfComposeElement extends LitElement {
|
|||||||
input(event) {
|
input(event) {
|
||||||
let edit = this.renderRoot.getElementById('edit');
|
let edit = this.renderRoot.getElementById('edit');
|
||||||
let preview = this.renderRoot.getElementById('preview');
|
let preview = this.renderRoot.getElementById('preview');
|
||||||
preview.innerHTML = this.process_text(edit.value);
|
preview.innerHTML = this.process_text(edit.innerText);
|
||||||
let content_warning = this.renderRoot.getElementById('content_warning');
|
let content_warning = this.renderRoot.getElementById('content_warning');
|
||||||
let content_warning_preview = this.renderRoot.getElementById(
|
let draft = this.get_draft();
|
||||||
'content_warning_preview'
|
draft.text = edit.innerText;
|
||||||
);
|
draft.content_warning = content_warning?.value;
|
||||||
if (content_warning && content_warning_preview) {
|
setTimeout(() => this.notify(draft), 0);
|
||||||
content_warning_preview.innerText = content_warning.value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
notify(draft) {
|
notify(draft) {
|
||||||
@ -95,14 +95,6 @@ class TfComposeElement extends LitElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
change() {
|
|
||||||
let draft = this.get_draft();
|
|
||||||
draft.text = this.renderRoot.getElementById('edit')?.value;
|
|
||||||
draft.content_warning =
|
|
||||||
this.renderRoot.getElementById('content_warning')?.value;
|
|
||||||
this.notify(draft);
|
|
||||||
}
|
|
||||||
|
|
||||||
convert_to_format(buffer, type, mime_type) {
|
convert_to_format(buffer, type, mime_type) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
let img = new Image();
|
let img = new Image();
|
||||||
@ -169,8 +161,7 @@ class TfComposeElement extends LitElement {
|
|||||||
size: buffer.length ?? buffer.byteLength,
|
size: buffer.length ?? buffer.byteLength,
|
||||||
};
|
};
|
||||||
let edit = self.renderRoot.getElementById('edit');
|
let edit = self.renderRoot.getElementById('edit');
|
||||||
edit.value += `\n![${name}](${id})`;
|
edit.innerText += `\n![${name}](${id})`;
|
||||||
self.change();
|
|
||||||
self.input();
|
self.input();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
alert(e?.message);
|
alert(e?.message);
|
||||||
@ -197,7 +188,7 @@ class TfComposeElement extends LitElement {
|
|||||||
let edit = this.renderRoot.getElementById('edit');
|
let edit = this.renderRoot.getElementById('edit');
|
||||||
let message = {
|
let message = {
|
||||||
type: 'post',
|
type: 'post',
|
||||||
text: edit.value,
|
text: edit.innerText,
|
||||||
};
|
};
|
||||||
if (this.root || this.branch) {
|
if (this.root || this.branch) {
|
||||||
message.root = this.root;
|
message.root = this.root;
|
||||||
@ -224,29 +215,19 @@ class TfComposeElement extends LitElement {
|
|||||||
console.log('encrypted as', message);
|
console.log('encrypted as', message);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
await tfrpc.rpc.appendMessage(this.whoami, message).then(function () {
|
await tfrpc.rpc.appendMessage(this.whoami, message);
|
||||||
edit.value = '';
|
|
||||||
self.change();
|
|
||||||
self.notify(undefined);
|
self.notify(undefined);
|
||||||
self.requestUpdate();
|
|
||||||
});
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
alert(error.message);
|
alert(error.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
discard() {
|
discard() {
|
||||||
let edit = this.renderRoot.getElementById('edit');
|
|
||||||
edit.value = '';
|
|
||||||
this.change();
|
|
||||||
let preview = this.renderRoot.getElementById('preview');
|
|
||||||
preview.innerHTML = '';
|
|
||||||
this.notify(undefined);
|
this.notify(undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
attach() {
|
attach() {
|
||||||
let self = this;
|
let self = this;
|
||||||
let edit = this.renderRoot.getElementById('edit');
|
|
||||||
let input = document.createElement('input');
|
let input = document.createElement('input');
|
||||||
input.type = 'file';
|
input.type = 'file';
|
||||||
input.onchange = function (event) {
|
input.onchange = function (event) {
|
||||||
@ -262,9 +243,9 @@ class TfComposeElement extends LitElement {
|
|||||||
try {
|
try {
|
||||||
let rows = await tfrpc.rpc.query(
|
let rows = await tfrpc.rpc.query(
|
||||||
`
|
`
|
||||||
SELECT json(messages.content) FROM messages_fts(?)
|
SELECT json(messages.content) AS content FROM messages_fts(?)
|
||||||
JOIN messages ON messages.rowid = messages_fts.rowid
|
JOIN messages ON messages.rowid = messages_fts.rowid
|
||||||
WHERE messages.content LIKE ?
|
WHERE json(messages.content) LIKE ?
|
||||||
ORDER BY timestamp DESC LIMIT 10
|
ORDER BY timestamp DESC LIMIT 10
|
||||||
`,
|
`,
|
||||||
['"' + text.replace('"', '""') + '"', `%![%${text}%](%)%`]
|
['"' + text.replace('"', '""') + '"', `%![%${text}%](%)%`]
|
||||||
@ -284,22 +265,39 @@ class TfComposeElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
firstUpdated() {
|
firstUpdated() {
|
||||||
|
let values = Object.entries(this.users).map((x) => ({
|
||||||
|
key: x[1].name ?? x[0],
|
||||||
|
value: x[0],
|
||||||
|
}));
|
||||||
|
if (this.author) {
|
||||||
|
values = [].concat(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
key: this.users[this.author]?.name,
|
||||||
|
value: this.author,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
values
|
||||||
|
);
|
||||||
|
}
|
||||||
let tribute = new Tribute({
|
let tribute = new Tribute({
|
||||||
|
iframe: this.shadowRoot,
|
||||||
collection: [
|
collection: [
|
||||||
{
|
{
|
||||||
values: Object.entries(this.users).map((x) => ({
|
values: values,
|
||||||
key: x[1].name,
|
|
||||||
value: x[0],
|
|
||||||
})),
|
|
||||||
selectTemplate: function (item) {
|
selectTemplate: function (item) {
|
||||||
return `[@${item.original.key}](${item.original.value})`;
|
return item
|
||||||
|
? `[@${item.original.key}](${item.original.value})`
|
||||||
|
: undefined;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trigger: '&',
|
trigger: '&',
|
||||||
values: this.autocomplete,
|
values: this.autocomplete,
|
||||||
selectTemplate: function (item) {
|
selectTemplate: function (item) {
|
||||||
return `![${item.original.key}](${item.original.value})`;
|
return item
|
||||||
|
? `![${item.original.key}](${item.original.value})`
|
||||||
|
: undefined;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -310,14 +308,15 @@ class TfComposeElement extends LitElement {
|
|||||||
updated() {
|
updated() {
|
||||||
super.updated();
|
super.updated();
|
||||||
let edit = this.renderRoot.getElementById('edit');
|
let edit = this.renderRoot.getElementById('edit');
|
||||||
if (this.last_updated_text !== edit.value) {
|
if (this.last_updated_text !== edit.innerText) {
|
||||||
let preview = this.renderRoot.getElementById('preview');
|
let preview = this.renderRoot.getElementById('preview');
|
||||||
preview.innerHTML = this.process_text(edit.value);
|
preview.innerHTML = this.process_text(edit.innerText);
|
||||||
this.last_updated_text = edit.value;
|
this.last_updated_text = edit.innerText;
|
||||||
}
|
}
|
||||||
let encrypt = this.renderRoot.getElementById('encrypt_to');
|
let encrypt = this.renderRoot.getElementById('encrypt_to');
|
||||||
if (encrypt) {
|
if (encrypt) {
|
||||||
let tribute = new Tribute({
|
let tribute = new Tribute({
|
||||||
|
iframe: this.shadowRoot,
|
||||||
values: Object.entries(this.users).map((x) => ({
|
values: Object.entries(this.users).map((x) => ({
|
||||||
key: x[1].name,
|
key: x[1].name,
|
||||||
value: x[0],
|
value: x[0],
|
||||||
@ -333,8 +332,7 @@ class TfComposeElement extends LitElement {
|
|||||||
remove_mention(id) {
|
remove_mention(id) {
|
||||||
let draft = this.get_draft();
|
let draft = this.get_draft();
|
||||||
delete draft.mentions[id];
|
delete draft.mentions[id];
|
||||||
this.notify(draft);
|
setTimeout(() => this.notify(), 0);
|
||||||
this.requestUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render_mention(mention) {
|
render_mention(mention) {
|
||||||
@ -342,7 +340,7 @@ class TfComposeElement extends LitElement {
|
|||||||
return html` <div style="display: flex; flex-direction: row">
|
return html` <div style="display: flex; flex-direction: row">
|
||||||
<div style="align-self: center; margin: 0.5em">
|
<div style="align-self: center; margin: 0.5em">
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
title="Remove ${mention.name} mention"
|
title="Remove ${mention.name} mention"
|
||||||
@click=${() => self.remove_mention(mention.link)}
|
@click=${() => self.remove_mention(mention.link)}
|
||||||
>
|
>
|
||||||
@ -396,16 +394,16 @@ class TfComposeElement extends LitElement {
|
|||||||
if (this.apps) {
|
if (this.apps) {
|
||||||
return html`
|
return html`
|
||||||
<div class="w3-card-4 w3-margin w3-padding">
|
<div class="w3-card-4 w3-margin w3-padding">
|
||||||
<select id="select" class="w3-select w3-dark-grey">
|
<select id="select" class="w3-select w3-theme-d1">
|
||||||
${Object.keys(self.apps).map(
|
${Object.keys(self.apps).map(
|
||||||
(app) => html`<option value=${app}>${app}</option>`
|
(app) => html`<option value=${app}>${app}</option>`
|
||||||
)}
|
)}
|
||||||
</select>
|
</select>
|
||||||
<button class="w3-button w3-dark-grey" @click=${attach_selected_app}>
|
<button class="w3-button w3-theme-d1" @click=${attach_selected_app}>
|
||||||
Attach
|
Attach
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (this.apps = null)}
|
@click=${() => (this.apps = null)}
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
@ -421,12 +419,12 @@ class TfComposeElement extends LitElement {
|
|||||||
self.apps = await tfrpc.rpc.apps();
|
self.apps = await tfrpc.rpc.apps();
|
||||||
}
|
}
|
||||||
if (!this.apps) {
|
if (!this.apps) {
|
||||||
return html`<button class="w3-button w3-dark-grey" @click=${attach_app}>
|
return html`<button class="w3-button w3-theme-d1" @click=${attach_app}>
|
||||||
Attach App
|
Attach App
|
||||||
</button>`;
|
</button>`;
|
||||||
} else {
|
} else {
|
||||||
return html`<button
|
return html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (this.apps = null)}
|
@click=${() => (this.apps = null)}
|
||||||
>
|
>
|
||||||
Discard App
|
Discard App
|
||||||
@ -448,15 +446,15 @@ class TfComposeElement extends LitElement {
|
|||||||
return html`
|
return html`
|
||||||
<div class="w3-container w3-padding">
|
<div class="w3-container w3-padding">
|
||||||
<p>
|
<p>
|
||||||
<input type="checkbox" class="w3-check w3-dark-grey" id="cw" @change=${() => self.set_content_warning(undefined)} checked="checked"></input>
|
<input type="checkbox" class="w3-check w3-theme-d1" id="cw" @change=${() => self.set_content_warning(undefined)} checked="checked"></input>
|
||||||
<label for="cw">CW</label>
|
<label for="cw">CW</label>
|
||||||
</p>
|
</p>
|
||||||
<input type="text" class="w3-input w3-border w3-dark-grey" id="content_warning" placeholder="Enter a content warning here." @input=${this.input} @change=${this.change} value=${draft.content_warning}></input>
|
<input type="text" class="w3-input w3-border w3-theme-d1" id="content_warning" placeholder="Enter a content warning here." @input=${self.input} value=${draft.content_warning}></input>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
} else {
|
} else {
|
||||||
return html`
|
return html`
|
||||||
<input type="checkbox" class="w3-check w3-dark-grey" id="cw" @change=${() => self.set_content_warning('')}></input>
|
<input type="checkbox" class="w3-check w3-theme-d1" id="cw" @change=${() => self.set_content_warning('')}></input>
|
||||||
<label for="cw">CW</label>
|
<label for="cw">CW</label>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@ -486,14 +484,14 @@ class TfComposeElement extends LitElement {
|
|||||||
<div style="display: flex; flex-direction: row; width: 100%">
|
<div style="display: flex; flex-direction: row; width: 100%">
|
||||||
<label for="encrypt_to">🔐 To:</label>
|
<label for="encrypt_to">🔐 To:</label>
|
||||||
<input type="text" id="encrypt_to" style="display: flex; flex: 1 1" @input=${this.update_encrypt}></input>
|
<input type="text" id="encrypt_to" style="display: flex; flex: 1 1" @input=${this.update_encrypt}></input>
|
||||||
<button class="w3-button w3-dark-grey" @click=${() => this.set_encrypt(undefined)}>🚮</button>
|
<button class="w3-button w3-theme-d1" @click=${() => this.set_encrypt(undefined)}>🚮</button>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
${draft.encrypt_to.map(
|
${draft.encrypt_to.map(
|
||||||
(x) => html`
|
(x) => html`
|
||||||
<li>
|
<li>
|
||||||
<tf-user id=${x} .users=${this.users}></tf-user>
|
<tf-user id=${x} .users=${this.users}></tf-user>
|
||||||
<input type="button" class="w3-button w3-dark-grey" value="🚮" @click=${() => this.set_encrypt(draft.encrypt_to.filter((id) => id != x))}></input>
|
<input type="button" class="w3-button w3-theme-d1" value="🚮" @click=${() => this.set_encrypt(draft.encrypt_to.filter((id) => id != x))}></input>
|
||||||
</li>`
|
</li>`
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
@ -512,7 +510,7 @@ class TfComposeElement extends LitElement {
|
|||||||
let draft = self.get_draft();
|
let draft = self.get_draft();
|
||||||
let content_warning =
|
let content_warning =
|
||||||
draft.content_warning !== undefined
|
draft.content_warning !== undefined
|
||||||
? html`<div class="w3-panel w3-round-xlarge w3-blue">
|
? html`<div class="w3-panel w3-round-xlarge w3-theme-d2">
|
||||||
<p id="content_warning_preview">${draft.content_warning}</p>
|
<p id="content_warning_preview">${draft.content_warning}</p>
|
||||||
</div>`
|
</div>`
|
||||||
: undefined;
|
: undefined;
|
||||||
@ -520,34 +518,31 @@ class TfComposeElement extends LitElement {
|
|||||||
draft.encrypt_to !== undefined
|
draft.encrypt_to !== undefined
|
||||||
? undefined
|
? undefined
|
||||||
: html`<button
|
: html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => this.set_encrypt([])}
|
@click=${() => this.set_encrypt([])}
|
||||||
>
|
>
|
||||||
🔐
|
🔐
|
||||||
</button>`;
|
</button>`;
|
||||||
let result = html`
|
let result = html`
|
||||||
<div
|
<div
|
||||||
class="w3-card-4 w3-blue-grey w3-padding"
|
class="w3-card-4 w3-theme-d4 w3-padding-small"
|
||||||
style="box-sizing: border-box"
|
style="box-sizing: border-box"
|
||||||
>
|
>
|
||||||
${this.render_encrypt()}
|
${this.render_encrypt()}
|
||||||
<div style="display: flex; flex-direction: row; width: 100%; gap: 4px">
|
<div class="w3-container w3-padding-small">
|
||||||
<div style="flex: 1 0 50%">
|
<div class="w3-half">
|
||||||
<p>
|
<span
|
||||||
<textarea
|
class="w3-input w3-theme-d1 w3-border"
|
||||||
class="w3-input w3-dark-grey w3-border"
|
style="resize: vertical; width: 100%; overflow: hidden; white-space: pre-wrap"
|
||||||
style="resize: vertical"
|
|
||||||
placeholder="Write a post here."
|
placeholder="Write a post here."
|
||||||
id="edit"
|
id="edit"
|
||||||
@input=${this.input}
|
@input=${this.input}
|
||||||
@change=${this.change}
|
|
||||||
@paste=${this.paste}
|
@paste=${this.paste}
|
||||||
>
|
contenteditable="plaintext-only"
|
||||||
${draft.text}</textarea
|
.innerText=${live(draft.text ?? '')}
|
||||||
>
|
></span>
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div style="flex: 1 0 50%">
|
<div class="w3-half w3-padding">
|
||||||
${content_warning}
|
${content_warning}
|
||||||
<div id="preview"></div>
|
<div id="preview"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -556,18 +551,14 @@ ${draft.text}</textarea
|
|||||||
self.render_mention(x)
|
self.render_mention(x)
|
||||||
)}
|
)}
|
||||||
${this.render_attach_app()} ${this.render_content_warning()}
|
${this.render_attach_app()} ${this.render_content_warning()}
|
||||||
<button
|
<button class="w3-button w3-theme-d1" id="submit" @click=${this.submit}>
|
||||||
class="w3-button w3-dark-grey"
|
|
||||||
id="submit"
|
|
||||||
@click=${this.submit}
|
|
||||||
>
|
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.attach}>
|
<button class="w3-button w3-theme-d1" @click=${this.attach}>
|
||||||
Attach
|
Attach
|
||||||
</button>
|
</button>
|
||||||
${this.render_attach_app_button()} ${encrypt}
|
${this.render_attach_app_button()} ${encrypt}
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.discard}>
|
<button class="w3-button w3-theme-d1" @click=${this.discard}>
|
||||||
Discard
|
Discard
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
import {LitElement, html} from './lit-all.min.js';
|
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
|
||||||
import {styles} from './tf-styles.js';
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Provide a list of IDs, and this lets the user pick one.
|
|
||||||
*/
|
|
||||||
class TfIdentityPickerElement extends LitElement {
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
ids: {type: Array},
|
|
||||||
selected: {type: String},
|
|
||||||
users: {type: Object},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static styles = styles;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.ids = [];
|
|
||||||
this.users = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
changed(event) {
|
|
||||||
this.selected = event.srcElement.value;
|
|
||||||
this.dispatchEvent(
|
|
||||||
new Event('change', {
|
|
||||||
srcElement: this,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return html`
|
|
||||||
<select
|
|
||||||
class="w3-select w3-dark-grey w3-padding w3-border"
|
|
||||||
@change=${this.changed}
|
|
||||||
style="max-width: 100%; overflow: hidden"
|
|
||||||
>
|
|
||||||
${(this.ids ?? []).map(
|
|
||||||
(id) =>
|
|
||||||
html`<option ?selected=${id == this.selected} value=${id}>
|
|
||||||
${this.users[id]?.name
|
|
||||||
? this.users[id]?.name + ' - '
|
|
||||||
: undefined}<small>${id}</small>
|
|
||||||
</option>`
|
|
||||||
)}
|
|
||||||
</select>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define('tf-id-picker', TfIdentityPickerElement);
|
|
@ -1,4 +1,4 @@
|
|||||||
import {LitElement, html, unsafeHTML} from './lit-all.min.js';
|
import {LitElement, html, render, unsafeHTML} from './lit-all.min.js';
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
import * as tfrpc from '/static/tfrpc.js';
|
||||||
import * as tfutils from './tf-utils.js';
|
import * as tfutils from './tf-utils.js';
|
||||||
import * as emojis from './emojis.js';
|
import * as emojis from './emojis.js';
|
||||||
@ -54,6 +54,12 @@ class TfMessageElement extends LitElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
show_reactions() {
|
||||||
|
let modal = document.getElementById('reactions_modal');
|
||||||
|
modal.users = this.users;
|
||||||
|
modal.votes = this.message?.votes || [];
|
||||||
|
}
|
||||||
|
|
||||||
render_votes() {
|
render_votes() {
|
||||||
function normalize_expression(expression) {
|
function normalize_expression(expression) {
|
||||||
if (expression === 'Like' || !expression) {
|
if (expression === 'Like' || !expression) {
|
||||||
@ -66,7 +72,8 @@ class TfMessageElement extends LitElement {
|
|||||||
return expression;
|
return expression;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return html`<div>
|
if (this.message?.votes?.length) {
|
||||||
|
return html`<div class="w3-button" @click=${this.show_reactions}>
|
||||||
${(this.message.votes || []).map(
|
${(this.message.votes || []).map(
|
||||||
(vote) => html`
|
(vote) => html`
|
||||||
<span
|
<span
|
||||||
@ -80,6 +87,7 @@ class TfMessageElement extends LitElement {
|
|||||||
)}
|
)}
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render_raw() {
|
render_raw() {
|
||||||
let raw = {
|
let raw = {
|
||||||
@ -125,7 +133,7 @@ class TfMessageElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
react(event) {
|
react(event) {
|
||||||
emojis.picker((x) => this.vote(x));
|
emojis.picker((x) => this.vote(x), null, this.whoami);
|
||||||
}
|
}
|
||||||
|
|
||||||
show_image(link) {
|
show_image(link) {
|
||||||
@ -164,7 +172,7 @@ class TfMessageElement extends LitElement {
|
|||||||
event.srcElement.classList.contains('img_caption')
|
event.srcElement.classList.contains('img_caption')
|
||||||
) {
|
) {
|
||||||
let next = event.srcElement.nextSibling;
|
let next = event.srcElement.nextSibling;
|
||||||
if (next.style.display == 'block') {
|
if (next.style.display != 'none') {
|
||||||
next.style.display = 'none';
|
next.style.display = 'none';
|
||||||
} else {
|
} else {
|
||||||
next.style.display = 'block';
|
next.style.display = 'block';
|
||||||
@ -239,9 +247,7 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
if (mentions.length) {
|
if (mentions.length) {
|
||||||
let self = this;
|
let self = this;
|
||||||
return html`
|
return html`
|
||||||
<fieldset
|
<fieldset style="padding: 0.5em; border: 1px solid black">
|
||||||
style="background-color: rgba(0, 0, 0, 0.1); padding: 0.5em; border: 1px solid black"
|
|
||||||
>
|
|
||||||
<legend>Mentions</legend>
|
<legend>Mentions</legend>
|
||||||
${mentions.map((x) => self.render_mention(x))}
|
${mentions.map((x) => self.render_mention(x))}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
@ -282,14 +288,14 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
if (this.message.child_messages?.length) {
|
if (this.message.child_messages?.length) {
|
||||||
if (!this.expanded[this.message.id]) {
|
if (!this.expanded[this.message.id]) {
|
||||||
return html`<button
|
return html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => self.set_expanded(true)}
|
@click=${() => self.set_expanded(true)}
|
||||||
>
|
>
|
||||||
+ ${this.total_child_messages(this.message) + ' More'}
|
+ ${this.total_child_messages(this.message) + ' More'}
|
||||||
</button>`;
|
</button>`;
|
||||||
} else {
|
} else {
|
||||||
return html`<button
|
return html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => self.set_expanded(false)}
|
@click=${() => self.set_expanded(false)}
|
||||||
>
|
>
|
||||||
Collapse</button
|
Collapse</button
|
||||||
@ -331,20 +337,23 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
if (this.message?.decrypted?.type == 'post') {
|
if (this.message?.decrypted?.type == 'post') {
|
||||||
content = this.message.decrypted;
|
content = this.message.decrypted;
|
||||||
}
|
}
|
||||||
|
let class_background = this.message?.decrypted
|
||||||
|
? 'w3-pale-red'
|
||||||
|
: 'w3-theme-d4';
|
||||||
let self = this;
|
let self = this;
|
||||||
let raw_button;
|
let raw_button;
|
||||||
switch (this.format) {
|
switch (this.format) {
|
||||||
case 'raw':
|
case 'raw':
|
||||||
if (content?.type == 'post' || content?.type == 'blog') {
|
if (content?.type == 'post' || content?.type == 'blog') {
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'md')}
|
@click=${() => (self.format = 'md')}
|
||||||
>
|
>
|
||||||
Markdown
|
Markdown
|
||||||
</button>`;
|
</button>`;
|
||||||
} else {
|
} else {
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'message')}
|
@click=${() => (self.format = 'message')}
|
||||||
>
|
>
|
||||||
Message
|
Message
|
||||||
@ -353,7 +362,7 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
break;
|
break;
|
||||||
case 'md':
|
case 'md':
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'message')}
|
@click=${() => (self.format = 'message')}
|
||||||
>
|
>
|
||||||
Message
|
Message
|
||||||
@ -361,7 +370,7 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
break;
|
break;
|
||||||
case 'decrypted':
|
case 'decrypted':
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'raw')}
|
@click=${() => (self.format = 'raw')}
|
||||||
>
|
>
|
||||||
Raw
|
Raw
|
||||||
@ -370,14 +379,14 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
default:
|
default:
|
||||||
if (this.message.decrypted) {
|
if (this.message.decrypted) {
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'decrypted')}
|
@click=${() => (self.format = 'decrypted')}
|
||||||
>
|
>
|
||||||
Decrypted
|
Decrypted
|
||||||
</button>`;
|
</button>`;
|
||||||
} else {
|
} else {
|
||||||
raw_button = html`<button
|
raw_button = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => (self.format = 'raw')}
|
@click=${() => (self.format = 'raw')}
|
||||||
>
|
>
|
||||||
Raw
|
Raw
|
||||||
@ -389,8 +398,8 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
let body;
|
let body;
|
||||||
return html`
|
return html`
|
||||||
<div
|
<div
|
||||||
class="w3-card-4"
|
class="w3-card-4 w3-theme-d4 w3-border-theme"
|
||||||
style="background-color: rgba(255, 255, 255, 0.1); margin-top: 8px; padding: 16px; display: inline-block; overflow-wrap: anywhere"
|
style="margin-top: 8px; padding: 16px; display: inline-block; overflow-wrap: anywhere"
|
||||||
>
|
>
|
||||||
<tf-user id=${self.message.author} .users=${self.users}></tf-user>
|
<tf-user id=${self.message.author} .users=${self.users}></tf-user>
|
||||||
<span style="padding-right: 8px"
|
<span style="padding-right: 8px"
|
||||||
@ -400,13 +409,24 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
>
|
>
|
||||||
${raw_button} ${self.format == 'raw' ? self.render_raw() : inner}
|
${raw_button} ${self.format == 'raw' ? self.render_raw() : inner}
|
||||||
${self.render_votes()}
|
${self.render_votes()}
|
||||||
|
${(self.message.child_messages || []).map(
|
||||||
|
(x) => html`
|
||||||
|
<tf-message
|
||||||
|
.message=${x}
|
||||||
|
whoami=${self.whoami}
|
||||||
|
.users=${self.users}
|
||||||
|
.drafts=${self.drafts}
|
||||||
|
.expanded=${self.expanded}
|
||||||
|
></tf-message>
|
||||||
|
`
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
if (this.message?.type === 'contact_group') {
|
if (this.message?.type === 'contact_group') {
|
||||||
return html` <div
|
return html` <div
|
||||||
class="w3-card-4"
|
class="w3-card-4 w3-theme-d4 w3-border-theme"
|
||||||
style="border: 1px solid black; background-color: rgba(255, 255, 255, 0.1); margin-top: 8px; padding: 16px; overflow-wrap: anywhere"
|
style="margin-top: 8px; padding: 16px; overflow-wrap: anywhere"
|
||||||
>
|
>
|
||||||
${this.message.messages.map(
|
${this.message.messages.map(
|
||||||
(x) =>
|
(x) =>
|
||||||
@ -421,8 +441,8 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
</div>`;
|
</div>`;
|
||||||
} else if (this.message.placeholder) {
|
} else if (this.message.placeholder) {
|
||||||
return html` <div
|
return html` <div
|
||||||
class="w3-card-4"
|
class="w3-card-4 w3-theme-d4 w3-border-theme"
|
||||||
style="border: 1px solid black; background-color: rgba(255, 255, 255, 0.1); margin-top: 8px; padding: 16px; overflow-wrap: anywhere"
|
style="margin-top: 8px; padding: 16px; overflow-wrap: anywhere"
|
||||||
>
|
>
|
||||||
<a target="_top" href=${'#' + this.message.id}>${this.message.id}</a>
|
<a target="_top" href=${'#' + this.message.id}>${this.message.id}</a>
|
||||||
(placeholder)
|
(placeholder)
|
||||||
@ -498,13 +518,11 @@ ${JSON.stringify(mention, null, 2)}</pre
|
|||||||
branch=${this.message.id}
|
branch=${this.message.id}
|
||||||
.drafts=${this.drafts}
|
.drafts=${this.drafts}
|
||||||
@tf-discard=${this.discard_reply}
|
@tf-discard=${this.discard_reply}
|
||||||
|
author=${this.message.author}
|
||||||
></tf-compose>
|
></tf-compose>
|
||||||
`
|
`
|
||||||
: html`
|
: html`
|
||||||
<button
|
<button class="w3-button w3-theme-d1" @click=${this.show_reply}>
|
||||||
class="w3-button w3-dark-grey"
|
|
||||||
@click=${this.show_reply}
|
|
||||||
>
|
|
||||||
Reply
|
Reply
|
||||||
</button>
|
</button>
|
||||||
`;
|
`;
|
||||||
@ -533,7 +551,7 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
}
|
}
|
||||||
let content_warning = html`
|
let content_warning = html`
|
||||||
<div
|
<div
|
||||||
class="w3-panel w3-round-xlarge w3-blue"
|
class="w3-panel w3-round-xlarge w3-theme-l4"
|
||||||
style="cursor: pointer"
|
style="cursor: pointer"
|
||||||
@click=${(x) => this.toggle_expanded(':cw')}
|
@click=${(x) => this.toggle_expanded(':cw')}
|
||||||
>
|
>
|
||||||
@ -553,9 +571,6 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
let is_encrypted = this.message?.decrypted
|
let is_encrypted = this.message?.decrypted
|
||||||
? html`<span style="align-self: center">🔓</span>`
|
? html`<span style="align-self: center">🔓</span>`
|
||||||
: undefined;
|
: undefined;
|
||||||
let style_background = this.message?.decrypted
|
|
||||||
? 'rgba(255, 0, 0, 0.2)'
|
|
||||||
: 'rgba(255, 255, 255, 0.1)';
|
|
||||||
return html`
|
return html`
|
||||||
<style>
|
<style>
|
||||||
code {
|
code {
|
||||||
@ -572,8 +587,8 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div
|
<div
|
||||||
class="w3-card-4"
|
class="w3-card-4 ${class_background} w3-border-theme"
|
||||||
style="border: 1px solid black; background-color: ${style_background}; margin-top: 8px; padding: 16px"
|
style="margin-top: 8px; padding: 16px"
|
||||||
>
|
>
|
||||||
<div style="display: flex; flex-direction: row">
|
<div style="display: flex; flex-direction: row">
|
||||||
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
||||||
@ -588,7 +603,7 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
${payload} ${this.render_votes()}
|
${payload} ${this.render_votes()}
|
||||||
<p>
|
<p>
|
||||||
${reply}
|
${reply}
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.react}>
|
<button class="w3-button w3-theme-d1" @click=${this.react}>
|
||||||
React
|
React
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
@ -599,9 +614,6 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
let is_encrypted = this.message?.decrypted
|
let is_encrypted = this.message?.decrypted
|
||||||
? html`<span style="align-self: center">🔓</span>`
|
? html`<span style="align-self: center">🔓</span>`
|
||||||
: undefined;
|
: undefined;
|
||||||
let style_background = this.message?.decrypted
|
|
||||||
? 'rgba(255, 0, 0, 0.2)'
|
|
||||||
: 'rgba(255, 255, 255, 0.1)';
|
|
||||||
return html`
|
return html`
|
||||||
<style>
|
<style>
|
||||||
code {
|
code {
|
||||||
@ -618,8 +630,8 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div
|
<div
|
||||||
class="w3-card-4"
|
class="w3-card-4 ${class_background} w3-border-theme"
|
||||||
style="border: 1px solid black; background-color: ${style_background}; margin-top: 8px; padding: 16px"
|
style="margin-top: 8px; padding: 16px"
|
||||||
>
|
>
|
||||||
<div style="display: flex; flex-direction: row">
|
<div style="display: flex; flex-direction: row">
|
||||||
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
||||||
@ -633,7 +645,7 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
</div>
|
</div>
|
||||||
${content.text} ${this.render_votes()}
|
${content.text} ${this.render_votes()}
|
||||||
<p>
|
<p>
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.react}>
|
<button class="w3-button w3-theme-d1" @click=${this.react}>
|
||||||
React
|
React
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
@ -685,13 +697,11 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
branch=${this.message.id}
|
branch=${this.message.id}
|
||||||
.drafts=${this.drafts}
|
.drafts=${this.drafts}
|
||||||
@tf-discard=${this.discard_reply}
|
@tf-discard=${this.discard_reply}
|
||||||
|
author=${this.message.author}
|
||||||
></tf-compose>
|
></tf-compose>
|
||||||
`
|
`
|
||||||
: html`
|
: html`
|
||||||
<button
|
<button class="w3-button w3-theme-d1" @click=${this.show_reply}>
|
||||||
class="w3-button w3-dark-grey"
|
|
||||||
@click=${this.show_reply}
|
|
||||||
>
|
|
||||||
Reply
|
Reply
|
||||||
</button>
|
</button>
|
||||||
`;
|
`;
|
||||||
@ -711,8 +721,8 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div
|
<div
|
||||||
class="w3-card-4"
|
class="w3-card-4 w3-theme-d4 w3-border-theme"
|
||||||
style="border: 1px solid black; background-color: rgba(255, 255, 255, 0.1); margin-top: 8px; padding: 16px"
|
style="margin-top: 8px; padding: 16px"
|
||||||
>
|
>
|
||||||
<div style="display: flex; flex-direction: row">
|
<div style="display: flex; flex-direction: row">
|
||||||
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
<tf-user id=${this.message.author} .users=${this.users}></tf-user>
|
||||||
@ -728,7 +738,7 @@ ${JSON.stringify(content, null, 2)}</pre
|
|||||||
${this.render_mentions()}
|
${this.render_mentions()}
|
||||||
<div>
|
<div>
|
||||||
${reply}
|
${reply}
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.react}>
|
<button class="w3-button w3-theme-d1" @click=${this.react}>
|
||||||
React
|
React
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -188,6 +188,10 @@ class TfProfileElement extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copy_id() {
|
||||||
|
navigator.clipboard.writeText(this.id);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (
|
if (
|
||||||
this.id == this.whoami &&
|
this.id == this.whoami &&
|
||||||
@ -215,49 +219,49 @@ class TfProfileElement extends LitElement {
|
|||||||
let server_follow;
|
let server_follow;
|
||||||
if (this.server_follows_me === true) {
|
if (this.server_follows_me === true) {
|
||||||
server_follow = html`<button
|
server_follow = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => this.server_follow_me(false)}
|
@click=${() => this.server_follow_me(false)}
|
||||||
>
|
>
|
||||||
Server, Stop Following Me
|
Server, Stop Following Me
|
||||||
</button>`;
|
</button>`;
|
||||||
} else if (this.server_follows_me === false) {
|
} else if (this.server_follows_me === false) {
|
||||||
server_follow = html`<button
|
server_follow = html`<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => this.server_follow_me(true)}
|
@click=${() => this.server_follow_me(true)}
|
||||||
>
|
>
|
||||||
Server, Follow Me
|
Server, Follow Me
|
||||||
</button>`;
|
</button>`;
|
||||||
}
|
}
|
||||||
edit = html`
|
edit = html`
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.save_edits}>
|
<button class="w3-button w3-theme-d1" @click=${this.save_edits}>
|
||||||
Save Profile
|
Save Profile
|
||||||
</button>
|
</button>
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.discard_edits}>
|
<button class="w3-button w3-theme-d1" @click=${this.discard_edits}>
|
||||||
Discard
|
Discard
|
||||||
</button>
|
</button>
|
||||||
${server_follow}
|
${server_follow}
|
||||||
`;
|
`;
|
||||||
} else {
|
} else {
|
||||||
edit = html`<button class="w3-button w3-dark-grey" @click=${this.edit}>
|
edit = html`<button class="w3-button w3-theme-d1" @click=${this.edit}>
|
||||||
Edit Profile
|
Edit Profile
|
||||||
</button>`;
|
</button>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.id !== this.whoami && this.following !== undefined) {
|
if (this.id !== this.whoami && this.following !== undefined) {
|
||||||
follow = this.following
|
follow = this.following
|
||||||
? html`<button class="w3-button w3-dark-grey" @click=${this.unfollow}>
|
? html`<button class="w3-button w3-theme-d1" @click=${this.unfollow}>
|
||||||
Unfollow
|
Unfollow
|
||||||
</button>`
|
</button>`
|
||||||
: html`<button class="w3-button w3-dark-grey" @click=${this.follow}>
|
: html`<button class="w3-button w3-theme-d1" @click=${this.follow}>
|
||||||
Follow
|
Follow
|
||||||
</button>`;
|
</button>`;
|
||||||
}
|
}
|
||||||
if (this.id !== this.whoami && this.blocking !== undefined) {
|
if (this.id !== this.whoami && this.blocking !== undefined) {
|
||||||
block = this.blocking
|
block = this.blocking
|
||||||
? html`<button class="w3-button w3-dark-grey" @click=${this.unblock}>
|
? html`<button class="w3-button w3-theme-d1" @click=${this.unblock}>
|
||||||
Unblock
|
Unblock
|
||||||
</button>`
|
</button>`
|
||||||
: html`<button class="w3-button w3-dark-grey" @click=${this.block}>
|
: html`<button class="w3-button w3-theme-d1" @click=${this.block}>
|
||||||
Block
|
Block
|
||||||
</button>`;
|
</button>`;
|
||||||
}
|
}
|
||||||
@ -267,16 +271,16 @@ class TfProfileElement extends LitElement {
|
|||||||
<div class="w3-container">
|
<div class="w3-container">
|
||||||
<div>
|
<div>
|
||||||
<label for="name">Name:</label>
|
<label for="name">Name:</label>
|
||||||
<input class="w3-input w3-dark-grey" type="text" id="name" value=${this.editing.name} @input=${(event) => (this.editing = Object.assign({}, this.editing, {name: event.srcElement.value}))}></input>
|
<input class="w3-input w3-theme-d1" type="text" id="name" value=${this.editing.name} @input=${(event) => (this.editing = Object.assign({}, this.editing, {name: event.srcElement.value}))}></input>
|
||||||
</div>
|
</div>
|
||||||
<div><label for="description">Description:</label></div>
|
<div><label for="description">Description:</label></div>
|
||||||
<textarea class="w3-input w3-dark-grey" style="resize: vertical" rows="8" id="description" @input=${(event) => (this.editing = Object.assign({}, this.editing, {description: event.srcElement.value}))}>${this.editing.description}</textarea>
|
<textarea class="w3-input w3-theme-d1" style="resize: vertical" rows="8" id="description" @input=${(event) => (this.editing = Object.assign({}, this.editing, {description: event.srcElement.value}))}>${this.editing.description}</textarea>
|
||||||
<div>
|
<div>
|
||||||
<label for="public_web_hosting">Public Web Hosting:</label>
|
<label for="public_web_hosting">Public Web Hosting:</label>
|
||||||
<input class="w3-check w3-dark-grey" type="checkbox" id="public_web_hosting" ?checked=${this.editing.publicWebHosting} @input=${(event) => (self.editing = Object.assign({}, self.editing, {publicWebHosting: event.srcElement.checked}))}></input>
|
<input class="w3-check w3-theme-d1" type="checkbox" id="public_web_hosting" ?checked=${this.editing.publicWebHosting} @input=${(event) => (self.editing = Object.assign({}, self.editing, {publicWebHosting: event.srcElement.checked}))}></input>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.attach_image}>Attach Image</button>
|
<button class="w3-button w3-theme-d1" @click=${this.attach_image}>Attach Image</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`
|
</div>`
|
||||||
@ -287,6 +291,14 @@ class TfProfileElement extends LitElement {
|
|||||||
let description = this.editing?.description ?? profile.description;
|
let description = this.editing?.description ?? profile.description;
|
||||||
return html`<div style="border: 2px solid black; background-color: rgba(255, 255, 255, 0.2); padding: 16px">
|
return html`<div style="border: 2px solid black; background-color: rgba(255, 255, 255, 0.2); padding: 16px">
|
||||||
<tf-user id=${this.id} .users=${this.users}></tf-user> (${tfutils.human_readable_size(this.size)})
|
<tf-user id=${this.id} .users=${this.users}></tf-user> (${tfutils.human_readable_size(this.size)})
|
||||||
|
<div class="w3-row">
|
||||||
|
<div class="w3-col s1 w3-container w3-right">
|
||||||
|
<button class="w3-button w3-theme-d1 w3-ripple" @click=${this.copy_id}>Copy</button>
|
||||||
|
</div>
|
||||||
|
<div class="w3-rest w3-container">
|
||||||
|
<input type="text" class="w3-theme-d1" style="width: 100%; vertical-align: middle" readonly value=${this.id}></input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div style="display: flex; flex-direction: row; gap: 1em">
|
<div style="display: flex; flex-direction: row; gap: 1em">
|
||||||
${edit_profile}
|
${edit_profile}
|
||||||
<div style="flex: 1 0 50%">
|
<div style="flex: 1 0 50%">
|
||||||
|
68
apps/ssb/tf-reactions-modal.js
Normal file
68
apps/ssb/tf-reactions-modal.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import {LitElement, html, unsafeHTML} from './lit-all.min.js';
|
||||||
|
import {styles} from './tf-styles.js';
|
||||||
|
|
||||||
|
class TfReactionsModalElement extends LitElement {
|
||||||
|
static get properties() {
|
||||||
|
return {
|
||||||
|
users: {type: Object},
|
||||||
|
votes: {type: Array},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static styles = styles;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.votes = [];
|
||||||
|
this.users = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
clear() {
|
||||||
|
this.votes = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
let self = this;
|
||||||
|
return this.votes?.length
|
||||||
|
? html` <div
|
||||||
|
class="w3-modal w3-animate-opacity"
|
||||||
|
style="display: block; box-sizing: border-box"
|
||||||
|
>
|
||||||
|
<div class="w3-modal-content w3-card-4 w3-theme-d1">
|
||||||
|
<div class="w3-container w3-padding">
|
||||||
|
<header class="w3-container">
|
||||||
|
<h2>Reactions</h2>
|
||||||
|
<span class="w3-button w3-display-topright" @click=${this.clear}
|
||||||
|
>×</span
|
||||||
|
>
|
||||||
|
</header>
|
||||||
|
<ul class="w3-theme-dark w3-container w3-ul">
|
||||||
|
${this.votes.map(
|
||||||
|
(x) => html`
|
||||||
|
<li class="w3-bar">
|
||||||
|
<span class="w3-bar-item"
|
||||||
|
>${x?.content?.vote?.expression}</span
|
||||||
|
>
|
||||||
|
<tf-user
|
||||||
|
class="w3-bar-item"
|
||||||
|
id=${x.author}
|
||||||
|
.users=${this.users}
|
||||||
|
></tf-user>
|
||||||
|
<span class="w3-bar-item w3-right"
|
||||||
|
>${new Date(x?.timestamp).toLocaleString()}</span
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
`
|
||||||
|
)}
|
||||||
|
</ul>
|
||||||
|
<footer class="w3-container w3-padding">
|
||||||
|
<button class="w3-button" @click=${this.clear}>Close</button>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
: undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define('tf-reactions-modal', TfReactionsModalElement);
|
File diff suppressed because it is too large
Load Diff
@ -7,35 +7,52 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
return {
|
return {
|
||||||
broadcasts: {type: Array},
|
broadcasts: {type: Array},
|
||||||
identities: {type: Array},
|
identities: {type: Array},
|
||||||
|
my_identities: {type: Array},
|
||||||
connections: {type: Array},
|
connections: {type: Array},
|
||||||
stored_connections: {type: Array},
|
stored_connections: {type: Array},
|
||||||
users: {type: Object},
|
users: {type: Object},
|
||||||
|
server_identity: {type: String},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static styles = styles;
|
static styles = styles;
|
||||||
|
|
||||||
|
static k_broadcast_emojis = {
|
||||||
|
discovery: '🏓',
|
||||||
|
room: '🚪',
|
||||||
|
peer_exchange: '🕸',
|
||||||
|
};
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
let self = this;
|
let self = this;
|
||||||
this.broadcasts = [];
|
this.broadcasts = [];
|
||||||
this.identities = [];
|
this.identities = [];
|
||||||
|
this.my_identities = [];
|
||||||
this.connections = [];
|
this.connections = [];
|
||||||
this.stored_connections = [];
|
this.stored_connections = [];
|
||||||
this.users = {};
|
this.users = {};
|
||||||
|
tfrpc.rpc.getIdentities().then(function (identities) {
|
||||||
|
self.my_identities = identities || [];
|
||||||
|
});
|
||||||
tfrpc.rpc.getAllIdentities().then(function (identities) {
|
tfrpc.rpc.getAllIdentities().then(function (identities) {
|
||||||
self.identities = identities || [];
|
self.identities = identities || [];
|
||||||
});
|
});
|
||||||
tfrpc.rpc.getStoredConnections().then(function (connections) {
|
tfrpc.rpc.getStoredConnections().then(function (connections) {
|
||||||
self.stored_connections = connections || [];
|
self.stored_connections = connections || [];
|
||||||
});
|
});
|
||||||
|
tfrpc.rpc.getServerIdentity().then(function (identity) {
|
||||||
|
self.server_identity = identity;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
render_connection_summary(connection) {
|
render_connection_summary(connection) {
|
||||||
if (connection.address && connection.port) {
|
if (connection.address && connection.port) {
|
||||||
return html`(<small>${connection.address}:${connection.port}</small>)`;
|
return html`<div>
|
||||||
|
<small>${connection.address}:${connection.port}</small>
|
||||||
|
</div>`;
|
||||||
} else if (connection.tunnel) {
|
} else if (connection.tunnel) {
|
||||||
return html`(room peer)`;
|
return html`<div>room peer</div>`;
|
||||||
} else {
|
} else {
|
||||||
return JSON.stringify(connection);
|
return JSON.stringify(connection);
|
||||||
}
|
}
|
||||||
@ -61,7 +78,7 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
return html`
|
return html`
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => self._tunnel(connection.tunnel.id, connection.pubkey)}
|
@click=${() => self._tunnel(connection.tunnel.id, connection.pubkey)}
|
||||||
>
|
>
|
||||||
Connect
|
Connect
|
||||||
@ -73,15 +90,18 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
|
|
||||||
render_broadcast(connection) {
|
render_broadcast(connection) {
|
||||||
return html`
|
return html`
|
||||||
<li>
|
<li class="w3-bar" style="overflow: hidden; overflow-wrap: nowrap">
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-bar-item w3-button w3-theme-d1"
|
||||||
@click=${() => tfrpc.rpc.connect(connection)}
|
@click=${() => tfrpc.rpc.connect(connection)}
|
||||||
>
|
>
|
||||||
Connect
|
Connect
|
||||||
</button>
|
</button>
|
||||||
|
<div class="w3-bar-item">
|
||||||
|
${TfTabConnectionsElement.k_broadcast_emojis[connection.origin]}
|
||||||
<tf-user id=${connection.pubkey} .users=${this.users}></tf-user>
|
<tf-user id=${connection.pubkey} .users=${this.users}></tf-user>
|
||||||
${this.render_connection_summary(connection)}
|
${this.render_connection_summary(connection)}
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@ -92,9 +112,19 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render_connection(connection) {
|
render_connection(connection) {
|
||||||
|
let requests = Object.values(
|
||||||
|
connection.requests.reduce(function (accumulator, value) {
|
||||||
|
let key = `${value.name}:${Math.sign(value.request_number)}`;
|
||||||
|
if (!accumulator[key]) {
|
||||||
|
accumulator[key] = Object.assign({count: 0}, value);
|
||||||
|
}
|
||||||
|
accumulator[key].count++;
|
||||||
|
return accumulator;
|
||||||
|
}, {})
|
||||||
|
);
|
||||||
return html`
|
return html`
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() => tfrpc.rpc.closeConnection(connection.id)}
|
@click=${() => tfrpc.rpc.closeConnection(connection.id)}
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
@ -103,6 +133,20 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
${connection.tunnel !== undefined
|
${connection.tunnel !== undefined
|
||||||
? '🚇'
|
? '🚇'
|
||||||
: html`(${connection.host}:${connection.port})`}
|
: html`(${connection.host}:${connection.port})`}
|
||||||
|
<div>
|
||||||
|
${requests.map(
|
||||||
|
(x) => html`
|
||||||
|
<span class="w3-tag w3-small"
|
||||||
|
>${x.request_number > 0 ? '🟩' : '🟥'} ${x.name}
|
||||||
|
<span
|
||||||
|
class="w3-badge w3-white"
|
||||||
|
style=${x.count > 1 ? undefined : 'display: none'}
|
||||||
|
>${x.count}</span
|
||||||
|
></span
|
||||||
|
>
|
||||||
|
`
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
${this.connections
|
${this.connections
|
||||||
.filter((x) => x.tunnel === this.connections.indexOf(connection))
|
.filter((x) => x.tunnel === this.connections.indexOf(connection))
|
||||||
@ -115,56 +159,74 @@ class TfTabConnectionsElement extends LitElement {
|
|||||||
render() {
|
render() {
|
||||||
let self = this;
|
let self = this;
|
||||||
return html`
|
return html`
|
||||||
<div class="w3-container">
|
<div class="w3-container" style="box-sizing: border-box">
|
||||||
<h2>New Connection</h2>
|
<h2>New Connection</h2>
|
||||||
<textarea class="w3-input w3-dark-grey" id="code"></textarea>
|
<textarea class="w3-input w3-theme-d1" id="code"></textarea>
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${() =>
|
@click=${() =>
|
||||||
tfrpc.rpc.connect(self.renderRoot.getElementById('code').value)}
|
tfrpc.rpc.connect(self.renderRoot.getElementById('code').value)}
|
||||||
>
|
>
|
||||||
Connect
|
Connect
|
||||||
</button>
|
</button>
|
||||||
<h2>Broadcasts</h2>
|
<h2>Broadcasts</h2>
|
||||||
<ul>
|
<ul class="w3-ul w3-border">
|
||||||
${this.broadcasts
|
${this.broadcasts
|
||||||
.filter((x) => x.address)
|
.filter((x) => x.address)
|
||||||
.map((x) => self.render_broadcast(x))}
|
.map((x) => self.render_broadcast(x))}
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Connections</h2>
|
<h2>Connections</h2>
|
||||||
<ul>
|
<ul class="w3-ul w3-border">
|
||||||
${this.connections
|
${this.connections
|
||||||
.filter((x) => x.tunnel === undefined)
|
.filter((x) => x.tunnel === undefined)
|
||||||
.map((x) => html` <li>${this.render_connection(x)}</li> `)}
|
.map(
|
||||||
|
(x) => html`
|
||||||
|
<li class="w3-bar">${this.render_connection(x)}</li>
|
||||||
|
`
|
||||||
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Stored Connections (WIP)</h2>
|
<h2>Stored Connections</h2>
|
||||||
<ul>
|
<ul class="w3-ul w3-border">
|
||||||
${this.stored_connections.map(
|
${this.stored_connections.map(
|
||||||
(x) => html`
|
(x) => html`
|
||||||
<li>
|
<li class="w3-bar">
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-bar-item w3-button w3-theme-d1"
|
||||||
@click=${() => self.forget_stored_connection(x)}
|
@click=${() => self.forget_stored_connection(x)}
|
||||||
>
|
>
|
||||||
Forget
|
Forget
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-bar-item w3-button w3-theme-d1"
|
||||||
@click=${() => tfrpc.rpc.connect(x)}
|
@click=${() => tfrpc.rpc.connect(x)}
|
||||||
>
|
>
|
||||||
Connect
|
Connect
|
||||||
</button>
|
</button>
|
||||||
${x.address}:${x.port}
|
<div class="w3-bar-item">
|
||||||
<tf-user id=${x.pubkey} .users=${self.users}></tf-user>
|
<tf-user id=${x.pubkey} .users=${self.users}></tf-user>
|
||||||
|
<div><small>${x.address}:${x.port}</small></div>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
`
|
`
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Local Accounts</h2>
|
<h2>Local Accounts</h2>
|
||||||
<ul>
|
<ul class="w3-ul w3-border">
|
||||||
${this.identities.map(
|
${this.identities.map(
|
||||||
(x) =>
|
(x) =>
|
||||||
html`<li><tf-user id=${x} .users=${this.users}></tf-user></li>`
|
html`<li class="w3-bar">
|
||||||
|
${x == this.server_identity
|
||||||
|
? html`<span class="w3-tag w3-medium w3-round w3-theme-l1"
|
||||||
|
>🖥 local server</span
|
||||||
|
>`
|
||||||
|
: undefined}
|
||||||
|
${this.my_identities.indexOf(x) != -1
|
||||||
|
? html`<span class="w3-tag w3-medium w3-round w3-theme-d1"
|
||||||
|
>😎 you</span
|
||||||
|
>`
|
||||||
|
: undefined}
|
||||||
|
<tf-user id=${x} .users=${this.users}></tf-user>
|
||||||
|
</li>`
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -187,7 +187,7 @@ class TfTabNewsFeedElement extends LitElement {
|
|||||||
if (!this.hash.startsWith('#@') && !this.hash.startsWith('#%')) {
|
if (!this.hash.startsWith('#@') && !this.hash.startsWith('#%')) {
|
||||||
more = html`
|
more = html`
|
||||||
<p>
|
<p>
|
||||||
<button class="w3-button w3-dark-grey" @click=${this.load_more}>
|
<button class="w3-button w3-theme-d1" @click=${this.load_more}>
|
||||||
Load More
|
Load More
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
|
@ -12,6 +12,7 @@ class TfTabNewsElement extends LitElement {
|
|||||||
following: {type: Array},
|
following: {type: Array},
|
||||||
drafts: {type: Object},
|
drafts: {type: Object},
|
||||||
expanded: {type: Object},
|
expanded: {type: Object},
|
||||||
|
loading: {type: Boolean},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,10 +85,7 @@ class TfTabNewsElement extends LitElement {
|
|||||||
} else {
|
} else {
|
||||||
delete this.drafts[id];
|
delete this.drafts[id];
|
||||||
}
|
}
|
||||||
/* Only trigger a re-render if we're creating a new draft or discarding an old one. */
|
|
||||||
if ((previous !== undefined) != (event.detail.draft !== undefined)) {
|
|
||||||
this.drafts = Object.assign({}, this.drafts);
|
this.drafts = Object.assign({}, this.drafts);
|
||||||
}
|
|
||||||
tfrpc.rpc.localStorageSet('drafts', JSON.stringify(this.drafts));
|
tfrpc.rpc.localStorageSet('drafts', JSON.stringify(this.drafts));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,17 +114,31 @@ class TfTabNewsElement extends LitElement {
|
|||||||
.users=${this.users}
|
.users=${this.users}
|
||||||
></tf-profile>`
|
></tf-profile>`
|
||||||
: undefined;
|
: undefined;
|
||||||
|
let edit_profile;
|
||||||
|
if (
|
||||||
|
!this.loading &&
|
||||||
|
this.users[this.whoami]?.name === undefined &&
|
||||||
|
this.hash.substring(1) != this.whoami
|
||||||
|
) {
|
||||||
|
edit_profile = html` <div
|
||||||
|
class="w3-panel w3-padding w3-round w3-card-4 w3-theme-l3"
|
||||||
|
>
|
||||||
|
ℹ️ Follow your identity link ☝️ above to edit your profile and set your
|
||||||
|
name.
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
return html`
|
return html`
|
||||||
<p class="w3-bar">
|
<p class="w3-bar">
|
||||||
<button
|
<button
|
||||||
class="w3-bar-item w3-button w3-dark-grey"
|
class="w3-bar-item w3-button w3-theme-d1"
|
||||||
@click=${this.show_more}
|
@click=${this.show_more}
|
||||||
>
|
>
|
||||||
${this.new_messages_text()}
|
${this.new_messages_text()}
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
<div>
|
<div class="w3-bar">
|
||||||
Welcome, <tf-user id=${this.whoami} .users=${this.users}></tf-user>!
|
Welcome, <tf-user id=${this.whoami} .users=${this.users}></tf-user>!
|
||||||
|
${edit_profile}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<tf-compose
|
<tf-compose
|
||||||
|
@ -110,14 +110,14 @@ class TfTabQueryElement extends LitElement {
|
|||||||
<textarea
|
<textarea
|
||||||
id="search"
|
id="search"
|
||||||
rows="8"
|
rows="8"
|
||||||
class="w3-input w3-dark-grey"
|
class="w3-input w3-theme-d1"
|
||||||
style="flex: 1; resize: vertical"
|
style="flex: 1; resize: vertical"
|
||||||
@keydown=${this.search_keydown}
|
@keydown=${this.search_keydown}
|
||||||
>
|
>
|
||||||
${this.query}</textarea
|
${this.query}</textarea
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
class="w3-button w3-dark-grey"
|
class="w3-button w3-theme-d1"
|
||||||
@click=${(event) =>
|
@click=${(event) =>
|
||||||
self.search(self.renderRoot.getElementById('search').value)}
|
self.search(self.renderRoot.getElementById('search').value)}
|
||||||
>
|
>
|
||||||
|
@ -5,6 +5,7 @@ import {styles} from './tf-styles.js';
|
|||||||
class TfTabSearchElement extends LitElement {
|
class TfTabSearchElement extends LitElement {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
return {
|
return {
|
||||||
|
drafts: {type: Object},
|
||||||
whoami: {type: String},
|
whoami: {type: String},
|
||||||
users: {type: Object},
|
users: {type: Object},
|
||||||
following: {type: Array},
|
following: {type: Array},
|
||||||
@ -22,6 +23,10 @@ class TfTabSearchElement extends LitElement {
|
|||||||
this.users = {};
|
this.users = {};
|
||||||
this.following = [];
|
this.following = [];
|
||||||
this.expanded = {};
|
this.expanded = {};
|
||||||
|
this.drafts = {};
|
||||||
|
tfrpc.rpc.localStorageGet('drafts').then(function (d) {
|
||||||
|
self.drafts = JSON.parse(d || '{}');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async search(query) {
|
async search(query) {
|
||||||
@ -70,6 +75,18 @@ class TfTabSearchElement extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
draft(event) {
|
||||||
|
let id = event.detail.id || '';
|
||||||
|
let previous = this.drafts[id];
|
||||||
|
if (event.detail.draft !== undefined) {
|
||||||
|
this.drafts[id] = event.detail.draft;
|
||||||
|
} else {
|
||||||
|
delete this.drafts[id];
|
||||||
|
}
|
||||||
|
this.drafts = Object.assign({}, this.drafts);
|
||||||
|
tfrpc.rpc.localStorageSet('drafts', JSON.stringify(this.drafts));
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (this.query !== this.last_query) {
|
if (this.query !== this.last_query) {
|
||||||
this.last_query = this.query;
|
this.last_query = this.query;
|
||||||
@ -78,10 +95,10 @@ class TfTabSearchElement extends LitElement {
|
|||||||
let self = this;
|
let self = this;
|
||||||
return html`
|
return html`
|
||||||
<div style="display: flex; flex-direction: row; gap: 4px">
|
<div style="display: flex; flex-direction: row; gap: 4px">
|
||||||
<input type="text" class="w3-input w3-dark-grey" id="search" value=${this.query} style="flex: 1" @keydown=${this.search_keydown}></input>
|
<input type="text" class="w3-input w3-theme-d1" id="search" value=${this.query} style="flex: 1" @keydown=${this.search_keydown}></input>
|
||||||
<button class="w3-button w3-dark-grey" @click=${(event) => self.search(self.renderRoot.getElementById('search').value)}>Search</button>
|
<button class="w3-button w3-theme-d1" @click=${(event) => self.search(self.renderRoot.getElementById('search').value)}>Search</button>
|
||||||
</div>
|
</div>
|
||||||
<tf-news id="news" whoami=${this.whoami} .messages=${this.messages} .users=${this.users} .expanded=${this.expanded} @tf-expand=${this.on_expand}></tf-news>
|
<tf-news id="news" whoami=${this.whoami} .messages=${this.messages} .users=${this.users} .expanded=${this.expanded} .drafts=${this.drafts} @tf-expand=${this.on_expand} @tf-draft=${this.draft}></tf-news>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,11 @@ class TfUserElement extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
let image = html`<span
|
||||||
|
class="w3-theme-light w3-circle"
|
||||||
|
style="display: inline-block; width: 2em; height: 2em; text-align: center; line-height: 2em"
|
||||||
|
>?</span
|
||||||
|
>`;
|
||||||
let name = this.users?.[this.id]?.name;
|
let name = this.users?.[this.id]?.name;
|
||||||
name =
|
name =
|
||||||
name !== undefined
|
name !== undefined
|
||||||
@ -26,22 +31,21 @@ class TfUserElement extends LitElement {
|
|||||||
: html`<a target="_top" href=${'#' + this.id}>${this.id}</a>`;
|
: html`<a target="_top" href=${'#' + this.id}>${this.id}</a>`;
|
||||||
|
|
||||||
if (this.users[this.id]) {
|
if (this.users[this.id]) {
|
||||||
let image = this.users[this.id].image;
|
let image_link = this.users[this.id].image;
|
||||||
image = typeof image == 'string' ? image : image?.link;
|
image_link =
|
||||||
return html` <div style="display: inline-block; font-weight: bold">
|
typeof image_link == 'string' ? image_link : image_link?.link;
|
||||||
<img
|
if (image_link !== undefined) {
|
||||||
style="width: 2em; height: 2em; vertical-align: middle; border-radius: 50%"
|
image = html`<img
|
||||||
?hidden=${image === undefined}
|
class="w3-circle"
|
||||||
src="${image ? '/' + image + '/view' : undefined}"
|
style="width: 2em; height: 2em; vertical-align: middle"
|
||||||
/>
|
src="/${image_link}/view"
|
||||||
${name}
|
/>`;
|
||||||
</div>`;
|
|
||||||
} else {
|
|
||||||
return html` <div style="display: inline-block; font-weight: bold">
|
|
||||||
${name}
|
|
||||||
</div>`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return html` <div style="display: inline-block; font-weight: bold">
|
||||||
|
${image} ${name}
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define('tf-user', TfUserElement);
|
customElements.define('tf-user', TfUserElement);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import * as linkify from './commonmark-linkify.js';
|
|
||||||
import * as hashtagify from './commonmark-hashtag.js';
|
import * as hashtagify from './commonmark-hashtag.js';
|
||||||
|
|
||||||
|
const k_code_classes = 'w3-theme-l4 w3-theme-border w3-round';
|
||||||
|
|
||||||
function image(node, entering) {
|
function image(node, entering) {
|
||||||
if (
|
if (
|
||||||
node.firstChild?.type === 'text' &&
|
node.firstChild?.type === 'text' &&
|
||||||
@ -61,13 +62,32 @@ function image(node, entering) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function code(node) {
|
||||||
|
let attrs = this.attrs(node);
|
||||||
|
attrs.push(['class', k_code_classes]);
|
||||||
|
this.tag('code', attrs);
|
||||||
|
this.out(node.literal);
|
||||||
|
this.tag('/code');
|
||||||
|
}
|
||||||
|
|
||||||
|
function attrs(node) {
|
||||||
|
let result = commonmark.HtmlRenderer.prototype.attrs.bind(this)(node);
|
||||||
|
if (node.type == 'block_quote') {
|
||||||
|
result.push(['class', 'w3-theme-d1']);
|
||||||
|
} else if (node.type == 'code_block') {
|
||||||
|
result.push(['class', k_code_classes]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
export function markdown(md) {
|
export function markdown(md) {
|
||||||
let reader = new commonmark.Parser({safe: true});
|
let reader = new commonmark.Parser({safe: true});
|
||||||
let writer = new commonmark.HtmlRenderer();
|
let writer = new commonmark.HtmlRenderer();
|
||||||
writer.image = image;
|
writer.image = image;
|
||||||
|
writer.code = code;
|
||||||
|
writer.attrs = attrs;
|
||||||
let parsed = reader.parse(md || '');
|
let parsed = reader.parse(md || '');
|
||||||
parsed = hashtagify.transform(parsed);
|
parsed = hashtagify.transform(parsed);
|
||||||
parsed = linkify.transform(parsed);
|
|
||||||
let walker = parsed.walker();
|
let walker = parsed.walker();
|
||||||
let event, node;
|
let event, node;
|
||||||
while ((event = walker.next())) {
|
while ((event = walker.next())) {
|
||||||
|
@ -482,16 +482,7 @@ class TributeRange {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getDocument() {
|
getDocument() {
|
||||||
let iframe;
|
return document;
|
||||||
if (this.tribute.current.collection) {
|
|
||||||
iframe = this.tribute.current.collection.iframe;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!iframe) {
|
|
||||||
return document
|
|
||||||
}
|
|
||||||
|
|
||||||
return iframe.contentWindow.document
|
|
||||||
}
|
}
|
||||||
|
|
||||||
positionMenuAtCaret(scrollTo) {
|
positionMenuAtCaret(scrollTo) {
|
||||||
@ -653,8 +644,8 @@ class TributeRange {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getWindowSelection() {
|
getWindowSelection() {
|
||||||
if (this.tribute.collection.iframe) {
|
if (this.tribute.collection[0].iframe?.getSelection) {
|
||||||
return this.tribute.collection.iframe.contentWindow.getSelection()
|
return this.tribute.collection[0].iframe.getSelection()
|
||||||
}
|
}
|
||||||
|
|
||||||
return window.getSelection()
|
return window.getSelection()
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "👋",
|
"emoji": "👋",
|
||||||
"previous": "&zFISmRDAv+SXFonfZ9/sHNhrmMe+poTU22gwZzuSkT4=.sha256"
|
"previous": "&7Pqk5nBAcbjzp0etv6WgiyTD3UF++ID0mW6qIbhwt3s=.sha256"
|
||||||
}
|
}
|
||||||
|
124
apps/welcome/f-droid.svg
Normal file
124
apps/welcome/f-droid.svg
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Original Author: Unknown (if you are the original creator of the F-Droid button, please contact laura@ind.ie so I can credit you!) -->
|
||||||
|
<!-- Author: Created by Laura Kalbag and Released with ❤ by ind.ie (laura@ind.ie) -->
|
||||||
|
<!-- License: This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. (As attribution is included in this file, you needn't include additional attribution on your site.) -->
|
||||||
|
<!-- How to use: The original blog post about this SVG button and how I use SVG on the Ind.ie website is at https://ind.ie/blog/f-droid-button/ -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="button_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="1490 188 300 104" enable-background="new 1490 188 300 104" xml:space="preserve">
|
||||||
|
<g id="get_it_on_f-droid_2_">
|
||||||
|
<path id="button" d="M1780,292h-280c-5.5,0-10-4.5-10-10v-84c0-5.5,4.5-10,10-10h280c5.5,0,10,4.5,10,10v84
|
||||||
|
C1790,287.5,1785.5,292,1780,292z"/>
|
||||||
|
<g id="f-droid_2_">
|
||||||
|
<path fill="#FFFFFF" d="M1621.2,236.8v3.6v1.2v5h-0.3h-0.6h-2.2c-0.7,0-1-0.3-1.2-1c-0.1-0.4-0.2-1.6-0.3-3.4h-13.5v11.1h13.2v5.5
|
||||||
|
h-13.2v10.1c0.9,0.2,1.7,0.3,2.6,0.4c0.9,0.2,1.3,0.7,1.3,1.6v3h-3.9h-7.1h-3.9v-3c0-0.9,0.4-1.5,1.3-1.6c0.9-0.2,1.7-0.3,2.6-0.4
|
||||||
|
V242c-0.9-0.2-1.7-0.3-2.6-0.4c-0.9-0.2-1.3-0.7-1.3-1.6v-3h3.9h22.7h1.2L1621.2,236.8L1621.2,236.8z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1637.2,256v5.4h-13.5V256H1637.2z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1676.7,255.6c0,5-1.7,10-5.3,13.5c-3.7,3.6-8.8,5.3-13.9,5.3h-13.9h-3.9v-3c0-0.9,0.4-1.5,1.3-1.6
|
||||||
|
c0.9-0.2,1.7-0.3,2.6-0.4V242c-0.9-0.2-1.7-0.3-2.6-0.4c-0.9-0.2-1.3-0.7-1.3-1.6v-3h3.9h13.9c5.1,0,10.2,1.6,13.9,5.3
|
||||||
|
C1675.1,245.6,1676.7,250.7,1676.7,255.6C1676.7,258.4,1676.7,252.9,1676.7,255.6z M1669.6,255.6c0-3.4-0.8-6.9-3.1-9.5
|
||||||
|
s-5.6-3.7-8.9-3.7h-6.8v26.4h6.8c3.4,0,6.7-1.1,8.9-3.7C1668.8,262.5,1669.6,259,1669.6,255.6z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1699.7,248.1l-0.9,4.8c-0.2,1.1-1.3,0.9-2.1,0.7c-1-0.3-2.2-0.3-3.1,0c-2.2,0.5-3.7,2.3-4.5,4.2v11.4
|
||||||
|
c2.3,0.4,2.3,0.4,2.6,0.4c0.9,0.2,1.3,0.7,1.3,1.6v3h-3.9l0,0h-6.5h-3.9v-3c0-0.9,0.4-1.5,1.3-1.6c0.4-0.1,0.4-0.1,2.6-0.4v-16.3
|
||||||
|
c-2.3-0.4-2.3-0.4-2.6-0.4c-0.9-0.2-1.3-0.7-1.3-1.6v-3h3.9l0,0h3.8c1.1,0,1.7,0.4,1.9,1.6l0.3,3.2c1.1-1.9,2.6-3.7,4.7-4.7
|
||||||
|
C1695.2,247,1697.8,246.9,1699.7,248.1z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1719.4,248.3c5.7,2.3,8,8,7.8,13.7c-0.3,5.6-3.4,10.7-9.1,12.3c-5.4,1.5-11.9,0-15.1-4.9
|
||||||
|
c-3.1-4.6-3.2-11.6-0.3-16.4C1706,247.6,1713.6,246,1719.4,248.3C1721,248.9,1717.8,247.6,1719.4,248.3z M1718.9,267.6
|
||||||
|
c2-2.8,2-7.1,1.2-10.2c-0.3-1.5-1-2.9-2.2-3.9c-1.3-1-3-1.4-4.6-1.2c-3.5,0.2-5.3,2.7-5.8,5.9c-0.5,3.1-0.5,7.5,1.8,10
|
||||||
|
C1711.8,270.7,1716.8,270.5,1718.9,267.6C1720,266.2,1717.9,269.1,1718.9,267.6z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1743.3,271.4v3h-3.9h-6.5h-4v-3c0-0.9,0.4-1.5,1.3-1.6c0.9-0.2,1.7-0.3,2.6-0.4v-16.4
|
||||||
|
c-0.9-0.2-1.7-0.3-2.6-0.4c-0.9-0.2-1.3-0.7-1.3-1.6v-3h3.9h6.5v21.5c0.9,0.2,1.7,0.3,2.6,0.4
|
||||||
|
C1742.9,269.9,1743.3,270.5,1743.3,271.4z M1740,241.6c-1,2-3.4,3-5.4,2.2c-2-0.9-3.1-3.3-2.2-5.3c0.9-2.1,3.3-3,5.4-2.2
|
||||||
|
C1739.9,237.1,1741,239.5,1740,241.6C1739.8,242,1740.3,241,1740,241.6z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1773.4,274.3h-3.7h-3.9c-0.8,0-1.5-0.3-1.7-1.2l-0.5-2.4c-2.4,2.8-5.9,4.5-9.8,4.1
|
||||||
|
c-3.8-0.4-6.5-3.2-7.8-6.6c-2.4-6.6-1.3-16.3,5.6-19.8c3.8-1.9,8.5-1.5,11.6,1.5V241c-0.9-0.2-1.7-0.3-2.6-0.4
|
||||||
|
c-0.9-0.2-1.3-0.7-1.3-1.6v-3h3.9h6.5v33.5c0.8,0.2,1.6,0.3,2.4,0.4c0.9,0.2,1.3,0.7,1.3,1.6V274.3z M1763.3,254.6
|
||||||
|
c-1.7-2-4.2-2.9-6.7-2.3c-2.5,0.6-3.9,2.8-4.4,5.1c-0.5,2.3-0.5,5-0.1,7.4c0.4,2.3,1.7,4.4,4.1,4.9c2.9,0.5,5.4-1,7.2-3.1V254.6z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<g id="get_it_on_2_">
|
||||||
|
<path fill="#FFFFFF" d="M1597.5,218.2v-2.9h7.6v6.9c-3.7,3.6-11.2,3.9-14.5-0.3c-3.3-4.2-2.4-11.5,2.6-14c2.2-1.1,5.1-1.1,7.3-0.4
|
||||||
|
s3.8,2.4,4.3,4.7l-3.5,0.7c-0.7-2.5-3.5-3.3-5.8-2.5c-2.2,0.7-3.1,2.8-3.2,4.9c-0.1,2.2,0.3,4.6,2.1,5.9c2.1,1.6,5.1,0.9,7-0.6
|
||||||
|
v-2.3H1597.5z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1608.3,224.7v-17.3h13v2.9h-9.4v3.8h8.8v2.9h-8.8v4.8h9.8v2.9L1608.3,224.7L1608.3,224.7z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1628.6,224.7v-14.4h-5.1v-2.9h13.9v2.9h-5.1v14.5L1628.6,224.7L1628.6,224.7z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1646.3,224.7v-17.3h3.5v17.3H1646.3z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1657.1,224.7v-14.4h-5.1v-2.9h13.9v2.9h-5.1v14.5L1657.1,224.7L1657.1,224.7z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1674.1,216.1c0-1.7,0.3-3.3,0.8-4.4c0.8-1.7,2.2-3.2,3.9-4c2.8-1.1,6.5-1,9,0.9c2.5,1.8,3.4,4.9,3.3,7.8
|
||||||
|
c-0.1,2.9-1.1,5.8-3.8,7.5c-2.5,1.6-6.1,1.6-8.7,0.3C1675.4,222.7,1674.1,219.4,1674.1,216.1z M1677.8,216c0,2.3,0.7,4.8,3.1,5.6
|
||||||
|
c2.2,0.9,4.8,0,5.8-2c1-1.9,1-4.9,0.3-6.8c-0.9-2.1-3.1-3.1-5.3-2.7C1678.7,210.6,1677.8,213.4,1677.8,216z"/>
|
||||||
|
<path fill="#FFFFFF" d="M1693.9,224.7v-17.3h3.4l7.2,11.6v-11.6h3.3v17.3h-3.6l-7.1-11.4v11.4H1693.9z"/>
|
||||||
|
</g>
|
||||||
|
<g id="droid_2_">
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="413.9844" y1="440.5436" x2="413.9844" y2="452.6552" gradientTransform="matrix(3.7209 0 0 -3.7209 0 1914.4187)">
|
||||||
|
<stop offset="0" style="stop-color:#2B6099"/>
|
||||||
|
<stop offset="0.1299" style="stop-color:#2F69A1"/>
|
||||||
|
<stop offset="0.3451" style="stop-color:#3B83B6"/>
|
||||||
|
<stop offset="0.5" style="stop-color:#4699C8"/>
|
||||||
|
<stop offset="0.9944" style="stop-color:#479ECB"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path fill="url(#SVGID_1_)" d="M1570.1,275.2h-59.3c-2.9,0-5.2-2.3-5.2-5.2v-34.7c0-2.9,2.4-5.2,5.2-5.2h59.3
|
||||||
|
c2.9,0,5.2,2.3,5.2,5.2V270C1575.3,272.8,1572.9,275.2,1570.1,275.2z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="413.9844" y1="440.5436" x2="413.9844" y2="452.6552" gradientTransform="matrix(3.7209 0 0 -3.7209 0 1914.4187)">
|
||||||
|
<stop offset="0" style="stop-color:#2B6099"/>
|
||||||
|
<stop offset="0.5" style="stop-color:#58A4CD"/>
|
||||||
|
<stop offset="0.7865" style="stop-color:#7FB8D9"/>
|
||||||
|
<stop offset="1" style="stop-color:#9EC9E2"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path fill="url(#SVGID_2_)" d="M1570.1,231.9c1.9,0,3.5,1.6,3.5,3.5V270c0,1.9-1.6,3.5-3.5,3.5h-59.3c-1.9,0-3.5-1.6-3.5-3.5
|
||||||
|
v-34.7c0-1.9,1.6-3.5,3.5-3.5H1570.1 M1570.1,230.1h-59.3c-2.9,0-5.2,2.3-5.2,5.2V270c0,2.9,2.4,5.2,5.2,5.2h59.3
|
||||||
|
c2.9,0,5.2-2.3,5.2-5.2v-34.7C1575.3,232.5,1572.9,230.1,1570.1,230.1L1570.1,230.1z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#295384" d="M1540.4,236.6c8.9,0,16.1,7.2,16.1,16c0,8.8-7.2,16-16.1,16s-16.1-7.2-16.1-16S1531.5,236.6,1540.4,236.6
|
||||||
|
M1540.4,235.3c-9.6,0-17.4,7.8-17.4,17.3s7.8,17.3,17.4,17.3s17.4-7.8,17.4-17.3S1550.1,235.3,1540.4,235.3L1540.4,235.3z"/>
|
||||||
|
</g>
|
||||||
|
<path fill="#295384" d="M1535.4,251.1c1.9-5.7,10.7-3.9,10.2,2.2c-0.5,5.6-8.5,6.2-10.2,1.2c0,0,0,0.1,0,0l0,0
|
||||||
|
c-2.4,0.2-4.7,0.4-7.1,0.6c1.7,10.1,15.3,13.1,21.6,5.3c6.5-8,0.3-20.2-10-19.8c-5.6,0.3-10.5,4.3-11.5,9.8"/>
|
||||||
|
<path fill="#7B952D" d="M1580.3,198.7l-2-1.6c-0.3-0.3-1-0.3-1.2,0.1l-6.8,7.9c-0.3,0.3-0.3,1,0.1,1.2l2,1.6
|
||||||
|
c0.3,0.3,1,0.3,1.2-0.1l6.8-7.9C1580.7,199.6,1580.6,199,1580.3,198.7z"/>
|
||||||
|
<path fill="#7B952D" d="M1500.6,198.1l2-1.6c0.3-0.3,1-0.3,1.2,0.1l6.8,7.9c0.3,0.3,0.3,1-0.1,1.2l-2,1.6c-0.3,0.3-1,0.3-1.2-0.1
|
||||||
|
l-6.8-7.9C1500.2,199,1500.3,198.5,1500.6,198.1z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="413.9844" y1="453.354" x2="413.9844" y2="459.4099" gradientTransform="matrix(3.7209 0 0 -3.7209 0 1914.4187)">
|
||||||
|
<stop offset="0" style="stop-color:#BCDB52"/>
|
||||||
|
<stop offset="0.3206" style="stop-color:#C5E358"/>
|
||||||
|
<stop offset="0.5" style="stop-color:#CDEA5C"/>
|
||||||
|
<stop offset="0.9944" style="stop-color:#DCF285"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path fill="url(#SVGID_3_)" stroke="#7B952D" stroke-miterlimit="10" d="M1572.7,227.5h-64.5c-1,0-1.7-0.8-1.7-1.7v-19.1
|
||||||
|
c0-1,0.8-1.7,1.7-1.7h64.5c1,0,1.7,0.8,1.7,1.7v19.1C1574.4,226.7,1573.6,227.5,1572.7,227.5z"/>
|
||||||
|
<g>
|
||||||
|
<ellipse fill="#FFFFFF" cx="1523" cy="215.4" rx="6.1" ry="6.1"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="409.8439" y1="458.401" x2="408.7539" y2="454.8358" gradientTransform="matrix(3.7209 0 0 -3.7209 0 1914.4187)">
|
||||||
|
<stop offset="0" style="stop-color:#8BA53D"/>
|
||||||
|
<stop offset="8.484717e-02" style="stop-color:#94AE45"/>
|
||||||
|
<stop offset="0.2259" style="stop-color:#AEC65C"/>
|
||||||
|
<stop offset="0.4048" style="stop-color:#D7ED81"/>
|
||||||
|
<stop offset="0.4246" style="stop-color:#DCF285"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path fill="url(#SVGID_4_)" d="M1523,222.3c-3.8,0-7-3.1-7-6.9c0-3.8,3.1-6.9,7-6.9c3.8,0,7,3.1,7,6.9
|
||||||
|
C1529.9,219.2,1526.9,222.3,1523,222.3z M1523,210.2c-2.9,0-5.2,2.3-5.2,5.2s2.4,5.2,5.2,5.2s5.2-2.3,5.2-5.2
|
||||||
|
S1525.9,210.2,1523,210.2z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<ellipse fill="#FFFFFF" cx="1557.8" cy="215.4" rx="6.1" ry="6.1"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="419.2189" y1="458.401" x2="418.129" y2="454.8359" gradientTransform="matrix(3.7209 0 0 -3.7209 0 1914.4187)">
|
||||||
|
<stop offset="0" style="stop-color:#8BA53D"/>
|
||||||
|
<stop offset="8.484717e-02" style="stop-color:#94AE45"/>
|
||||||
|
<stop offset="0.2259" style="stop-color:#AEC65C"/>
|
||||||
|
<stop offset="0.4048" style="stop-color:#D7ED81"/>
|
||||||
|
<stop offset="0.4246" style="stop-color:#DCF285"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path fill="url(#SVGID_5_)" d="M1557.8,222.3c-3.8,0-7-3.1-7-6.9c0-3.8,3.1-6.9,7-6.9c3.8,0,7,3.1,7,6.9
|
||||||
|
C1564.8,219.2,1561.8,222.3,1557.8,222.3z M1557.8,210.2c-2.9,0-5.2,2.3-5.2,5.2s2.4,5.2,5.2,5.2c2.9,0,5.2-2.3,5.2-5.2
|
||||||
|
S1560.8,210.2,1557.8,210.2z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.4 KiB |
@ -55,7 +55,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<a
|
<a
|
||||||
class="w3-button w3-black w3-padding-large"
|
class="w3-button w3-black w3-padding-large"
|
||||||
href="https://www.tildefriends.net/~cory/releases/"
|
href="https://dev.tildefriends.net/cory/tildefriends/releases"
|
||||||
><i class="fa fa-download"></i> Download</a
|
><i class="fa fa-download"></i> Download</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
@ -63,6 +63,14 @@
|
|||||||
href="https://www.tildefriends.net/~cory/apps/"
|
href="https://www.tildefriends.net/~cory/apps/"
|
||||||
><i class="fa fa-link"></i> Try It</a
|
><i class="fa fa-link"></i> Try It</a
|
||||||
>
|
>
|
||||||
|
<a
|
||||||
|
class="w3-button w3-black w3-padding-large"
|
||||||
|
href="https://dev.tildefriends.net/"
|
||||||
|
><i class="fa fa-mug-hot"></i> Code</a
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
<a href="https://f-droid.org/en/packages/com.unprompted.tildefriends.fdroid/"><img src="f-droid.svg" style="height: 3em"></a>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="w3-col l4 m6">
|
<div class="w3-col l4 m6">
|
||||||
<img src="tildefriends.png" class="w3-image w3-right w3-hide-small" />
|
<img src="tildefriends.png" class="w3-image w3-right w3-hide-small" />
|
||||||
@ -70,6 +78,60 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Getting Starting Section -->
|
||||||
|
<div class="w3-indigo w3-center">
|
||||||
|
<div class="w3-row-padding w3-padding-64">
|
||||||
|
<div class="w3-jumbo">
|
||||||
|
<i class="fa fa-rocket"></i> <b>Getting Started</b>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2>First-time user checklist:</h2>
|
||||||
|
<ol type="1" style="text-align: left">
|
||||||
|
<li>
|
||||||
|
<a href="https://dev.tildefriends.net/cory/tildefriends/releases"
|
||||||
|
>Download</a
|
||||||
|
>
|
||||||
|
Tilde Friends and run your own instance, or use
|
||||||
|
<a href="https://www.tildefriends.net/"
|
||||||
|
>https://www.tildefriends.net/</a
|
||||||
|
>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Create an account to identify yourself with that instance by
|
||||||
|
username and password.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Create an SSB identity in the <b>ssb</b> app. This will generate a
|
||||||
|
keypair used to identify yourself to other users and sign your
|
||||||
|
messages so that they can be verified as from you.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Describe yourself in your profile in the <b>ssb</b> app. Give
|
||||||
|
yourself a name and an avatar if you like.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Connect to others. You will automatically discover peers on the
|
||||||
|
same instance and same network if there are any. Or use
|
||||||
|
<a href="https://github.com/staltz/ssb-room/blob/master/FAQ.md"
|
||||||
|
>rooms</a
|
||||||
|
>
|
||||||
|
and pubs to reach more distant users.
|
||||||
|
<a href="https://www.tildefriends.net/~cory/room/"
|
||||||
|
>tildefriends.net itself</a
|
||||||
|
>
|
||||||
|
operates as a room, so you can connect and see who else is online
|
||||||
|
and establish a connection.
|
||||||
|
</li>
|
||||||
|
<li>Follow people to grow your network.</li>
|
||||||
|
<li>
|
||||||
|
Use the <b>edit</b> link at the top of any page to start modifying
|
||||||
|
and making apps.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- SSB Section -->
|
<!-- SSB Section -->
|
||||||
<div class="w3-light-grey">
|
<div class="w3-light-grey">
|
||||||
<div class="w3-row-padding w3-padding-64">
|
<div class="w3-row-padding w3-padding-64">
|
||||||
@ -199,7 +261,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w3-row" style="margin-top: 64px">
|
<div class="w3-row" style="margin-top: 64px">
|
||||||
<a href="https://codemirror.net/5/" class="w3-col s3">
|
<a href="https://codemirror.net/docs/changelog/" class="w3-col s3">
|
||||||
<i class="fa fa-keyboard w3-text-indigo w3-jumbo"></i>
|
<i class="fa fa-keyboard w3-text-indigo w3-jumbo"></i>
|
||||||
<p>CodeMirror</p>
|
<p>CodeMirror</p>
|
||||||
</a>
|
</a>
|
||||||
@ -211,6 +273,13 @@
|
|||||||
<i class="fa fa-fire w3-text-cyan w3-jumbo"></i>
|
<i class="fa fa-fire w3-text-cyan w3-jumbo"></i>
|
||||||
<p>Lit</p>
|
<p>Lit</p>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/c-ares/c-ares" class="w3-col s3">
|
||||||
|
<i class="fa fa-book-atlas w3-text-purple w3-jumbo"></i>
|
||||||
|
<p>c-ares</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="w3-row" style="margin-top: 64px">
|
||||||
<a href="https://www.gnu.org/software/make/" class="w3-col s3">
|
<a href="https://www.gnu.org/software/make/" class="w3-col s3">
|
||||||
<i class="fa fa-hammer w3-text-teal w3-jumbo"></i>
|
<i class="fa fa-hammer w3-text-teal w3-jumbo"></i>
|
||||||
<p>GNU Make</p>
|
<p>GNU Make</p>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "📝",
|
"emoji": "📝",
|
||||||
"previous": "&DnfuAUGzzalSh9NgZXnzDc9Ru5aM0omfRJ4h27jYw4k=.sha256"
|
"previous": "&DaYqKHRBKhjFGaOzbKZ1+/pLspJeEkDJYTF2B50tH6k=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,9 @@ import * as utils from './utils.js';
|
|||||||
let g_hash;
|
let g_hash;
|
||||||
let g_collection_notifies = {};
|
let g_collection_notifies = {};
|
||||||
|
|
||||||
|
tfrpc.register(async function getActiveIdentity() {
|
||||||
|
return ssb.getActiveIdentity();
|
||||||
|
});
|
||||||
tfrpc.register(async function getOwnerIdentities() {
|
tfrpc.register(async function getOwnerIdentities() {
|
||||||
return ssb.getOwnerIdentities();
|
return ssb.getOwnerIdentities();
|
||||||
});
|
});
|
||||||
@ -54,6 +57,9 @@ core.register('message', async function message_handler(message) {
|
|||||||
await tfrpc.rpc.hash_changed(message.hash);
|
await tfrpc.rpc.hash_changed(message.hash);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
core.register('setActiveIdentity', async function setActiveIdentityHandler(id) {
|
||||||
|
await tfrpc.rpc.setActiveIdentity(id);
|
||||||
|
});
|
||||||
|
|
||||||
tfrpc.register(function set_hash(hash) {
|
tfrpc.register(function set_hash(hash) {
|
||||||
if (g_hash != hash) {
|
if (g_hash != hash) {
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
window.litDisableBundleWarning = true;
|
window.litDisableBundleWarning = true;
|
||||||
</script>
|
</script>
|
||||||
<script src="tf-collection.js" type="module"></script>
|
<script src="tf-collection.js" type="module"></script>
|
||||||
<script src="tf-id-picker.js" type="module"></script>
|
|
||||||
<script src="tf-wiki-doc.js" type="module"></script>
|
<script src="tf-wiki-doc.js" type="module"></script>
|
||||||
<script src="tf-wiki-app.js" type="module"></script>
|
<script src="tf-wiki-app.js" type="module"></script>
|
||||||
</body>
|
</body>
|
||||||
|
44
apps/wiki/lit-all.min.js
vendored
44
apps/wiki/lit-all.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,44 +0,0 @@
|
|||||||
import {LitElement, html} from './lit-all.min.js';
|
|
||||||
import * as tfrpc from '/static/tfrpc.js';
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Provide a list of IDs, and this lets the user pick one.
|
|
||||||
*/
|
|
||||||
class TfIdentityPickerElement extends LitElement {
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
ids: {type: Array},
|
|
||||||
selected: {type: String},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.ids = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
changed(event) {
|
|
||||||
this.selected = event.srcElement.value;
|
|
||||||
this.dispatchEvent(
|
|
||||||
new Event('change', {
|
|
||||||
srcElement: this,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return html`
|
|
||||||
<link rel="stylesheet" href="tildefriends.css" />
|
|
||||||
<select @change=${this.changed} style="max-width: 100%">
|
|
||||||
${(this.ids ?? []).map(
|
|
||||||
(id) =>
|
|
||||||
html`<option ?selected=${id == this.selected} value=${id}>
|
|
||||||
${id}
|
|
||||||
</option>`
|
|
||||||
)}
|
|
||||||
</select>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define('tf-id-picker', TfIdentityPickerElement);
|
|
@ -31,13 +31,16 @@ class TfCollectionsAppElement extends LitElement {
|
|||||||
tfrpc.register(function hash_changed(hash) {
|
tfrpc.register(function hash_changed(hash) {
|
||||||
self.notify_hash_changed(hash);
|
self.notify_hash_changed(hash);
|
||||||
});
|
});
|
||||||
|
tfrpc.register(function setActiveIdentity(id) {
|
||||||
|
self.whoami = id;
|
||||||
|
});
|
||||||
tfrpc.rpc.get_hash().then((hash) => self.notify_hash_changed(hash));
|
tfrpc.rpc.get_hash().then((hash) => self.notify_hash_changed(hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
async load() {
|
async load() {
|
||||||
this.ids = await tfrpc.rpc.getIdentities();
|
this.ids = await tfrpc.rpc.getIdentities();
|
||||||
this.owner_ids = await tfrpc.rpc.getOwnerIdentities();
|
this.owner_ids = await tfrpc.rpc.getOwnerIdentities();
|
||||||
this.whoami = await tfrpc.rpc.localStorageGet('collections_whoami');
|
this.whoami = await tfrpc.rpc.getActiveIdentity();
|
||||||
let ids = [...new Set([...this.owner_ids, this.whoami])].sort();
|
let ids = [...new Set([...this.owner_ids, this.whoami])].sort();
|
||||||
this.following = Object.keys(await tfrpc.rpc.following(ids, 1)).sort();
|
this.following = Object.keys(await tfrpc.rpc.following(ids, 1)).sort();
|
||||||
|
|
||||||
@ -273,9 +276,6 @@ class TfCollectionsAppElement extends LitElement {
|
|||||||
margin-right: 16px;
|
margin-right: 16px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div>
|
|
||||||
<tf-id-picker .ids=${this.ids} selected=${this.whoami} @change=${this.on_whoami_changed} ?hidden=${!this.ids?.length}></tf-id-picker>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
${keyed(
|
${keyed(
|
||||||
this.whoami,
|
this.whoami,
|
||||||
|
@ -50,7 +50,7 @@ function new_message() {
|
|||||||
return g_new_message_promise;
|
return g_new_message_promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssb.addEventListener('message', function (id) {
|
core.register('onMessage', function (id) {
|
||||||
let resolve = g_new_message_resolve;
|
let resolve = g_new_message_resolve;
|
||||||
g_new_message_promise = new Promise(function (resolve, reject) {
|
g_new_message_promise = new Promise(function (resolve, reject) {
|
||||||
g_new_message_resolve = resolve;
|
g_new_message_resolve = resolve;
|
||||||
@ -96,7 +96,7 @@ export async function collection(
|
|||||||
let rows = [];
|
let rows = [];
|
||||||
await ssb.sqlAsync(
|
await ssb.sqlAsync(
|
||||||
`
|
`
|
||||||
SELECT messages.id, author, content, timestamp
|
SELECT messages.id, author, json(content) AS content, timestamp
|
||||||
FROM messages
|
FROM messages
|
||||||
JOIN json_each(?1) AS id ON messages.author = id.value
|
JOIN json_each(?1) AS id ON messages.author = id.value
|
||||||
WHERE
|
WHERE
|
||||||
|
36
core/app.js
36
core/app.js
@ -1,4 +1,3 @@
|
|||||||
import * as auth from './auth.js';
|
|
||||||
import * as core from './core.js';
|
import * as core from './core.js';
|
||||||
|
|
||||||
let g_next_id = 1;
|
let g_next_id = 1;
|
||||||
@ -84,11 +83,10 @@ App.prototype.send = function (message) {
|
|||||||
* @param {*} response
|
* @param {*} response
|
||||||
* @param {*} client
|
* @param {*} client
|
||||||
*/
|
*/
|
||||||
function socket(request, response, client) {
|
async function socket(request, response, client) {
|
||||||
let process;
|
let process;
|
||||||
let options = {};
|
let options = {};
|
||||||
let credentials = auth.query(request.headers);
|
let credentials = await httpd.auth_query(request.headers);
|
||||||
let refresh = auth.makeRefresh(credentials);
|
|
||||||
|
|
||||||
response.onClose = async function () {
|
response.onClose = async function () {
|
||||||
if (process && process.task) {
|
if (process && process.task) {
|
||||||
@ -143,12 +141,21 @@ function socket(request, response, client) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
response.send(
|
response.send(
|
||||||
JSON.stringify({
|
JSON.stringify(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
action: 'session',
|
action: 'session',
|
||||||
credentials: credentials,
|
credentials: credentials,
|
||||||
parentApp: parentApp,
|
parentApp: parentApp,
|
||||||
id: blobId,
|
id: blobId,
|
||||||
}),
|
},
|
||||||
|
await ssb.getIdentityInfo(
|
||||||
|
credentials?.session?.name,
|
||||||
|
packageOwner,
|
||||||
|
packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
0x1
|
0x1
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -204,14 +211,14 @@ function socket(request, response, client) {
|
|||||||
if (process && process.timeout > 0) {
|
if (process && process.timeout > 0) {
|
||||||
setTimeout(ping, process.timeout);
|
setTimeout(ping, process.timeout);
|
||||||
}
|
}
|
||||||
} else if (message.action == 'enableStats') {
|
|
||||||
if (process) {
|
|
||||||
core.enableStats(process, message.enabled);
|
|
||||||
}
|
|
||||||
} else if (message.action == 'resetPermission') {
|
} else if (message.action == 'resetPermission') {
|
||||||
if (process) {
|
if (process) {
|
||||||
process.resetPermission(message.permission);
|
process.resetPermission(message.permission);
|
||||||
}
|
}
|
||||||
|
} else if (message.action == 'setActiveIdentity') {
|
||||||
|
process.setActiveIdentity(message.identity);
|
||||||
|
} else if (message.action == 'createIdentity') {
|
||||||
|
await process.createIdentity();
|
||||||
} else if (message.message == 'tfrpc') {
|
} else if (message.message == 'tfrpc') {
|
||||||
if (message.id && g_calls[message.id]) {
|
if (message.id && g_calls[message.id]) {
|
||||||
if (message.error !== undefined) {
|
if (message.error !== undefined) {
|
||||||
@ -241,14 +248,7 @@ function socket(request, response, client) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
response.upgrade(
|
response.upgrade(100, {});
|
||||||
100,
|
|
||||||
refresh
|
|
||||||
? {
|
|
||||||
'Set-Cookie': `session=${refresh.token}; path=/; Max-Age=${refresh.interval}; Secure; SameSite=Strict`,
|
|
||||||
}
|
|
||||||
: {}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export {socket, App};
|
export {socket, App};
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<title>Tilde Friends Sign-in</title>
|
<title>Tilde Friends Sign-in</title>
|
||||||
<link type="text/css" rel="stylesheet" href="/static/style.css" />
|
<link type="text/css" rel="stylesheet" href="/static/style.css" />
|
||||||
<link type="image/png" rel="shortcut icon" href="/static/favicon.png" />
|
<link type="image/svg+xml" rel="icon" href="/static/tildefriends.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -19,8 +19,11 @@
|
|||||||
Object.assign(app, g_data);
|
Object.assign(app, g_data);
|
||||||
|
|
||||||
class TfAuthElement extends LitElement {
|
class TfAuthElement extends LitElement {
|
||||||
static get_properties() {
|
static get properties() {
|
||||||
return {
|
return {
|
||||||
|
code_of_conduct: {type: String},
|
||||||
|
error: {type: String},
|
||||||
|
have_administrator: {type: Boolean},
|
||||||
name: {type: String},
|
name: {type: String},
|
||||||
tab: {type: String},
|
tab: {type: String},
|
||||||
};
|
};
|
||||||
@ -31,11 +34,6 @@
|
|||||||
this.tab = 'login';
|
this.tab = 'login';
|
||||||
}
|
}
|
||||||
|
|
||||||
tab_changed(name) {
|
|
||||||
this.tab = name;
|
|
||||||
this.requestUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let self = this;
|
let self = this;
|
||||||
return html`
|
return html`
|
||||||
@ -83,16 +81,16 @@
|
|||||||
<h1 ?hidden=${this.name === undefined}>Welcome, ${this.name}.</h1>
|
<h1 ?hidden=${this.name === undefined}>Welcome, ${this.name}.</h1>
|
||||||
|
|
||||||
<div style="display: flex; flex-direction: row; width: 100%">
|
<div style="display: flex; flex-direction: row; width: 100%">
|
||||||
<input type="radio" name="tab" id="login" value="Login" ?checked=${this.tab == 'login'} @change=${() => self.tab_changed('login')}></input>
|
<input type="radio" name="tab" id="login" value="Login" ?checked=${this.tab == 'login'} @change=${() => (self.tab = 'login')}></input>
|
||||||
<label for="login" id="login_label">Login</label>
|
<label for="login" id="login_label">Login</label>
|
||||||
|
|
||||||
<input type="radio" name="tab" id="register" value="Register" ?checked=${this.tab == 'register'} @change=${() => self.tab_changed('register')}></input>
|
<input type="radio" name="tab" id="register" value="Register" ?checked=${this.tab == 'register'} @change=${() => (self.tab = 'register')}></input>
|
||||||
<label for="register" id="register_label">Register</label>
|
<label for="register" id="register_label">Register</label>
|
||||||
|
|
||||||
<input type="radio" name="tab" id="guest" value="Guest" ?checked=${this.tab == 'guest'} @change=${() => self.tab_changed('guest')}></input>
|
<input type="radio" name="tab" id="guest" value="Guest" ?checked=${this.tab == 'guest'} @change=${() => (self.tab = 'guest')}></input>
|
||||||
<label for="guest" id="guest_label">Guest</label>
|
<label for="guest" id="guest_label">Guest</label>
|
||||||
|
|
||||||
<input type="radio" name="tab" id="change" value="Change Password" ?checked=${this.tab == 'change'} @change=${() => self.tab_changed('change')}></input>
|
<input type="radio" name="tab" id="change" value="Change Password" ?checked=${this.tab == 'change'} @change=${() => (self.tab = 'change')}></input>
|
||||||
<label for="change" id="change_label">Change Password</label>
|
<label for="change" id="change_label">Change Password</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
420
core/auth.js
420
core/auth.js
@ -1,420 +0,0 @@
|
|||||||
import * as core from './core.js';
|
|
||||||
import * as form from './form.js';
|
|
||||||
|
|
||||||
let gDatabase = new Database('auth');
|
|
||||||
|
|
||||||
const kRefreshInterval = 1 * 7 * 24 * 60 * 60 * 1000;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes a Base64 value URL safe
|
|
||||||
* @param {string} value
|
|
||||||
* @returns TODOC
|
|
||||||
*/
|
|
||||||
function b64url(value) {
|
|
||||||
value = value.replaceAll('+', '-').replaceAll('/', '_');
|
|
||||||
let equals = value.indexOf('=');
|
|
||||||
|
|
||||||
if (equals !== -1) {
|
|
||||||
return value.substring(0, equals);
|
|
||||||
} else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {string} value
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function unb64url(value) {
|
|
||||||
value = value.replaceAll('-', '+').replaceAll('_', '/');
|
|
||||||
let remainder = value.length % 4;
|
|
||||||
|
|
||||||
if (remainder == 3) {
|
|
||||||
return value + '=';
|
|
||||||
} else if (remainder == 2) {
|
|
||||||
return value + '==';
|
|
||||||
} else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a JSON Web Token
|
|
||||||
* @param {object} payload Object: {"name": "username"}
|
|
||||||
* @returns the JWT
|
|
||||||
*/
|
|
||||||
function makeJwt(payload) {
|
|
||||||
const ids = ssb.getIdentities(':auth');
|
|
||||||
let id;
|
|
||||||
|
|
||||||
if (ids?.length) {
|
|
||||||
id = ids[0];
|
|
||||||
} else {
|
|
||||||
id = ssb.createIdentity(':auth');
|
|
||||||
}
|
|
||||||
|
|
||||||
const final_payload = b64url(
|
|
||||||
base64Encode(
|
|
||||||
JSON.stringify(
|
|
||||||
Object.assign({}, payload, {
|
|
||||||
exp: new Date().valueOf() + kRefreshInterval,
|
|
||||||
})
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
const jwt = [
|
|
||||||
b64url(base64Encode(JSON.stringify({alg: 'HS256', typ: 'JWT'}))),
|
|
||||||
final_payload,
|
|
||||||
b64url(ssb.hmacsha256sign(final_payload, ':auth', id)),
|
|
||||||
].join('.');
|
|
||||||
return jwt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates a JWT ?
|
|
||||||
* @param {*} session TODOC
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function readSession(session) {
|
|
||||||
let jwt_parts = session?.split('.');
|
|
||||||
|
|
||||||
if (jwt_parts?.length === 3) {
|
|
||||||
let [header, payload, signature] = jwt_parts;
|
|
||||||
header = JSON.parse(utf8Decode(base64Decode(unb64url(header))));
|
|
||||||
|
|
||||||
if (header.typ === 'JWT' && header.alg === 'HS256') {
|
|
||||||
signature = unb64url(signature);
|
|
||||||
let id = ssb.getIdentities(':auth');
|
|
||||||
|
|
||||||
if (id?.length && ssb.hmacsha256verify(id[0], payload, signature)) {
|
|
||||||
const result = JSON.parse(utf8Decode(base64Decode(unb64url(payload))));
|
|
||||||
const now = new Date().valueOf();
|
|
||||||
|
|
||||||
if (now < result.exp) {
|
|
||||||
print(`JWT valid for another ${(result.exp - now) / 1000} seconds.`);
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
print(`JWT expired by ${(now - result.exp) / 1000} seconds.`);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print('JWT verification failed.');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print('Invalid JWT header.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the provided password matches the hash
|
|
||||||
* @param {string} password
|
|
||||||
* @param {string} hash bcrypt hash
|
|
||||||
* @returns true if the password matches the hash
|
|
||||||
*/
|
|
||||||
function verifyPassword(password, hash) {
|
|
||||||
return bCrypt.hashpw(password, hash) === hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hashes a password
|
|
||||||
* @param {string} password
|
|
||||||
* @returns {string} TODOC
|
|
||||||
*/
|
|
||||||
function hashPassword(password) {
|
|
||||||
let salt = bCrypt.gensalt(12);
|
|
||||||
return bCrypt.hashpw(password, salt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if there is an administrator on the instance
|
|
||||||
* @returns TODOC
|
|
||||||
*/
|
|
||||||
function noAdministrator() {
|
|
||||||
return (
|
|
||||||
!core.globalSettings ||
|
|
||||||
!core.globalSettings.permissions ||
|
|
||||||
!Object.keys(core.globalSettings.permissions).some(function (name) {
|
|
||||||
return (
|
|
||||||
core.globalSettings.permissions[name].indexOf('administration') != -1
|
|
||||||
);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes a user an administrator
|
|
||||||
* @param {string} name the user's name
|
|
||||||
*/
|
|
||||||
function makeAdministrator(name) {
|
|
||||||
if (!core.globalSettings.permissions) {
|
|
||||||
core.globalSettings.permissions = {};
|
|
||||||
}
|
|
||||||
if (!core.globalSettings.permissions[name]) {
|
|
||||||
core.globalSettings.permissions[name] = [];
|
|
||||||
}
|
|
||||||
if (core.globalSettings.permissions[name].indexOf('administration') == -1) {
|
|
||||||
core.globalSettings.permissions[name].push('administration');
|
|
||||||
}
|
|
||||||
|
|
||||||
core.setGlobalSettings(core.globalSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} headers most likely an object
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function getCookies(headers) {
|
|
||||||
let cookies = {};
|
|
||||||
|
|
||||||
if (headers.cookie) {
|
|
||||||
let parts = headers.cookie.split(/,|;/);
|
|
||||||
for (let i in parts) {
|
|
||||||
let equals = parts[i].indexOf('=');
|
|
||||||
let name = parts[i].substring(0, equals).trim();
|
|
||||||
let value = parts[i].substring(equals + 1).trim();
|
|
||||||
cookies[name] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates a username
|
|
||||||
* @param {string} name
|
|
||||||
* @returns false | boolean[] ?
|
|
||||||
*/
|
|
||||||
function isNameValid(name) {
|
|
||||||
// TODO(tasiaiso): convert this into a regex
|
|
||||||
let c = name.charAt(0);
|
|
||||||
return (
|
|
||||||
((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) &&
|
|
||||||
name
|
|
||||||
.split()
|
|
||||||
.map(
|
|
||||||
(x) =>
|
|
||||||
x >= ('a' && x <= 'z') ||
|
|
||||||
x >= ('A' && x <= 'Z') ||
|
|
||||||
x >= ('0' && x <= '9')
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request handler ?
|
|
||||||
* @param {*} request TODOC
|
|
||||||
* @param {*} response
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function handler(request, response) {
|
|
||||||
// TODO(tasiaiso): split this function
|
|
||||||
let session = getCookies(request.headers).session;
|
|
||||||
if (request.uri == '/login') {
|
|
||||||
let formData = form.decodeForm(request.query);
|
|
||||||
if (query(request.headers)?.permissions?.authenticated) {
|
|
||||||
if (formData.return) {
|
|
||||||
response.writeHead(303, {Location: formData.return});
|
|
||||||
} else {
|
|
||||||
response.writeHead(303, {
|
|
||||||
Location:
|
|
||||||
(request.client.tls ? 'https://' : 'http://') +
|
|
||||||
request.headers.host +
|
|
||||||
'/',
|
|
||||||
'Content-Length': '0',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
response.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let sessionIsNew = false;
|
|
||||||
let loginError;
|
|
||||||
|
|
||||||
if (request.method == 'POST' || formData.submit) {
|
|
||||||
sessionIsNew = true;
|
|
||||||
formData = form.decodeForm(utf8Decode(request.body), formData);
|
|
||||||
if (formData.submit == 'Login') {
|
|
||||||
let account = gDatabase.get('user:' + formData.name);
|
|
||||||
account = account ? JSON.parse(account) : account;
|
|
||||||
if (formData.register == '1') {
|
|
||||||
if (
|
|
||||||
!account &&
|
|
||||||
isNameValid(formData.name) &&
|
|
||||||
formData.password == formData.confirm
|
|
||||||
) {
|
|
||||||
let users = new Set();
|
|
||||||
let users_original = gDatabase.get('users');
|
|
||||||
try {
|
|
||||||
users = new Set(JSON.parse(users_original));
|
|
||||||
} catch {}
|
|
||||||
if (!users.has(formData.name)) {
|
|
||||||
users.add(formData.name);
|
|
||||||
}
|
|
||||||
users = JSON.stringify([...users].sort());
|
|
||||||
if (users !== users_original) {
|
|
||||||
gDatabase.set('users', users);
|
|
||||||
}
|
|
||||||
session = makeJwt({name: formData.name});
|
|
||||||
account = {password: hashPassword(formData.password)};
|
|
||||||
gDatabase.set('user:' + formData.name, JSON.stringify(account));
|
|
||||||
if (noAdministrator()) {
|
|
||||||
makeAdministrator(formData.name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
loginError = 'Error registering account.';
|
|
||||||
}
|
|
||||||
} else if (formData.change == '1') {
|
|
||||||
if (
|
|
||||||
account &&
|
|
||||||
isNameValid(formData.name) &&
|
|
||||||
formData.new_password == formData.confirm &&
|
|
||||||
verifyPassword(formData.password, account.password)
|
|
||||||
) {
|
|
||||||
session = makeJwt({name: formData.name});
|
|
||||||
account = {password: hashPassword(formData.new_password)};
|
|
||||||
gDatabase.set('user:' + formData.name, JSON.stringify(account));
|
|
||||||
} else {
|
|
||||||
loginError = 'Error changing password.';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (
|
|
||||||
account &&
|
|
||||||
account.password &&
|
|
||||||
verifyPassword(formData.password, account.password)
|
|
||||||
) {
|
|
||||||
session = makeJwt({name: formData.name});
|
|
||||||
if (noAdministrator()) {
|
|
||||||
makeAdministrator(formData.name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
loginError = 'Invalid username or password.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Proceed as Guest
|
|
||||||
session = makeJwt({name: 'guest'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let cookie = `session=${session}; path=/; Max-Age=${kRefreshInterval}; ${request.client.tls ? 'Secure; ' : ''}SameSite=Strict; HttpOnly`;
|
|
||||||
let entry = readSession(session);
|
|
||||||
if (entry && formData.return) {
|
|
||||||
response.writeHead(303, {
|
|
||||||
Location: formData.return,
|
|
||||||
'Set-Cookie': cookie,
|
|
||||||
});
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
File.readFile('core/auth.html')
|
|
||||||
.then(function (data) {
|
|
||||||
let html = utf8Decode(data);
|
|
||||||
let auth_data = {
|
|
||||||
session_is_new: sessionIsNew,
|
|
||||||
name: entry?.name,
|
|
||||||
error: loginError,
|
|
||||||
code_of_conduct: core.globalSettings.code_of_conduct,
|
|
||||||
have_administrator: !noAdministrator(),
|
|
||||||
};
|
|
||||||
html = utf8Encode(
|
|
||||||
html.replace('$AUTH_DATA', JSON.stringify(auth_data))
|
|
||||||
);
|
|
||||||
response.writeHead(200, {
|
|
||||||
'Content-Type': 'text/html; charset=utf-8',
|
|
||||||
'Set-Cookie': cookie,
|
|
||||||
'Content-Length': html.length,
|
|
||||||
});
|
|
||||||
response.end(html);
|
|
||||||
})
|
|
||||||
.catch(function (error) {
|
|
||||||
response.writeHead(404, {
|
|
||||||
'Content-Type': 'text/plain; charset=utf-8',
|
|
||||||
Connection: 'close',
|
|
||||||
});
|
|
||||||
response.end('404 File not found');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (request.uri == '/login/logout') {
|
|
||||||
response.writeHead(303, {
|
|
||||||
'Set-Cookie': `session=; path=/; ${request.client.tls ? 'Secure; ' : ''}SameSite=Strict; expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly`,
|
|
||||||
Location: '/login' + (request.query ? '?' + request.query : ''),
|
|
||||||
});
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
response.writeHead(200, {
|
|
||||||
'Content-Type': 'text/plain; charset=utf-8',
|
|
||||||
Connection: 'close',
|
|
||||||
});
|
|
||||||
response.end('Hello, ' + request.client.peerName + '.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a user's permissions based on it's session ?
|
|
||||||
* @param {*} session TODOC
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function getPermissions(session) {
|
|
||||||
let permissions;
|
|
||||||
let entry = readSession(session);
|
|
||||||
if (entry) {
|
|
||||||
permissions = getPermissionsForUser(entry.name);
|
|
||||||
permissions.authenticated = entry.name !== 'guest';
|
|
||||||
}
|
|
||||||
return permissions || {};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a user's permissions ?
|
|
||||||
* @param {string} userName TODOC
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function getPermissionsForUser(userName) {
|
|
||||||
let permissions = {};
|
|
||||||
if (
|
|
||||||
core.globalSettings &&
|
|
||||||
core.globalSettings.permissions &&
|
|
||||||
core.globalSettings.permissions[userName]
|
|
||||||
) {
|
|
||||||
for (let i in core.globalSettings.permissions[userName]) {
|
|
||||||
permissions[core.globalSettings.permissions[userName][i]] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return permissions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} headers
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function query(headers) {
|
|
||||||
let session = getCookies(headers).session;
|
|
||||||
let entry;
|
|
||||||
let autologin = tildefriends.args.autologin;
|
|
||||||
if ((entry = autologin ? {name: autologin} : readSession(session))) {
|
|
||||||
return {
|
|
||||||
session: entry,
|
|
||||||
permissions: autologin
|
|
||||||
? getPermissionsForUser(autologin)
|
|
||||||
: getPermissions(session),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Refreshes a JWT ?
|
|
||||||
* @param {*} credentials TODOC
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function makeRefresh(credentials) {
|
|
||||||
if (credentials?.session?.name) {
|
|
||||||
return {
|
|
||||||
token: makeJwt({name: credentials.session.name}),
|
|
||||||
interval: kRefreshInterval,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {handler, query, makeRefresh};
|
|
235
core/client.js
235
core/client.js
@ -10,6 +10,7 @@ let gEditor;
|
|||||||
let gOriginalInput;
|
let gOriginalInput;
|
||||||
|
|
||||||
let kErrorColor = '#dc322f';
|
let kErrorColor = '#dc322f';
|
||||||
|
let kDisconnectColor = '#f00';
|
||||||
let kStatusColor = '#fff';
|
let kStatusColor = '#fff';
|
||||||
|
|
||||||
// Functions that server-side app code can call through the app object.
|
// Functions that server-side app code can call through the app object.
|
||||||
@ -56,6 +57,9 @@ class TfNavigationElement extends LitElement {
|
|||||||
spark_lines: {type: Object},
|
spark_lines: {type: Object},
|
||||||
version: {type: Object},
|
version: {type: Object},
|
||||||
show_version: {type: Boolean},
|
show_version: {type: Boolean},
|
||||||
|
identity: {type: String},
|
||||||
|
identities: {type: Array},
|
||||||
|
names: {type: Object},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +69,8 @@ class TfNavigationElement extends LitElement {
|
|||||||
this.show_permissions = false;
|
this.show_permissions = false;
|
||||||
this.status = {};
|
this.status = {};
|
||||||
this.spark_lines = {};
|
this.spark_lines = {};
|
||||||
|
this.identities = [];
|
||||||
|
this.names = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,10 +103,10 @@ class TfNavigationElement extends LitElement {
|
|||||||
get_spark_line(key, options) {
|
get_spark_line(key, options) {
|
||||||
if (!this.spark_lines[key]) {
|
if (!this.spark_lines[key]) {
|
||||||
let spark_line = document.createElement('tf-sparkline');
|
let spark_line = document.createElement('tf-sparkline');
|
||||||
spark_line.style.display = 'flex';
|
|
||||||
spark_line.style.flexDirection = 'row';
|
|
||||||
spark_line.style.flex = '0 50 5em';
|
|
||||||
spark_line.title = key;
|
spark_line.title = key;
|
||||||
|
spark_line.classList.add('w3-bar-item');
|
||||||
|
spark_line.classList.add('w3-hide-small');
|
||||||
|
spark_line.style.paddingRight = '0';
|
||||||
if (options) {
|
if (options) {
|
||||||
if (options.max) {
|
if (options.max) {
|
||||||
spark_line.max = options.max;
|
spark_line.max = options.max;
|
||||||
@ -112,17 +118,122 @@ class TfNavigationElement extends LitElement {
|
|||||||
return this.spark_lines[key];
|
return this.spark_lines[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
set_active_identity(id) {
|
||||||
* TODOC
|
send({action: 'setActiveIdentity', identity: id});
|
||||||
* @returns
|
this.renderRoot.getElementById('id_dropdown').classList.remove('w3-show');
|
||||||
*/
|
}
|
||||||
render_login() {
|
|
||||||
|
create_identity(event) {
|
||||||
|
if (confirm('Are you sure you want to create a new identity?')) {
|
||||||
|
send({action: 'createIdentity'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle_id_dropdown() {
|
||||||
|
this.renderRoot.getElementById('id_dropdown').classList.toggle('w3-show');
|
||||||
|
}
|
||||||
|
|
||||||
|
edit_profile() {
|
||||||
|
window.location.href = '/~core/ssb/#' + this.identity;
|
||||||
|
}
|
||||||
|
|
||||||
|
logout() {
|
||||||
|
window.location.href = `/login/logout?return=${encodeURIComponent(url() + hash())}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
render_identity() {
|
||||||
|
let self = this;
|
||||||
|
|
||||||
if (this?.credentials?.session?.name) {
|
if (this?.credentials?.session?.name) {
|
||||||
return html`<a id="login" href="/login/logout?return=${url() + hash()}"
|
if (this.identities?.length) {
|
||||||
>logout ${this.credentials.session.name}</a
|
return html`
|
||||||
>`;
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
|
<div class="w3-dropdown-click w3-right" style="max-width: 100%">
|
||||||
|
<button
|
||||||
|
class="w3-button w3-rest w3-cyan"
|
||||||
|
style="text-overflow: ellipsis; overflow: hidden; white-space: nowrap; max-width: 100%"
|
||||||
|
id="identity"
|
||||||
|
@click=${self.toggle_id_dropdown}
|
||||||
|
>
|
||||||
|
${self.names[this.identity]}▾
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
id="id_dropdown"
|
||||||
|
class="w3-dropdown-content w3-bar-block w3-card-4"
|
||||||
|
style="max-width: 100%; right: 0"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button w3-border"
|
||||||
|
@click=${() => (window.location.href = '/~core/identity')}
|
||||||
|
>
|
||||||
|
Manage Identities...
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button w3-border"
|
||||||
|
@click=${self.edit_profile}
|
||||||
|
>
|
||||||
|
Edit Profile...
|
||||||
|
</button>
|
||||||
|
${this.identities.map(
|
||||||
|
(x) => html`
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button ${x === self.identity
|
||||||
|
? 'w3-cyan'
|
||||||
|
: ''}"
|
||||||
|
@click=${() => self.set_active_identity(x)}
|
||||||
|
style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap"
|
||||||
|
>
|
||||||
|
${self.names[x]}${self.names[x] === x ? '' : html` - ${x}`}
|
||||||
|
</button>
|
||||||
|
`
|
||||||
|
)}
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button w3-border"
|
||||||
|
id="logout"
|
||||||
|
@click=${self.logout}
|
||||||
|
>
|
||||||
|
Logout ${this.credentials.session.name}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
} else if (
|
||||||
|
this.credentials?.session?.name &&
|
||||||
|
this.credentials.session.name !== 'guest'
|
||||||
|
) {
|
||||||
|
return html`
|
||||||
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button w3-right w3-cyan"
|
||||||
|
id="logout"
|
||||||
|
@click=${self.logout}
|
||||||
|
>
|
||||||
|
Logout ${this.credentials.session.name}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="create_identity"
|
||||||
|
@click=${this.create_identity}
|
||||||
|
class="w3-button w3-mobile w3-red w3-right"
|
||||||
|
>
|
||||||
|
Create an Identity
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
} else {
|
} else {
|
||||||
return html`<a id="login" href="/login?return=${url() + hash()}"
|
return html`
|
||||||
|
<button
|
||||||
|
class="w3-bar-item w3-button w3-right w3-cyan"
|
||||||
|
id="logout"
|
||||||
|
@click=${self.logout}
|
||||||
|
>
|
||||||
|
Logout ${this.credentials.session.name}
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return html`<a
|
||||||
|
class="w3-bar-item w3-cyan w3-right"
|
||||||
|
id="login"
|
||||||
|
href="/login?return=${url() + hash()}"
|
||||||
>login</a
|
>login</a
|
||||||
>`;
|
>`;
|
||||||
}
|
}
|
||||||
@ -146,8 +257,14 @@ class TfNavigationElement extends LitElement {
|
|||||||
${Object.keys(this.permissions).map(
|
${Object.keys(this.permissions).map(
|
||||||
(key) => html`
|
(key) => html`
|
||||||
<div>
|
<div>
|
||||||
<span>${key}</span>: ${this.permissions[key] ? '✅ Allowed' : '❌ Denied'}
|
<span>${key}</span>:
|
||||||
<button @click=${() => this.reset_permission(key)} class='w3-button w3-red">Reset</button>
|
${this.permissions[key] ? '✅ Allowed' : '❌ Denied'}
|
||||||
|
<button
|
||||||
|
@click=${() => this.reset_permission(key)}
|
||||||
|
class="w3-button w3-red"
|
||||||
|
>
|
||||||
|
Reset
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
)}
|
)}
|
||||||
@ -163,6 +280,10 @@ class TfNavigationElement extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_error() {
|
||||||
|
this.status = {};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODOC
|
* TODOC
|
||||||
* @returns
|
* @returns
|
||||||
@ -170,6 +291,7 @@ class TfNavigationElement extends LitElement {
|
|||||||
render() {
|
render() {
|
||||||
let self = this;
|
let self = this;
|
||||||
return html`
|
return html`
|
||||||
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
<style>
|
<style>
|
||||||
${k_global_style} .tooltip {
|
${k_global_style} .tooltip {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -185,17 +307,17 @@ class TfNavigationElement extends LitElement {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div
|
<div class="w3-black w3-bar">
|
||||||
style="margin: 4px; display: flex; flex-direction: row; flex-wrap: nowrap; gap: 3px; align-items: center"
|
|
||||||
>
|
|
||||||
<span
|
<span
|
||||||
|
class="w3-bar-item"
|
||||||
style="cursor: pointer"
|
style="cursor: pointer"
|
||||||
@click=${() => (this.show_version = !this.show_version)}
|
@click=${() => (this.show_version = !this.show_version)}
|
||||||
>😎</span
|
>😎</span
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
?hidden=${!this.show_version}
|
class="w3-bar-item"
|
||||||
style="flex: 0 0; white-space: nowrap"
|
style=${'white-space: nowrap' +
|
||||||
|
(this.show_version ? '' : '; display: none')}
|
||||||
title=${this.version?.name +
|
title=${this.version?.name +
|
||||||
' ' +
|
' ' +
|
||||||
Object.entries(this.version || {})
|
Object.entries(this.version || {})
|
||||||
@ -204,6 +326,7 @@ class TfNavigationElement extends LitElement {
|
|||||||
>${this.version?.number}</span
|
>${this.version?.number}</span
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
class="w3-bar-item"
|
||||||
accesskey="h"
|
accesskey="h"
|
||||||
@mouseover=${set_access_key_title}
|
@mouseover=${set_access_key_title}
|
||||||
data-tip="Open home app."
|
data-tip="Open home app."
|
||||||
@ -212,6 +335,7 @@ class TfNavigationElement extends LitElement {
|
|||||||
>TF</a
|
>TF</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
class="w3-bar-item"
|
||||||
accesskey="a"
|
accesskey="a"
|
||||||
@mouseover=${set_access_key_title}
|
@mouseover=${set_access_key_title}
|
||||||
data-tip="Open apps list."
|
data-tip="Open apps list."
|
||||||
@ -219,6 +343,7 @@ class TfNavigationElement extends LitElement {
|
|||||||
>apps</a
|
>apps</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
class="w3-bar-item"
|
||||||
accesskey="e"
|
accesskey="e"
|
||||||
@mouseover=${set_access_key_title}
|
@mouseover=${set_access_key_title}
|
||||||
data-tip="Toggle the app editor."
|
data-tip="Toggle the app editor."
|
||||||
@ -227,6 +352,7 @@ class TfNavigationElement extends LitElement {
|
|||||||
>edit</a
|
>edit</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
class="w3-bar-item"
|
||||||
accesskey="p"
|
accesskey="p"
|
||||||
@mouseover=${set_access_key_title}
|
@mouseover=${set_access_key_title}
|
||||||
data-tip="View and change permissions."
|
data-tip="View and change permissions."
|
||||||
@ -234,27 +360,34 @@ class TfNavigationElement extends LitElement {
|
|||||||
@click=${() => (self.show_permissions = !self.show_permissions)}
|
@click=${() => (self.show_permissions = !self.show_permissions)}
|
||||||
>🎛️</a
|
>🎛️</a
|
||||||
>
|
>
|
||||||
<span
|
|
||||||
style="display: inline-block; vertical-align: top; white-space: pre; color: ${this
|
|
||||||
.status.color ?? kErrorColor}"
|
|
||||||
>${this.status.message}</span
|
|
||||||
>
|
|
||||||
<span id="requests"></span>
|
|
||||||
${this.render_permissions()}
|
${this.render_permissions()}
|
||||||
<span
|
${this.status?.message && !this.status.is_error
|
||||||
style="flex: 1 1; display: flex; flex-direction: row; white-space: nowrap; margin: 0; padding: 0"
|
? html`
|
||||||
>${Object.keys(this.spark_lines)
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
.sort()
|
<div
|
||||||
.map((x) => this.spark_lines[x])
|
class="w3-bar-item"
|
||||||
.map((x) => [
|
style="color: ${this.status.color ?? kStatusColor}"
|
||||||
html`<span style="font-size: xx-small">${x.dataset.emoji}</span>`,
|
|
||||||
x,
|
|
||||||
])}</span
|
|
||||||
>
|
|
||||||
<span style="flex: 0 0; white-space: nowrap"
|
|
||||||
>${this.render_login()}</span
|
|
||||||
>
|
>
|
||||||
|
${this.status.message}
|
||||||
</div>
|
</div>
|
||||||
|
`
|
||||||
|
: undefined}
|
||||||
|
${Object.keys(this.spark_lines)
|
||||||
|
.sort()
|
||||||
|
.map((x) => this.spark_lines[x])}
|
||||||
|
${this.render_identity()}
|
||||||
|
</div>
|
||||||
|
${this.status?.is_error
|
||||||
|
? html`
|
||||||
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
|
<div class="w3-model w3-animate-top" style="position: absolute; left: 50%; transform: translate(-50%); z-index: 1">
|
||||||
|
<dijv class="w3-modal-content w3-card-4" style="display: block; padding: 1em">
|
||||||
|
<span @click=${self.clear_error} class="w3-button w3-display-topright">×</span>
|
||||||
|
<div style="color: ${this.status.color ?? kErrorColor}"><b>ERROR:</b><p style="white-space: pre">${this.status.message}</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: undefined}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -578,13 +711,13 @@ class TfSparkLineElement extends LitElement {
|
|||||||
) / 10.0;
|
) / 10.0;
|
||||||
return html`
|
return html`
|
||||||
<svg
|
<svg
|
||||||
style="max-width: 7.5em; max-height: 1.5em; margin: 0; padding: 0; background: #000"
|
style="max-width: 7.5em; margin: 0; padding: 0; background: #000; height: 1em"
|
||||||
viewBox="0 0 50 10"
|
viewBox="0 0 50 10"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
${this.lines.map((x) => this.render_line(x))}
|
${this.lines.map((x) => this.render_line(x))}
|
||||||
<text x="0" y="1em" style="font: 8px sans-serif; fill: #fff">
|
<text x="0" y="1em" style="font: 8px sans-serif; fill: #fff">
|
||||||
${max}
|
${this.dataset.emoji}${max}
|
||||||
</text>
|
</text>
|
||||||
</svg>
|
</svg>
|
||||||
`;
|
`;
|
||||||
@ -1000,9 +1133,9 @@ function api_postMessage(message) {
|
|||||||
function api_error(error) {
|
function api_error(error) {
|
||||||
if (error) {
|
if (error) {
|
||||||
if (typeof error == 'string') {
|
if (typeof error == 'string') {
|
||||||
setStatusMessage('⚠️ ' + error, '#f00');
|
setStatusMessage('⚠️ ' + error, kErrorColor);
|
||||||
} else {
|
} else {
|
||||||
setStatusMessage('⚠️ ' + error.message + '\n' + error.stack, '#f00');
|
setStatusMessage('⚠️ ' + error.message + '\n' + error.stack, kErrorColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log('error', error);
|
console.log('error', error);
|
||||||
@ -1119,11 +1252,19 @@ function api_setHash(hash) {
|
|||||||
function _receive_websocket_message(message) {
|
function _receive_websocket_message(message) {
|
||||||
if (message && message.action == 'session') {
|
if (message && message.action == 'session') {
|
||||||
setStatusMessage('🟢 Executing...', kStatusColor);
|
setStatusMessage('🟢 Executing...', kStatusColor);
|
||||||
document.getElementsByTagName('tf-navigation')[0].credentials =
|
let navigation = document.getElementsByTagName('tf-navigation')[0];
|
||||||
message.credentials;
|
navigation.credentials = message.credentials;
|
||||||
|
navigation.identities = message.identities;
|
||||||
|
navigation.identity = message.identity;
|
||||||
|
navigation.names = message.names;
|
||||||
} else if (message && message.action == 'permissions') {
|
} else if (message && message.action == 'permissions') {
|
||||||
document.getElementsByTagName('tf-navigation')[0].permissions =
|
let navigation = document.getElementsByTagName('tf-navigation')[0];
|
||||||
message.permissions ?? {};
|
navigation.permissions = message.permissions ?? {};
|
||||||
|
} else if (message && message.action == 'identities') {
|
||||||
|
let navigation = document.getElementsByTagName('tf-navigation')[0];
|
||||||
|
navigation.identities = message.identities;
|
||||||
|
navigation.identity = message.identity;
|
||||||
|
navigation.names = message.names;
|
||||||
} else if (message && message.action == 'ready') {
|
} else if (message && message.action == 'ready') {
|
||||||
setStatusMessage(null);
|
setStatusMessage(null);
|
||||||
if (window.location.hash) {
|
if (window.location.hash) {
|
||||||
@ -1133,7 +1274,6 @@ function _receive_websocket_message(message) {
|
|||||||
document.getElementById('viewPane').style.display = message.edit_only
|
document.getElementById('viewPane').style.display = message.edit_only
|
||||||
? 'none'
|
? 'none'
|
||||||
: 'flex';
|
: 'flex';
|
||||||
send({action: 'enableStats', enabled: true});
|
|
||||||
} else if (message && message.action == 'ping') {
|
} else if (message && message.action == 'ping') {
|
||||||
send({action: 'pong'});
|
send({action: 'pong'});
|
||||||
} else if (message && message.action == 'stats') {
|
} else if (message && message.action == 'stats') {
|
||||||
@ -1211,6 +1351,7 @@ function setStatusMessage(message, color) {
|
|||||||
document.getElementsByTagName('tf-navigation')[0].status = {
|
document.getElementsByTagName('tf-navigation')[0].status = {
|
||||||
message: message,
|
message: message,
|
||||||
color: color,
|
color: color,
|
||||||
|
is_error: color == kErrorColor,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1420,7 +1561,7 @@ function connectSocket(path) {
|
|||||||
};
|
};
|
||||||
setStatusMessage(
|
setStatusMessage(
|
||||||
'🔴 Closed: ' + (k_codes[event.code] || event.code),
|
'🔴 Closed: ' + (k_codes[event.code] || event.code),
|
||||||
kErrorColor
|
kDisconnectColor
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
490
core/core.js
490
core/core.js
@ -1,5 +1,4 @@
|
|||||||
import * as app from './app.js';
|
import * as app from './app.js';
|
||||||
import * as auth from './auth.js';
|
|
||||||
import * as form from './form.js';
|
import * as form from './form.js';
|
||||||
import * as http from './http.js';
|
import * as http from './http.js';
|
||||||
|
|
||||||
@ -9,120 +8,6 @@ let gStatsTimer = false;
|
|||||||
const k_content_security_policy =
|
const k_content_security_policy =
|
||||||
'sandbox allow-downloads allow-top-navigation-by-user-activation';
|
'sandbox allow-downloads allow-top-navigation-by-user-activation';
|
||||||
|
|
||||||
const k_mime_types = {
|
|
||||||
css: 'text/css',
|
|
||||||
html: 'text/html',
|
|
||||||
js: 'text/javascript',
|
|
||||||
json: 'text/json',
|
|
||||||
map: 'application/json',
|
|
||||||
svg: 'image/svg+xml',
|
|
||||||
};
|
|
||||||
|
|
||||||
const k_magic_bytes = [
|
|
||||||
{bytes: [0xff, 0xd8, 0xff, 0xdb], type: 'image/jpeg'},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
|
|
||||||
],
|
|
||||||
type: 'image/jpeg',
|
|
||||||
},
|
|
||||||
{bytes: [0xff, 0xd8, 0xff, 0xee], type: 'image/jpeg'},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
0xff,
|
|
||||||
0xd8,
|
|
||||||
0xff,
|
|
||||||
0xe1,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
0x45,
|
|
||||||
0x78,
|
|
||||||
0x69,
|
|
||||||
0x66,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
],
|
|
||||||
type: 'image/jpeg',
|
|
||||||
},
|
|
||||||
{bytes: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], type: 'image/png'},
|
|
||||||
{bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], type: 'image/gif'},
|
|
||||||
{bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], type: 'image/gif'},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
0x52,
|
|
||||||
0x49,
|
|
||||||
0x46,
|
|
||||||
0x46,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
0x57,
|
|
||||||
0x45,
|
|
||||||
0x42,
|
|
||||||
0x50,
|
|
||||||
],
|
|
||||||
type: 'image/webp',
|
|
||||||
},
|
|
||||||
{bytes: [0x3c, 0x73, 0x76, 0x67], type: 'image/svg+xml'},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
0x66,
|
|
||||||
0x74,
|
|
||||||
0x79,
|
|
||||||
0x70,
|
|
||||||
0x6d,
|
|
||||||
0x70,
|
|
||||||
0x34,
|
|
||||||
0x32,
|
|
||||||
],
|
|
||||||
type: 'audio/mpeg',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
0x66,
|
|
||||||
0x74,
|
|
||||||
0x79,
|
|
||||||
0x70,
|
|
||||||
0x69,
|
|
||||||
0x73,
|
|
||||||
0x6f,
|
|
||||||
0x6d,
|
|
||||||
],
|
|
||||||
type: 'video/mp4',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
bytes: [
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
0x66,
|
|
||||||
0x74,
|
|
||||||
0x79,
|
|
||||||
0x70,
|
|
||||||
0x6d,
|
|
||||||
0x70,
|
|
||||||
0x34,
|
|
||||||
0x32,
|
|
||||||
],
|
|
||||||
type: 'video/mp4',
|
|
||||||
},
|
|
||||||
{bytes: [0x4d, 0x54, 0x68, 0x64], type: 'audio/midi'},
|
|
||||||
];
|
|
||||||
|
|
||||||
let k_static_files = [
|
|
||||||
{uri: '/', path: 'index.html', type: 'text/html; charset=UTF-8'},
|
|
||||||
];
|
|
||||||
|
|
||||||
const k_global_settings = {
|
const k_global_settings = {
|
||||||
index: {
|
index: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
@ -138,13 +23,18 @@ const k_global_settings = {
|
|||||||
room: {
|
room: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
default_value: true,
|
default_value: true,
|
||||||
description: 'Whether this instance should behave as a room.',
|
description: 'Enable peers to tunnel through this instance as a room.',
|
||||||
},
|
},
|
||||||
room_name: {
|
room_name: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
default_value: 'tilde friends tunnel',
|
default_value: 'tilde friends tunnel',
|
||||||
description: 'Name of the room.',
|
description: 'Name of the room.',
|
||||||
},
|
},
|
||||||
|
replicator: {
|
||||||
|
type: 'boolean',
|
||||||
|
default_value: true,
|
||||||
|
description: 'Enable message and blob replication.',
|
||||||
|
},
|
||||||
code_of_conduct: {
|
code_of_conduct: {
|
||||||
type: 'textarea',
|
type: 'textarea',
|
||||||
default_value: undefined,
|
default_value: undefined,
|
||||||
@ -179,6 +69,22 @@ const k_global_settings = {
|
|||||||
: undefined,
|
: undefined,
|
||||||
description: 'Blobs older than this will be automatically deleted.',
|
description: 'Blobs older than this will be automatically deleted.',
|
||||||
},
|
},
|
||||||
|
seeds_host: {
|
||||||
|
type: 'string',
|
||||||
|
default_value: 'seeds.tildefriends.net',
|
||||||
|
description: 'Hostname for seed connections.',
|
||||||
|
},
|
||||||
|
peer_exchange: {
|
||||||
|
type: 'boolean',
|
||||||
|
default_value: false,
|
||||||
|
description:
|
||||||
|
'Enable discovery of, sharing of, and connecting to internet peer strangers, including announcing this instance.',
|
||||||
|
},
|
||||||
|
account_registration: {
|
||||||
|
type: 'boolean',
|
||||||
|
default_value: true,
|
||||||
|
description: 'Allow registration of new accounts.',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let gGlobalSettings = {
|
let gGlobalSettings = {
|
||||||
@ -245,6 +151,7 @@ function broadcastEvent(eventName, argv) {
|
|||||||
}
|
}
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODOC
|
* TODOC
|
||||||
* @param {*} message
|
* @param {*} message
|
||||||
@ -266,6 +173,34 @@ function broadcast(message) {
|
|||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODOC
|
||||||
|
* @param {String} eventName
|
||||||
|
* @param {*} argv
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function broadcastAppEventToUser(
|
||||||
|
user,
|
||||||
|
packageOwner,
|
||||||
|
packageName,
|
||||||
|
eventName,
|
||||||
|
argv
|
||||||
|
) {
|
||||||
|
let promises = [];
|
||||||
|
for (let process of Object.values(gProcesses)) {
|
||||||
|
if (
|
||||||
|
process.credentials?.session?.name === user &&
|
||||||
|
process.packageOwner == packageOwner &&
|
||||||
|
process.packageName == packageName
|
||||||
|
) {
|
||||||
|
if (process.eventHandlers[eventName]) {
|
||||||
|
promises.push(invoke(process.eventHandlers[eventName], argv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODOC
|
* TODOC
|
||||||
* @param {*} caller
|
* @param {*} caller
|
||||||
@ -288,7 +223,7 @@ function getUser(caller, process) {
|
|||||||
* @param {*} process
|
* @param {*} process
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function getApps(user, process) {
|
async function getApps(user, process) {
|
||||||
if (
|
if (
|
||||||
process.credentials &&
|
process.credentials &&
|
||||||
process.credentials.session &&
|
process.credentials.session &&
|
||||||
@ -303,10 +238,12 @@ function getApps(user, process) {
|
|||||||
if (user) {
|
if (user) {
|
||||||
let db = new Database(user);
|
let db = new Database(user);
|
||||||
try {
|
try {
|
||||||
let names = JSON.parse(db.get('apps'));
|
let names = JSON.parse(await db.get('apps'));
|
||||||
return Object.fromEntries(
|
let result = {};
|
||||||
names.map((name) => [name, db.get('path:' + name)])
|
for (let name of names) {
|
||||||
);
|
result[name] = await db.get('path:' + name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
@ -361,6 +298,8 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
process.key = key;
|
process.key = key;
|
||||||
process.credentials = options.credentials || {};
|
process.credentials = options.credentials || {};
|
||||||
process.task = new Task();
|
process.task = new Task();
|
||||||
|
process.packageOwner = options.packageOwner;
|
||||||
|
process.packageName = options.packageName;
|
||||||
process.eventHandlers = {};
|
process.eventHandlers = {};
|
||||||
if (!options?.script || options?.script === 'app.js') {
|
if (!options?.script || options?.script === 'app.js') {
|
||||||
process.app = new app.App();
|
process.app = new app.App();
|
||||||
@ -368,7 +307,6 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
process.lastActive = Date.now();
|
process.lastActive = Date.now();
|
||||||
process.lastPing = null;
|
process.lastPing = null;
|
||||||
process.timeout = options.timeout;
|
process.timeout = options.timeout;
|
||||||
process.stats = false;
|
|
||||||
process.ready = new Promise(function (resolve, reject) {
|
process.ready = new Promise(function (resolve, reject) {
|
||||||
resolveReady = resolve;
|
resolveReady = resolve;
|
||||||
rejectReady = reject;
|
rejectReady = reject;
|
||||||
@ -400,9 +338,9 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
user: getUser(process, process),
|
user: getUser(process, process),
|
||||||
users: function () {
|
users: async function () {
|
||||||
try {
|
try {
|
||||||
return JSON.parse(new Database('auth').get('users'));
|
return JSON.parse(await new Database('auth').get('users'));
|
||||||
} catch {
|
} catch {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@ -509,6 +447,67 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
url: options?.url,
|
url: options?.url,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
process.sendIdentities = async function () {
|
||||||
|
process.app.send(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
action: 'identities',
|
||||||
|
},
|
||||||
|
await ssb.getIdentityInfo(
|
||||||
|
process?.credentials?.session?.name,
|
||||||
|
options?.packageOwner,
|
||||||
|
options?.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
process.setActiveIdentity = async function (identity) {
|
||||||
|
if (
|
||||||
|
process?.credentials?.session?.name &&
|
||||||
|
options.packageOwner &&
|
||||||
|
options.packageName
|
||||||
|
) {
|
||||||
|
await new Database(process?.credentials?.session?.name).set(
|
||||||
|
`id:${options.packageOwner}:${options.packageName}`,
|
||||||
|
identity
|
||||||
|
);
|
||||||
|
}
|
||||||
|
process.sendIdentities();
|
||||||
|
broadcastAppEventToUser(
|
||||||
|
process?.credentials?.session?.name,
|
||||||
|
options.packageOwner,
|
||||||
|
options.packageName,
|
||||||
|
'setActiveIdentity',
|
||||||
|
[identity]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
process.createIdentity = async function () {
|
||||||
|
if (
|
||||||
|
process.credentials &&
|
||||||
|
process.credentials.session &&
|
||||||
|
process.credentials.session.name &&
|
||||||
|
process.credentials.session.name !== 'guest'
|
||||||
|
) {
|
||||||
|
let id = await ssb.createIdentity(process.credentials.session.name);
|
||||||
|
await process.sendIdentities();
|
||||||
|
broadcastAppEventToUser(
|
||||||
|
process?.credentials?.session?.name,
|
||||||
|
options.packageOwner,
|
||||||
|
options.packageName,
|
||||||
|
'setActiveIdentity',
|
||||||
|
[
|
||||||
|
await ssb.getActiveIdentity(
|
||||||
|
process.credentials?.session?.name,
|
||||||
|
options.packageOwner,
|
||||||
|
options.packageName
|
||||||
|
),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return id;
|
||||||
|
} else {
|
||||||
|
throw new Error('Must be signed-in to create an account.');
|
||||||
|
}
|
||||||
|
};
|
||||||
if (process.credentials?.permissions?.administration) {
|
if (process.credentials?.permissions?.administration) {
|
||||||
imports.core.globalSettingsDescriptions = function () {
|
imports.core.globalSettingsDescriptions = function () {
|
||||||
let settings = Object.assign({}, k_global_settings);
|
let settings = Object.assign({}, k_global_settings);
|
||||||
@ -522,31 +521,27 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
imports.core.globalSettingsGet = function (key) {
|
imports.core.globalSettingsGet = function (key) {
|
||||||
return gGlobalSettings[key];
|
return gGlobalSettings[key];
|
||||||
};
|
};
|
||||||
imports.core.globalSettingsSet = function (key, value) {
|
imports.core.globalSettingsSet = async function (key, value) {
|
||||||
print('Setting', key, value);
|
print('Setting', key, value);
|
||||||
|
await loadSettings();
|
||||||
gGlobalSettings[key] = value;
|
gGlobalSettings[key] = value;
|
||||||
setGlobalSettings(gGlobalSettings);
|
setGlobalSettings(gGlobalSettings);
|
||||||
print('Done.');
|
print('Done.');
|
||||||
};
|
};
|
||||||
imports.core.deleteUser = function (user) {
|
imports.core.deleteUser = async function (user) {
|
||||||
return Promise.resolve(
|
await imports.core.permissionTest('delete_user');
|
||||||
imports.core.permissionTest('delete_user')
|
|
||||||
).then(function () {
|
|
||||||
let db = new Database('auth');
|
let db = new Database('auth');
|
||||||
|
|
||||||
db.remove('user:' + user);
|
db.remove('user:' + user);
|
||||||
|
|
||||||
let users = new Set();
|
let users = new Set();
|
||||||
let users_original = db.get('users');
|
let users_original = await db.get('users');
|
||||||
try {
|
try {
|
||||||
users = new Set(JSON.parse(users_original));
|
users = new Set(JSON.parse(users_original));
|
||||||
} catch {}
|
} catch {}
|
||||||
users.delete(user);
|
users.delete(user);
|
||||||
users = JSON.stringify([...users].sort());
|
users = JSON.stringify([...users].sort());
|
||||||
if (users !== users_original) {
|
if (users !== users_original) {
|
||||||
db.set('users', users);
|
await db.set('users', users);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (options.api) {
|
if (options.api) {
|
||||||
@ -579,15 +574,7 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
Object.keys(ssb).map((key) => [key, ssb[key].bind(ssb)])
|
Object.keys(ssb).map((key) => [key, ssb[key].bind(ssb)])
|
||||||
);
|
);
|
||||||
imports.ssb.port = tildefriends.ssb_port;
|
imports.ssb.port = tildefriends.ssb_port;
|
||||||
imports.ssb.createIdentity = function () {
|
imports.ssb.createIdentity = () => process.createIdentity();
|
||||||
if (
|
|
||||||
process.credentials &&
|
|
||||||
process.credentials.session &&
|
|
||||||
process.credentials.session.name
|
|
||||||
) {
|
|
||||||
return ssb.createIdentity(process.credentials.session.name);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
imports.ssb.addIdentity = function (id) {
|
imports.ssb.addIdentity = function (id) {
|
||||||
if (
|
if (
|
||||||
process.credentials &&
|
process.credentials &&
|
||||||
@ -614,6 +601,13 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
imports.ssb.setActiveIdentity = (id) => process.setActiveIdentity(id);
|
||||||
|
imports.ssb.getActiveIdentity = () =>
|
||||||
|
ssb.getActiveIdentity(
|
||||||
|
process.credentials?.session?.name,
|
||||||
|
options.packageOwner,
|
||||||
|
options.packageName
|
||||||
|
);
|
||||||
imports.ssb.getOwnerIdentities = function () {
|
imports.ssb.getOwnerIdentities = function () {
|
||||||
if (options.packageOwner) {
|
if (options.packageOwner) {
|
||||||
return ssb.getIdentities(options.packageOwner);
|
return ssb.getIdentities(options.packageOwner);
|
||||||
@ -698,6 +692,9 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
imports.ssb.addEventListener = undefined;
|
||||||
|
imports.ssb.removeEventListener = undefined;
|
||||||
|
imports.ssb.getIdentityInfo = undefined;
|
||||||
imports.fetch = function (url, options) {
|
imports.fetch = function (url, options) {
|
||||||
return http.fetch(url, options, gGlobalSettings.fetch_hosts);
|
return http.fetch(url, options, gGlobalSettings.fetch_hosts);
|
||||||
};
|
};
|
||||||
@ -769,7 +766,7 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
};
|
};
|
||||||
process.task.setImports(imports);
|
process.task.setImports(imports);
|
||||||
process.task.activate();
|
process.task.activate();
|
||||||
let source = await getBlobOrContent(blobId);
|
let source = await ssb.blobGet(blobId);
|
||||||
let appSourceName = blobId;
|
let appSourceName = blobId;
|
||||||
let appSource = utf8Decode(source);
|
let appSource = utf8Decode(source);
|
||||||
try {
|
try {
|
||||||
@ -777,7 +774,7 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
if (appObject.type == 'tildefriends-app') {
|
if (appObject.type == 'tildefriends-app') {
|
||||||
appSourceName = options?.script ?? 'app.js';
|
appSourceName = options?.script ?? 'app.js';
|
||||||
let id = appObject.files[appSourceName];
|
let id = appObject.files[appSourceName];
|
||||||
let blob = await getBlobOrContent(id);
|
let blob = await ssb.blobGet(id);
|
||||||
appSource = utf8Decode(blob);
|
appSource = utf8Decode(blob);
|
||||||
await process.task.loadFile([
|
await process.task.loadFile([
|
||||||
'/tfrpc.js',
|
'/tfrpc.js',
|
||||||
@ -787,7 +784,7 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
Object.keys(appObject.files).map(async function (f) {
|
Object.keys(appObject.files).map(async function (f) {
|
||||||
await process.task.loadFile([
|
await process.task.loadFile([
|
||||||
f,
|
f,
|
||||||
await getBlobOrContent(appObject.files[f]),
|
await ssb.blobGet(appObject.files[f]),
|
||||||
]);
|
]);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -802,6 +799,10 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
}
|
}
|
||||||
await process.task.execute({name: appSourceName, source: appSource});
|
await process.task.execute({name: appSourceName, source: appSource});
|
||||||
resolveReady(process);
|
resolveReady(process);
|
||||||
|
if (!gStatsTimer) {
|
||||||
|
gStatsTimer = true;
|
||||||
|
sendStats();
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (process.app) {
|
if (process.app) {
|
||||||
if (process?.task?.onError) {
|
if (process?.task?.onError) {
|
||||||
@ -823,56 +824,15 @@ async function getProcessBlob(blobId, key, options) {
|
|||||||
* @param {*} settings
|
* @param {*} settings
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function setGlobalSettings(settings) {
|
async function setGlobalSettings(settings) {
|
||||||
gGlobalSettings = settings;
|
gGlobalSettings = settings;
|
||||||
try {
|
try {
|
||||||
return new Database('core').set('settings', JSON.stringify(settings));
|
return await new Database('core').set('settings', JSON.stringify(settings));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
print('Error storing settings:', error);
|
print('Error storing settings:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} data
|
|
||||||
* @param {*} bytes
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function startsWithBytes(data, bytes) {
|
|
||||||
if (data.byteLength >= bytes.length) {
|
|
||||||
let dataBytes = new Uint8Array(data.slice(0, bytes.length));
|
|
||||||
for (let i = 0; i < bytes.length; i++) {
|
|
||||||
if (dataBytes[i] !== bytes[i] && bytes[i] !== null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} path
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function guessTypeFromName(path) {
|
|
||||||
let extension = path.split('.').pop();
|
|
||||||
return k_mime_types[extension];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} data
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function guessTypeFromMagicBytes(data) {
|
|
||||||
for (let magic of k_magic_bytes) {
|
|
||||||
if (startsWithBytes(data, magic.bytes)) {
|
|
||||||
return magic.type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODOC
|
* TODOC
|
||||||
* @param {*} response
|
* @param {*} response
|
||||||
@ -888,7 +848,9 @@ function sendData(response, data, type, headers, status_code) {
|
|||||||
Object.assign(
|
Object.assign(
|
||||||
{
|
{
|
||||||
'Content-Type':
|
'Content-Type':
|
||||||
type || guessTypeFromMagicBytes(data) || 'application/binary',
|
type ||
|
||||||
|
httpd.mime_type_from_magic_bytes(data) ||
|
||||||
|
'application/binary',
|
||||||
'Content-Length': data.byteLength,
|
'Content-Length': data.byteLength,
|
||||||
},
|
},
|
||||||
headers || {}
|
headers || {}
|
||||||
@ -910,21 +872,6 @@ function sendData(response, data, type, headers, status_code) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} id
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
async function getBlobOrContent(id) {
|
|
||||||
if (!id) {
|
|
||||||
return;
|
|
||||||
} else if (id.startsWith('&')) {
|
|
||||||
return ssb.blobGet(id);
|
|
||||||
} else if (id.startsWith('%')) {
|
|
||||||
return ssb.messageContentGet(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let g_handler_index = 0;
|
let g_handler_index = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -967,7 +914,7 @@ async function useAppHandler(
|
|||||||
},
|
},
|
||||||
respond: do_resolve,
|
respond: do_resolve,
|
||||||
},
|
},
|
||||||
credentials: auth.query(headers),
|
credentials: await httpd.auth_query(headers),
|
||||||
packageOwner: packageOwner,
|
packageOwner: packageOwner,
|
||||||
packageName: packageName,
|
packageName: packageName,
|
||||||
}
|
}
|
||||||
@ -992,34 +939,6 @@ async function useAppHandler(
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
async function blobHandler(request, response, blobId, uri) {
|
async function blobHandler(request, response, blobId, uri) {
|
||||||
// TODO(tasiaiso): break this down ?
|
|
||||||
for (let i in k_static_files) {
|
|
||||||
if (uri === k_static_files[i].uri && k_static_files[i].path) {
|
|
||||||
let stat = await File.stat('core/' + k_static_files[i].path);
|
|
||||||
let id = `${stat.mtime}_${stat.size}`;
|
|
||||||
|
|
||||||
if (request.headers['if-none-match'] === '"' + id + '"') {
|
|
||||||
response.writeHead(304, {'Content-Length': '0'});
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
let data = await File.readFile('core/' + k_static_files[i].path);
|
|
||||||
response.writeHead(
|
|
||||||
200,
|
|
||||||
Object.assign(
|
|
||||||
{
|
|
||||||
'Content-Type': k_static_files[i].type,
|
|
||||||
'Content-Length': data.byteLength,
|
|
||||||
etag: '"' + id + '"',
|
|
||||||
},
|
|
||||||
k_static_files[i].headers || {}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
response.end(data);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!uri) {
|
if (!uri) {
|
||||||
response.writeHead(303, {
|
response.writeHead(303, {
|
||||||
Location:
|
Location:
|
||||||
@ -1052,7 +971,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
response.writeHead(304, headers);
|
response.writeHead(304, headers);
|
||||||
response.end();
|
response.end();
|
||||||
} else {
|
} else {
|
||||||
data = await getBlobOrContent(id);
|
data = await ssb.blobGet(id);
|
||||||
if (match[3]) {
|
if (match[3]) {
|
||||||
let appObject = JSON.parse(data);
|
let appObject = JSON.parse(data);
|
||||||
data = appObject.files[match[3]];
|
data = appObject.files[match[3]];
|
||||||
@ -1084,7 +1003,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
response.writeHead(304, headers);
|
response.writeHead(304, headers);
|
||||||
response.end();
|
response.end();
|
||||||
} else {
|
} else {
|
||||||
data = await getBlobOrContent(blobId);
|
data = await ssb.blobGet(blobId);
|
||||||
sendData(
|
sendData(
|
||||||
response,
|
response,
|
||||||
data,
|
data,
|
||||||
@ -1098,7 +1017,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
if ((match = /^\/\~(\w+)\/(\w+)$/.exec(blobId))) {
|
if ((match = /^\/\~(\w+)\/(\w+)$/.exec(blobId))) {
|
||||||
let user = match[1];
|
let user = match[1];
|
||||||
let appName = match[2];
|
let appName = match[2];
|
||||||
let credentials = auth.query(request.headers);
|
let credentials = await httpd.auth_query(request.headers);
|
||||||
if (
|
if (
|
||||||
credentials &&
|
credentials &&
|
||||||
credentials.session &&
|
credentials.session &&
|
||||||
@ -1108,7 +1027,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
let database = new Database(user);
|
let database = new Database(user);
|
||||||
|
|
||||||
let app_object = JSON.parse(utf8Decode(request.body));
|
let app_object = JSON.parse(utf8Decode(request.body));
|
||||||
let previous_id = database.get('path:' + appName);
|
let previous_id = await database.get('path:' + appName);
|
||||||
if (previous_id) {
|
if (previous_id) {
|
||||||
try {
|
try {
|
||||||
let previous_object = JSON.parse(
|
let previous_object = JSON.parse(
|
||||||
@ -1129,7 +1048,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
let newBlobId = await ssb.blobStore(JSON.stringify(app_object));
|
let newBlobId = await ssb.blobStore(JSON.stringify(app_object));
|
||||||
|
|
||||||
let apps = new Set();
|
let apps = new Set();
|
||||||
let apps_original = database.get('apps');
|
let apps_original = await database.get('apps');
|
||||||
try {
|
try {
|
||||||
apps = new Set(JSON.parse(apps_original));
|
apps = new Set(JSON.parse(apps_original));
|
||||||
} catch {}
|
} catch {}
|
||||||
@ -1138,9 +1057,9 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
}
|
}
|
||||||
apps = JSON.stringify([...apps].sort());
|
apps = JSON.stringify([...apps].sort());
|
||||||
if (apps != apps_original) {
|
if (apps != apps_original) {
|
||||||
database.set('apps', apps);
|
await database.set('apps', apps);
|
||||||
}
|
}
|
||||||
database.set('path:' + appName, newBlobId);
|
await database.set('path:' + appName, newBlobId);
|
||||||
response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
|
response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
|
||||||
response.end('/' + newBlobId);
|
response.end('/' + newBlobId);
|
||||||
} else {
|
} else {
|
||||||
@ -1161,7 +1080,7 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
if ((match = /^\/\~(\w+)\/(\w+)$/.exec(blobId))) {
|
if ((match = /^\/\~(\w+)\/(\w+)$/.exec(blobId))) {
|
||||||
let user = match[1];
|
let user = match[1];
|
||||||
let appName = match[2];
|
let appName = match[2];
|
||||||
let credentials = auth.query(request.headers);
|
let credentials = await httpd.auth_query(request.headers);
|
||||||
if (
|
if (
|
||||||
credentials &&
|
credentials &&
|
||||||
credentials.session &&
|
credentials.session &&
|
||||||
@ -1171,10 +1090,10 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
let database = new Database(user);
|
let database = new Database(user);
|
||||||
let apps = new Set();
|
let apps = new Set();
|
||||||
try {
|
try {
|
||||||
apps = new Set(JSON.parse(database.get('apps')));
|
apps = new Set(JSON.parse(await database.get('apps')));
|
||||||
} catch {}
|
} catch {}
|
||||||
if (apps.delete(appName)) {
|
if (apps.delete(appName)) {
|
||||||
database.set('apps', JSON.stringify([...apps].sort()));
|
await database.set('apps', JSON.stringify([...apps].sort()));
|
||||||
}
|
}
|
||||||
database.remove('path:' + appName);
|
database.remove('path:' + appName);
|
||||||
} else {
|
} else {
|
||||||
@ -1200,9 +1119,9 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
app_id = await db.get('path:' + match[2]);
|
app_id = await db.get('path:' + match[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let app_object = JSON.parse(utf8Decode(await getBlobOrContent(app_id)));
|
let app_object = JSON.parse(utf8Decode(await ssb.blobGet(app_id)));
|
||||||
id = app_object.files[uri.substring(1)];
|
id = app_object?.files[uri.substring(1)];
|
||||||
if (!id && app_object.files['handler.js']) {
|
if (!id && app_object?.files['handler.js']) {
|
||||||
let answer;
|
let answer;
|
||||||
try {
|
try {
|
||||||
answer = await useAppHandler(
|
answer = await useAppHandler(
|
||||||
@ -1256,8 +1175,10 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
'Access-Control-Allow-Origin': '*',
|
'Access-Control-Allow-Origin': '*',
|
||||||
'Content-Security-Policy': k_content_security_policy,
|
'Content-Security-Policy': k_content_security_policy,
|
||||||
};
|
};
|
||||||
data = await getBlobOrContent(id);
|
data = await ssb.blobGet(id);
|
||||||
let type = guessTypeFromName(uri) || guessTypeFromMagicBytes(data);
|
let type =
|
||||||
|
httpd.mime_type_from_extension(uri) ||
|
||||||
|
httpd.mime_type_from_magic_bytes(data);
|
||||||
sendData(response, data, type, headers);
|
sendData(response, data, type, headers);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1266,6 +1187,10 @@ async function blobHandler(request, response, blobId, uri) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssb.addEventListener('message', function () {
|
||||||
|
broadcastEvent('onMessage', [...arguments]);
|
||||||
|
});
|
||||||
|
|
||||||
ssb.addEventListener('broadcasts', function () {
|
ssb.addEventListener('broadcasts', function () {
|
||||||
broadcastEvent('onBroadcastsChanged', []);
|
broadcastEvent('onBroadcastsChanged', []);
|
||||||
});
|
});
|
||||||
@ -1280,7 +1205,7 @@ ssb.addEventListener('connections', function () {
|
|||||||
async function loadSettings() {
|
async function loadSettings() {
|
||||||
let data = {};
|
let data = {};
|
||||||
try {
|
try {
|
||||||
let settings = new Database('core').get('settings');
|
let settings = await new Database('core').get('settings');
|
||||||
if (settings) {
|
if (settings) {
|
||||||
data = JSON.parse(settings);
|
data = JSON.parse(settings);
|
||||||
}
|
}
|
||||||
@ -1300,7 +1225,7 @@ async function loadSettings() {
|
|||||||
*/
|
*/
|
||||||
function sendStats() {
|
function sendStats() {
|
||||||
let apps = Object.values(gProcesses)
|
let apps = Object.values(gProcesses)
|
||||||
.filter((process) => process.app && process.stats)
|
.filter((process) => process.app)
|
||||||
.map((process) => process.app);
|
.map((process) => process.app);
|
||||||
if (apps.length) {
|
if (apps.length) {
|
||||||
let stats = getStats();
|
let stats = getStats();
|
||||||
@ -1313,19 +1238,6 @@ function sendStats() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODOC
|
|
||||||
* @param {*} process
|
|
||||||
* @param {*} enabled
|
|
||||||
*/
|
|
||||||
function enableStats(process, enabled) {
|
|
||||||
process.stats = enabled;
|
|
||||||
if (!gStatsTimer) {
|
|
||||||
gStatsTimer = true;
|
|
||||||
sendStats();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODOC
|
* TODOC
|
||||||
*/
|
*/
|
||||||
@ -1334,39 +1246,10 @@ loadSettings()
|
|||||||
if (tildefriends.https_port && gGlobalSettings.http_redirect) {
|
if (tildefriends.https_port && gGlobalSettings.http_redirect) {
|
||||||
httpd.set_http_redirect(gGlobalSettings.http_redirect);
|
httpd.set_http_redirect(gGlobalSettings.http_redirect);
|
||||||
}
|
}
|
||||||
httpd.all('/login', auth.handler);
|
|
||||||
httpd.all('/login/logout', auth.handler);
|
|
||||||
httpd.all('/app/socket', app.socket);
|
httpd.all('/app/socket', app.socket);
|
||||||
httpd.all('', function default_http_handler(request, response) {
|
httpd.all('', function default_http_handler(request, response) {
|
||||||
let match;
|
let match;
|
||||||
if (request.uri === '/' || request.uri === '') {
|
if ((match = /^(\/~[^\/]+\/[^\/]+)(\/?.*)$/.exec(request.uri))) {
|
||||||
let host = request.headers['x-forwarded-host'] ?? request.headers.host;
|
|
||||||
try {
|
|
||||||
for (let line of (gGlobalSettings.index_map || '').split('\n')) {
|
|
||||||
let parts = line.split('=');
|
|
||||||
if (parts.length == 2 && host.match(new RegExp(parts[0], 'i'))) {
|
|
||||||
response.writeHead(303, {
|
|
||||||
Location:
|
|
||||||
(request.client.tls ? 'https://' : 'http://') +
|
|
||||||
host +
|
|
||||||
parts[1],
|
|
||||||
'Content-Length': '0',
|
|
||||||
});
|
|
||||||
return response.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
response.writeHead(303, {
|
|
||||||
Location:
|
|
||||||
(request.client.tls ? 'https://' : 'http://') +
|
|
||||||
host +
|
|
||||||
gGlobalSettings.index,
|
|
||||||
'Content-Length': '0',
|
|
||||||
});
|
|
||||||
return response.end();
|
|
||||||
} else if ((match = /^(\/~[^\/]+\/[^\/]+)(\/?.*)$/.exec(request.uri))) {
|
|
||||||
return blobHandler(request, response, match[1], match[2]);
|
return blobHandler(request, response, match[1], match[2]);
|
||||||
} else if (
|
} else if (
|
||||||
(match = /^\/([&\%][^\.]{44}(?:\.\w+)?)(\/?.*)/.exec(request.uri))
|
(match = /^\/([&\%][^\.]{44}(?:\.\w+)?)(\/?.*)/.exec(request.uri))
|
||||||
@ -1406,8 +1289,15 @@ loadSettings()
|
|||||||
async function start_tls() {
|
async function start_tls() {
|
||||||
const kCertificatePath = 'data/httpd/certificate.pem';
|
const kCertificatePath = 'data/httpd/certificate.pem';
|
||||||
const kPrivateKeyPath = 'data/httpd/privatekey.pem';
|
const kPrivateKeyPath = 'data/httpd/privatekey.pem';
|
||||||
let privateKey = utf8Decode(await File.readFile(kPrivateKeyPath));
|
let privateKey;
|
||||||
let certificate = utf8Decode(await File.readFile(kCertificatePath));
|
let certificate;
|
||||||
|
try {
|
||||||
|
privateKey = utf8Decode(await File.readFile(kPrivateKeyPath));
|
||||||
|
certificate = utf8Decode(await File.readFile(kCertificatePath));
|
||||||
|
} catch (e) {
|
||||||
|
print(`TLS disabled (${e.message}).`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
let context = new TlsContext();
|
let context = new TlsContext();
|
||||||
context.setPrivateKey(privateKey);
|
context.setPrivateKey(privateKey);
|
||||||
context.setCertificate(certificate);
|
context.setCertificate(certificate);
|
||||||
@ -1461,10 +1351,4 @@ function storePermission(user, packageOwner, packageName, permission, allow) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
export {gGlobalSettings as globalSettings, invoke, getSessionProcessBlob};
|
||||||
gGlobalSettings as globalSettings,
|
|
||||||
setGlobalSettings,
|
|
||||||
enableStats,
|
|
||||||
invoke,
|
|
||||||
getSessionProcessBlob,
|
|
||||||
};
|
|
||||||
|
BIN
core/favicon.png
BIN
core/favicon.png
Binary file not shown.
Before Width: | Height: | Size: 320 B |
@ -4,7 +4,7 @@
|
|||||||
<title>Tilde Friends</title>
|
<title>Tilde Friends</title>
|
||||||
<link type="text/css" rel="stylesheet" href="/static/style.css" />
|
<link type="text/css" rel="stylesheet" href="/static/style.css" />
|
||||||
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
<link type="text/css" rel="stylesheet" href="/static/w3.css" />
|
||||||
<link type="image/png" rel="shortcut icon" href="/static/favicon.png" />
|
<link type="image/svg+xml" rel="icon" href="/static/tildefriends.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<script>
|
<script>
|
||||||
function set_access_key_title(event) {
|
function set_access_key_title(event) {
|
||||||
@ -25,6 +25,17 @@
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
|
<noscript>
|
||||||
|
<div class="w3-container">
|
||||||
|
<div class="w3-panel w3-red w3-padding w3-card-4">
|
||||||
|
<h1>TildeFriends requires JavaScript.</h1>
|
||||||
|
<p>
|
||||||
|
It looks like JavaScript is disabled or unsupported. This isn't
|
||||||
|
going to work.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</noscript>
|
||||||
<tf-navigation></tf-navigation>
|
<tf-navigation></tf-navigation>
|
||||||
<div id="content" class="hbox" style="flex: 1 0; overflow: auto">
|
<div id="content" class="hbox" style="flex: 1 0; overflow: auto">
|
||||||
<div
|
<div
|
||||||
|
@ -15,22 +15,6 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:link {
|
|
||||||
color: #268bd2;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:visited {
|
|
||||||
color: #6c71c4;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #859900;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:active {
|
|
||||||
color: #2aa198;
|
|
||||||
}
|
|
||||||
|
|
||||||
#logo {
|
#logo {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
88
core/tildefriends.svg
Normal file
88
core/tildefriends.svg
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="65"
|
||||||
|
height="65"
|
||||||
|
viewBox="0 0 61 65"
|
||||||
|
fill="none"
|
||||||
|
version="1.1"
|
||||||
|
id="svg910"
|
||||||
|
sodipodi:docname="tildefriends.svg"
|
||||||
|
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs914" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview912"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="18.369231"
|
||||||
|
inkscape:cx="32.472781"
|
||||||
|
inkscape:cy="32.5"
|
||||||
|
inkscape:window-width="2256"
|
||||||
|
inkscape:window-height="1447"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg910" />
|
||||||
|
<path
|
||||||
|
style="fill:#0af;stroke-width:.712717;fill-opacity:1"
|
||||||
|
d="M6 0h49a8 8 45 0 1 8 8v49a8 8 135 0 1-8 8H6a8 8 45 0 1-8-8V8a8 8 135 0 1 8-8Z"
|
||||||
|
id="path886" />
|
||||||
|
<g
|
||||||
|
aria-label="~"
|
||||||
|
id="text890"
|
||||||
|
style="font-size:40px;line-height:1.25;fill:#000000">
|
||||||
|
<path
|
||||||
|
d="m 1.6762187,36.689095 v -4.003907 q 2.0703125,-2.34375 5.4296875,-2.34375 1.171875,0 2.4609375,0.351563 1.2890623,0.332031 3.6718753,1.347656 1.347656,0.566406 2.011718,0.742188 0.683594,0.175781 1.367188,0.175781 1.269531,0 2.617187,-0.761719 1.367188,-0.761719 2.421875,-1.914062 v 4.140625 q -1.25,1.171875 -2.539062,1.699218 -1.269531,0.527344 -2.871094,0.527344 -1.171875,0 -2.246094,-0.273437 -1.054687,-0.273438 -3.378906,-1.308594 -2.3046873,-1.035156 -3.847656,-1.035156 -1.25,0 -2.3632813,0.546875 -1.09375,0.527343 -2.734375,2.109375 z"
|
||||||
|
style="font-family:Arial;-inkscape-font-specification:'Arial, Normal'"
|
||||||
|
id="path1704" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(16.213 5.975) scale(.72923)"
|
||||||
|
id="g896">
|
||||||
|
<circle
|
||||||
|
cx="36"
|
||||||
|
cy="36"
|
||||||
|
r="23"
|
||||||
|
fill="#fcea2b"
|
||||||
|
id="circle892" />
|
||||||
|
<path
|
||||||
|
fill="#3f3f3f"
|
||||||
|
d="M45.331 38.564c3.963 0 7.178-2.862 7.178-6.389 0-1.765.448-3.53-.852-4.685-1.299-1.156-4.345-1.704-6.326-1.704-2.357 0-5.143.143-6.451 1.704-.894 1.065-.727 3.253-.727 4.685 0 3.527 3.213 6.389 7.178 6.389zM25.738 38.564c3.963 0 7.179-2.862 7.179-6.389 0-1.765.447-3.53-.852-4.685-1.3-1.156-4.345-1.704-6.327-1.704-2.356 0-5.142.143-6.451 1.704-.893 1.065-.727 3.253-.727 4.685 0 3.527 3.213 6.389 7.178 6.389z"
|
||||||
|
id="path894" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
stroke="#000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
stroke-width="2"
|
||||||
|
transform="translate(16.213 5.975) scale(.72923)"
|
||||||
|
id="g908">
|
||||||
|
<circle
|
||||||
|
cx="35.887"
|
||||||
|
cy="36.056"
|
||||||
|
r="23"
|
||||||
|
id="circle898" />
|
||||||
|
<path
|
||||||
|
d="M45.702 44.862c-6.574 3.525-14.045 3.658-19.63 0M18.883 30.464s-.953 8.55 6.86 7.918c2.62-.212 7.817-.65 7.867-8.342.005-.698-.007-1.6-.81-2.63-1.065-1.367-3.572-1.971-9.945-1.422 0 0-3.446-.1-3.972 4.476z"
|
||||||
|
id="path900" />
|
||||||
|
<path
|
||||||
|
d="m18.953 29.931-.433-3.372 3.833-.527M52.741 30.464s.953 8.55-6.86 7.918c-2.62-.212-7.817-.65-7.868-8.342-.004-.698.008-1.6.811-2.63 1.065-1.367 3.572-1.971 9.945-1.422 0 0 3.446-.1 3.972 4.476z"
|
||||||
|
id="path902" />
|
||||||
|
<path
|
||||||
|
d="M31.505 26.416s4.124 2.534 8.657 0M33.536 31.318s2.202-3.751 4.536 0M52.664 29.933l.433-3.371-3.833-.528"
|
||||||
|
id="path904" />
|
||||||
|
<path
|
||||||
|
d="M33.955 30.027s1.795-3.75 3.699 0"
|
||||||
|
id="path906" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
66
default.nix
Normal file
66
default.nix
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# How to upgrade to a newer version
|
||||||
|
# - Comment `src.hash`
|
||||||
|
# - Change `version`
|
||||||
|
# - Run `$ nix build`
|
||||||
|
# This will fetch the source code
|
||||||
|
# Since `hash` is not provided, nix will stop building and throw an error:
|
||||||
|
#
|
||||||
|
# error: hash mismatch in fixed-output derivation '/nix/store/fghi3ljs6fhz8pwm3dh73j5fwjpq5wbz-source.drv':
|
||||||
|
# specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
||||||
|
# got: sha256-+uthA1w8CmZfW+WOK9wYGl2fUl/k10ufOc8W+Pwa9iQ=
|
||||||
|
# error: 1 dependencies of derivation '/nix/store/imcwsw5r74vkd8r0qa2k7cys2xfgraaz-tildefriends-0.0.18.drv' failed to build
|
||||||
|
#
|
||||||
|
# - Change `src.hash` to the new one, ie `sha256-+uthA1w8CmZfW+WOK9wYGl2fUl/k10ufOc8W+Pwa9iQ=`
|
||||||
|
# - Uncomment `src.hash`
|
||||||
|
# - Build again, this time it should work.
|
||||||
|
# - Check the release notes, if there's a new dependency or a change to `GNUMakefile`, this file might need to be changed too.
|
||||||
|
# For more details, contact tasiaiso @ https://tilde.club/~tasiaiso/
|
||||||
|
{
|
||||||
|
pkgs ? import <nixpkgs> {},
|
||||||
|
lib ? import <nixpkgs/lib>,
|
||||||
|
}:
|
||||||
|
pkgs.stdenv.mkDerivation rec {
|
||||||
|
pname = "tildefriends";
|
||||||
|
version = "0.0.22";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitea {
|
||||||
|
domain = "dev.tildefriends.net";
|
||||||
|
owner = "cory";
|
||||||
|
repo = "tildefriends";
|
||||||
|
rev = "v${version}";
|
||||||
|
hash = "sha256-Su+y++zVXmYNbwfhCP6w5e36oxW5fkURPFzFLjbyFEI=";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
glibc
|
||||||
|
gnumake
|
||||||
|
openssl
|
||||||
|
which
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
glibc
|
||||||
|
openssl
|
||||||
|
which
|
||||||
|
];
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
make -j $NIX_BUILD_CORES release
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp -r out/release/tildefriends $out/bin
|
||||||
|
'';
|
||||||
|
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
meta = with pkgs; {
|
||||||
|
homepage = "https://tildefriends.net";
|
||||||
|
description = "Make apps and friends from the comfort of your web browser.";
|
||||||
|
mainProgram = "tildefriends";
|
||||||
|
license = with lib.licenses; [mit];
|
||||||
|
platforms = lib.platforms.all;
|
||||||
|
};
|
||||||
|
}
|
1
deps/c-ares
vendored
Submodule
1
deps/c-ares
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 27b98d96eff6122fb981e338bddef3d6a57d8d44
|
177
deps/c-ares_config/ares_build.h
vendored
Normal file
177
deps/c-ares_config/ares_build.h
vendored
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
#ifndef __CARES_BUILD_H
|
||||||
|
#define __CARES_BUILD_H
|
||||||
|
/*
|
||||||
|
* Copyright (C) The c-ares project and its contributors
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CARES_STATICLIB
|
||||||
|
|
||||||
|
#ifdef CARES_HAVE_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CARES_HAVE_SYS_SOCKET_H
|
||||||
|
# include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CARES_HAVE_SYS_SELECT_H
|
||||||
|
# include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#undef HAVE_REGISTERWAITFORSINGLEOBJECT
|
||||||
|
#define CARES_HAVE_WINSOCK2_H
|
||||||
|
#define CARES_HAVE_WINDOWS_H
|
||||||
|
#define CARES_HAVE_WS2TCPIP_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#define CARES_TYPEOF_ARES_SOCKLEN_T int
|
||||||
|
#define CARES_TYPEOF_ARES_SSIZE_T ssize_t
|
||||||
|
#else
|
||||||
|
#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
|
||||||
|
#define CARES_TYPEOF_ARES_SSIZE_T ssize_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__HAIKU__)
|
||||||
|
#define GETSERVBYNAME_R_ARGS 6
|
||||||
|
#define GETSERVBYPORT_R_ARGS 6
|
||||||
|
#define HAVE_GETSERVBYNAME_R 1
|
||||||
|
#define HAVE_GETSERVBYPORT_R 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) && !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__HAIKU__)
|
||||||
|
#define HAVE_PIPE2 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OpenBSD__) || defined(__HAIKU__)
|
||||||
|
#define GETSERVBYNAME_R_ARGS 4
|
||||||
|
#define GETSERVBYPORT_R_ARGS 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) && !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__HAIKU__)
|
||||||
|
#define HAVE_MALLOC_H 1
|
||||||
|
#define HAVE_EPOLL 1
|
||||||
|
#define HAVE_SYS_EPOLL_H 1
|
||||||
|
#define HAVE_SYS_RANDOM_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__WIN32)
|
||||||
|
#undef AC_APPLE_UNIVERSAL_BUILD
|
||||||
|
#undef ETC_INET
|
||||||
|
#define GETHOSTNAME_TYPE_ARG2 size_t
|
||||||
|
#define GETNAMEINFO_QUAL_ARG1
|
||||||
|
#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
|
||||||
|
#define GETNAMEINFO_TYPE_ARG2 socklen_t
|
||||||
|
#define GETNAMEINFO_TYPE_ARG46 socklen_t
|
||||||
|
#define GETNAMEINFO_TYPE_ARG7 int
|
||||||
|
#define HAVE_AF_INET6 1
|
||||||
|
#define HAVE_ARPA_INET_H 1
|
||||||
|
#define HAVE_ARPA_NAMESER_COMPAT_H 1
|
||||||
|
#define HAVE_ARPA_NAMESER_H 1
|
||||||
|
#define HAVE_ASSERT_H 1
|
||||||
|
#define HAVE_CLOCK_GETTIME_MONOTONIC 1
|
||||||
|
#define HAVE_CONNECT 1
|
||||||
|
#define HAVE_DLFCN_H 1
|
||||||
|
#define HAVE_ERRNO_H 1
|
||||||
|
#define HAVE_POLL_H 1
|
||||||
|
#define HAVE_POLL 1
|
||||||
|
#define HAVE_PIPE 1
|
||||||
|
#define HAVE_FCNTL 1
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
#define HAVE_FCNTL_O_NONBLOCK 1
|
||||||
|
#define HAVE_FREEADDRINFO 1
|
||||||
|
#define HAVE_GETADDRINFO 1
|
||||||
|
#define HAVE_GETENV 1
|
||||||
|
#define HAVE_GETHOSTNAME 1
|
||||||
|
#define HAVE_GETNAMEINFO 1
|
||||||
|
#if !defined(__HAIKU__)
|
||||||
|
#define HAVE_GETRANDOM 1
|
||||||
|
#endif
|
||||||
|
#define HAVE_GETTIMEOFDAY 1
|
||||||
|
#define HAVE_IF_INDEXTONAME 1
|
||||||
|
#define HAVE_IF_NAMETOINDEX 1
|
||||||
|
#define HAVE_INET_NTOP 1
|
||||||
|
#define HAVE_INET_PTON 1
|
||||||
|
#define HAVE_INTTYPES_H 1
|
||||||
|
#define HAVE_IOCTL 1
|
||||||
|
#define HAVE_IOCTL_FIONBIO 1
|
||||||
|
#define HAVE_IOCTL_SIOCGIFADDR 1
|
||||||
|
#define HAVE_LIMITS_H 1
|
||||||
|
#define HAVE_LONGLONG 1
|
||||||
|
#define HAVE_MEMORY_H 1
|
||||||
|
#define HAVE_MSG_NOSIGNAL 1
|
||||||
|
#define HAVE_NETDB_H 1
|
||||||
|
#define HAVE_NETINET_IN_H 1
|
||||||
|
#define HAVE_NETINET_TCP_H 1
|
||||||
|
#define HAVE_NET_IF_H 1
|
||||||
|
#define HAVE_PF_INET6 1
|
||||||
|
#define HAVE_RECV 1
|
||||||
|
#define HAVE_RECVFROM 1
|
||||||
|
#define HAVE_SEND 1
|
||||||
|
#define HAVE_SETSOCKOPT 1
|
||||||
|
#define HAVE_SIGNAL_H 1
|
||||||
|
#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1
|
||||||
|
#define HAVE_SOCKET 1
|
||||||
|
#define HAVE_STDBOOL_H 1
|
||||||
|
#define HAVE_STDINT_H 1
|
||||||
|
#define HAVE_STDLIB_H 1
|
||||||
|
#define HAVE_STRCASECMP 1
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
#define HAVE_STRINGS_H 1
|
||||||
|
#define HAVE_STRING_H 1
|
||||||
|
#define HAVE_STRNCASECMP 1
|
||||||
|
#define HAVE_STRUCT_ADDRINFO 1
|
||||||
|
#define HAVE_STRUCT_IN6_ADDR 1
|
||||||
|
#define HAVE_STRUCT_SOCKADDR_IN6 1
|
||||||
|
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||||
|
#define HAVE_STRUCT_TIMEVAL 1
|
||||||
|
#define HAVE_SYS_IOCTL_H 1
|
||||||
|
#define HAVE_SYS_PARAM_H 1
|
||||||
|
#define HAVE_SYS_SELECT_H 1
|
||||||
|
#define HAVE_SYS_SOCKET_H 1
|
||||||
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
#define HAVE_SYS_TIME_H 1
|
||||||
|
#define HAVE_SYS_TYPES_H 1
|
||||||
|
#define HAVE_SYS_UIO_H 1
|
||||||
|
#define HAVE_TIME_H 1
|
||||||
|
#define HAVE_IFADDRS_H 1
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
#define HAVE_WRITEV 1
|
||||||
|
#if defined(__ANDROID__) || defined(__APPLE__) || defined(__OpenBSD__)
|
||||||
|
#define HAVE_ARC4RANDOM_BUF 1
|
||||||
|
#else
|
||||||
|
#undef HAVE_ARC4RANDOM_BUF
|
||||||
|
#endif
|
||||||
|
#define HAVE_GETIFADDRS 1
|
||||||
|
#define HAVE_STAT 1
|
||||||
|
#define CARES_RANDOM_FILE "/dev/urandom"
|
||||||
|
#define RECVFROM_QUAL_ARG5
|
||||||
|
#define RECVFROM_TYPE_ARG1 int
|
||||||
|
#define RECVFROM_TYPE_ARG2 void *
|
||||||
|
#define RECVFROM_TYPE_ARG2_IS_VOID 0
|
||||||
|
#define RECVFROM_TYPE_ARG3 size_t
|
||||||
|
#define RECVFROM_TYPE_ARG4 int
|
||||||
|
#define RECVFROM_TYPE_ARG5 struct sockaddr *
|
||||||
|
#define RECVFROM_TYPE_ARG5_IS_VOID 0
|
||||||
|
#define RECVFROM_TYPE_ARG6 socklen_t *
|
||||||
|
#define RECVFROM_TYPE_ARG6_IS_VOID 0
|
||||||
|
#define RECVFROM_TYPE_RETV ssize_t
|
||||||
|
#define RECV_TYPE_ARG1 int
|
||||||
|
#define RECV_TYPE_ARG2 void *
|
||||||
|
#define RECV_TYPE_ARG3 size_t
|
||||||
|
#define RECV_TYPE_ARG4 int
|
||||||
|
#define RECV_TYPE_RETV ssize_t
|
||||||
|
#define SEND_TYPE_ARG1 int
|
||||||
|
#define SEND_TYPE_ARG2 const void *
|
||||||
|
#define SEND_TYPE_ARG3 size_t
|
||||||
|
#define SEND_TYPE_ARG4 int
|
||||||
|
#define SEND_TYPE_RETV ssize_t
|
||||||
|
#undef USE_BLOCKING_SOCKETS
|
||||||
|
#undef WIN32_LEAN_AND_MEAN
|
||||||
|
#define HAVE_PTHREAD_H 1
|
||||||
|
#define CARES_THREADS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CARES_BUILD_H */
|
2
deps/codemirror/cm6.js
vendored
2
deps/codemirror/cm6.js
vendored
File diff suppressed because one or more lines are too long
374
deps/codemirror_src/package-lock.json
generated
vendored
374
deps/codemirror_src/package-lock.json
generated
vendored
@ -19,9 +19,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/autocomplete": {
|
"node_modules/@codemirror/autocomplete": {
|
||||||
"version": "6.15.0",
|
"version": "6.18.1",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.1.tgz",
|
||||||
"integrity": "sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==",
|
"integrity": "sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/language": "^6.0.0",
|
"@codemirror/language": "^6.0.0",
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
@ -36,32 +37,35 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/commands": {
|
"node_modules/@codemirror/commands": {
|
||||||
"version": "6.3.3",
|
"version": "6.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.2.tgz",
|
||||||
"integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==",
|
"integrity": "sha512-Fq7eWOl1Rcbrfn6jD8FPCj9Auaxdm5nIK5RYOeW7ughnd/rY5AmPg6b+CfsG39ZHdwiwe8lde3q8uR7CF5S0yQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/language": "^6.0.0",
|
"@codemirror/language": "^6.0.0",
|
||||||
"@codemirror/state": "^6.4.0",
|
"@codemirror/state": "^6.4.0",
|
||||||
"@codemirror/view": "^6.0.0",
|
"@codemirror/view": "^6.27.0",
|
||||||
"@lezer/common": "^1.1.0"
|
"@lezer/common": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/lang-css": {
|
"node_modules/@codemirror/lang-css": {
|
||||||
"version": "6.2.1",
|
"version": "6.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.0.tgz",
|
||||||
"integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==",
|
"integrity": "sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/autocomplete": "^6.0.0",
|
"@codemirror/autocomplete": "^6.0.0",
|
||||||
"@codemirror/language": "^6.0.0",
|
"@codemirror/language": "^6.0.0",
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
"@lezer/common": "^1.0.2",
|
"@lezer/common": "^1.0.2",
|
||||||
"@lezer/css": "^1.0.0"
|
"@lezer/css": "^1.1.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/lang-html": {
|
"node_modules/@codemirror/lang-html": {
|
||||||
"version": "6.4.8",
|
"version": "6.4.9",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.8.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz",
|
||||||
"integrity": "sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==",
|
"integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/autocomplete": "^6.0.0",
|
"@codemirror/autocomplete": "^6.0.0",
|
||||||
"@codemirror/lang-css": "^6.0.0",
|
"@codemirror/lang-css": "^6.0.0",
|
||||||
@ -78,6 +82,7 @@
|
|||||||
"version": "6.2.2",
|
"version": "6.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz",
|
||||||
"integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==",
|
"integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/autocomplete": "^6.0.0",
|
"@codemirror/autocomplete": "^6.0.0",
|
||||||
"@codemirror/language": "^6.6.0",
|
"@codemirror/language": "^6.6.0",
|
||||||
@ -92,15 +97,17 @@
|
|||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz",
|
||||||
"integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==",
|
"integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/language": "^6.0.0",
|
"@codemirror/language": "^6.0.0",
|
||||||
"@lezer/json": "^1.0.0"
|
"@lezer/json": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/language": {
|
"node_modules/@codemirror/language": {
|
||||||
"version": "6.10.1",
|
"version": "6.10.2",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
|
||||||
"integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==",
|
"integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
"@codemirror/view": "^6.23.0",
|
"@codemirror/view": "^6.23.0",
|
||||||
@ -111,9 +118,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/lint": {
|
"node_modules/@codemirror/lint": {
|
||||||
"version": "6.5.0",
|
"version": "6.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz",
|
||||||
"integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==",
|
"integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
"@codemirror/view": "^6.0.0",
|
"@codemirror/view": "^6.0.0",
|
||||||
@ -124,6 +132,7 @@
|
|||||||
"version": "6.5.6",
|
"version": "6.5.6",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz",
|
||||||
"integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==",
|
"integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
"@codemirror/view": "^6.0.0",
|
"@codemirror/view": "^6.0.0",
|
||||||
@ -133,12 +142,14 @@
|
|||||||
"node_modules/@codemirror/state": {
|
"node_modules/@codemirror/state": {
|
||||||
"version": "6.4.1",
|
"version": "6.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
|
||||||
"integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A=="
|
"integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/theme-one-dark": {
|
"node_modules/@codemirror/theme-one-dark": {
|
||||||
"version": "6.1.2",
|
"version": "6.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz",
|
||||||
"integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==",
|
"integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/language": "^6.0.0",
|
"@codemirror/language": "^6.0.0",
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
@ -147,9 +158,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/view": {
|
"node_modules/@codemirror/view": {
|
||||||
"version": "6.25.1",
|
"version": "6.33.0",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.25.1.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz",
|
||||||
"integrity": "sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==",
|
"integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/state": "^6.4.0",
|
"@codemirror/state": "^6.4.0",
|
||||||
"style-mod": "^4.1.0",
|
"style-mod": "^4.1.0",
|
||||||
@ -161,6 +173,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
|
||||||
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
|
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/set-array": "^1.2.1",
|
"@jridgewell/set-array": "^1.2.1",
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.10",
|
"@jridgewell/sourcemap-codec": "^1.4.10",
|
||||||
@ -175,6 +188,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
}
|
}
|
||||||
@ -184,6 +198,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
|
||||||
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
|
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
}
|
}
|
||||||
@ -193,22 +208,25 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
|
||||||
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
|
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
"@jridgewell/trace-mapping": "^0.3.25"
|
"@jridgewell/trace-mapping": "^0.3.25"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/sourcemap-codec": {
|
"node_modules/@jridgewell/sourcemap-codec": {
|
||||||
"version": "1.4.15",
|
"version": "1.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||||
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
|
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/trace-mapping": {
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.25",
|
"version": "0.3.25",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
|
||||||
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
|
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/resolve-uri": "^3.1.0",
|
"@jridgewell/resolve-uri": "^3.1.0",
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
@ -217,12 +235,14 @@
|
|||||||
"node_modules/@lezer/common": {
|
"node_modules/@lezer/common": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
|
||||||
"integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ=="
|
"integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@lezer/css": {
|
"node_modules/@lezer/css": {
|
||||||
"version": "1.1.8",
|
"version": "1.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.9.tgz",
|
||||||
"integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==",
|
"integrity": "sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.2.0",
|
"@lezer/common": "^1.2.0",
|
||||||
"@lezer/highlight": "^1.0.0",
|
"@lezer/highlight": "^1.0.0",
|
||||||
@ -230,17 +250,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@lezer/highlight": {
|
"node_modules/@lezer/highlight": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz",
|
||||||
"integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
|
"integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.0.0"
|
"@lezer/common": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@lezer/html": {
|
"node_modules/@lezer/html": {
|
||||||
"version": "1.3.9",
|
"version": "1.3.10",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.9.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz",
|
||||||
"integrity": "sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==",
|
"integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.2.0",
|
"@lezer/common": "^1.2.0",
|
||||||
"@lezer/highlight": "^1.0.0",
|
"@lezer/highlight": "^1.0.0",
|
||||||
@ -248,9 +270,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@lezer/javascript": {
|
"node_modules/@lezer/javascript": {
|
||||||
"version": "1.4.13",
|
"version": "1.4.18",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.13.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.18.tgz",
|
||||||
"integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==",
|
"integrity": "sha512-Y8BeHOt4LtcxJgXwadtfSeWPrh0XzklcCHnCVT+vOsxqH4gWmunP2ykX+VVOlM/dusyVyiNfG3lv0f10UK+mgA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.2.0",
|
"@lezer/common": "^1.2.0",
|
||||||
"@lezer/highlight": "^1.1.3",
|
"@lezer/highlight": "^1.1.3",
|
||||||
@ -261,6 +284,7 @@
|
|||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.2.tgz",
|
||||||
"integrity": "sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==",
|
"integrity": "sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.2.0",
|
"@lezer/common": "^1.2.0",
|
||||||
"@lezer/highlight": "^1.0.0",
|
"@lezer/highlight": "^1.0.0",
|
||||||
@ -268,9 +292,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@lezer/lr": {
|
"node_modules/@lezer/lr": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
|
||||||
"integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==",
|
"integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/common": "^1.0.0"
|
"@lezer/common": "^1.0.0"
|
||||||
}
|
}
|
||||||
@ -279,6 +304,7 @@
|
|||||||
"version": "15.2.3",
|
"version": "15.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
|
||||||
"integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
|
"integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rollup/pluginutils": "^5.0.1",
|
"@rollup/pluginutils": "^5.0.1",
|
||||||
"@types/resolve": "1.20.2",
|
"@types/resolve": "1.20.2",
|
||||||
@ -304,6 +330,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
|
||||||
"integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
|
"integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"serialize-javascript": "^6.0.1",
|
"serialize-javascript": "^6.0.1",
|
||||||
"smob": "^1.0.0",
|
"smob": "^1.0.0",
|
||||||
@ -325,6 +352,7 @@
|
|||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
|
||||||
"integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
|
"integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "^1.0.0",
|
"@types/estree": "^1.0.0",
|
||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
@ -343,176 +371,231 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz",
|
||||||
"integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
|
"integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"android"
|
"android"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz",
|
||||||
"integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
|
"integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"android"
|
"android"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz",
|
||||||
"integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
|
"integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz",
|
||||||
"integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
|
"integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz",
|
||||||
"integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
|
"integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||||
|
"version": "4.21.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz",
|
||||||
|
"integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz",
|
||||||
"integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
|
"integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz",
|
||||||
"integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
|
"integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||||
|
"version": "4.21.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz",
|
||||||
|
"integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz",
|
||||||
"integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
|
"integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||||
|
"version": "4.21.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz",
|
||||||
|
"integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz",
|
||||||
"integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
|
"integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz",
|
||||||
"integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
|
"integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz",
|
||||||
"integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
|
"integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz",
|
||||||
"integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
|
"integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz",
|
||||||
"integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
|
"integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
|
||||||
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
|
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/resolve": {
|
"node_modules/@types/resolve": {
|
||||||
"version": "1.20.2",
|
"version": "1.20.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
||||||
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
|
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "8.11.3",
|
"version": "8.12.1",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
|
||||||
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
|
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"acorn": "bin/acorn"
|
"acorn": "bin/acorn"
|
||||||
},
|
},
|
||||||
@ -524,12 +607,14 @@
|
|||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/builtin-modules": {
|
"node_modules/builtin-modules": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
|
||||||
"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
|
"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
},
|
},
|
||||||
@ -541,6 +626,7 @@
|
|||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
|
||||||
"integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
|
"integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/autocomplete": "^6.0.0",
|
"@codemirror/autocomplete": "^6.0.0",
|
||||||
"@codemirror/commands": "^6.0.0",
|
"@codemirror/commands": "^6.0.0",
|
||||||
@ -555,17 +641,20 @@
|
|||||||
"version": "2.20.3",
|
"version": "2.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/crelt": {
|
"node_modules/crelt": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
|
||||||
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
|
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/deepmerge": {
|
"node_modules/deepmerge": {
|
||||||
"version": "4.3.1",
|
"version": "4.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
|
||||||
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
|
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@ -573,13 +662,15 @@
|
|||||||
"node_modules/estree-walker": {
|
"node_modules/estree-walker": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
|
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/fsevents": {
|
"node_modules/fsevents": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
@ -592,6 +683,7 @@
|
|||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||||
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
@ -600,6 +692,7 @@
|
|||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.2"
|
"function-bind": "^1.1.2"
|
||||||
},
|
},
|
||||||
@ -611,6 +704,7 @@
|
|||||||
"version": "3.2.1",
|
"version": "3.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
|
||||||
"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
|
"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"builtin-modules": "^3.3.0"
|
"builtin-modules": "^3.3.0"
|
||||||
},
|
},
|
||||||
@ -622,11 +716,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.13.1",
|
"version": "2.15.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
|
||||||
"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
|
"integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"hasown": "^2.0.0"
|
"hasown": "^2.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@ -635,17 +733,20 @@
|
|||||||
"node_modules/is-module": {
|
"node_modules/is-module": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
|
||||||
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
|
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/path-parse": {
|
"node_modules/path-parse": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/picomatch": {
|
"node_modules/picomatch": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
||||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.6"
|
"node": ">=8.6"
|
||||||
},
|
},
|
||||||
@ -658,6 +759,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
|
||||||
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
|
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "^5.1.0"
|
"safe-buffer": "^5.1.0"
|
||||||
}
|
}
|
||||||
@ -666,6 +768,7 @@
|
|||||||
"version": "1.22.8",
|
"version": "1.22.8",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
|
||||||
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
|
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-core-module": "^2.13.0",
|
"is-core-module": "^2.13.0",
|
||||||
"path-parse": "^1.0.7",
|
"path-parse": "^1.0.7",
|
||||||
@ -679,9 +782,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.13.0",
|
"version": "4.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz",
|
||||||
"integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
|
"integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.5"
|
"@types/estree": "1.0.5"
|
||||||
},
|
},
|
||||||
@ -693,22 +797,31 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.13.0",
|
"@rollup/rollup-android-arm-eabi": "4.21.3",
|
||||||
"@rollup/rollup-android-arm64": "4.13.0",
|
"@rollup/rollup-android-arm64": "4.21.3",
|
||||||
"@rollup/rollup-darwin-arm64": "4.13.0",
|
"@rollup/rollup-darwin-arm64": "4.21.3",
|
||||||
"@rollup/rollup-darwin-x64": "4.13.0",
|
"@rollup/rollup-darwin-x64": "4.21.3",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.21.3",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.13.0",
|
"@rollup/rollup-linux-arm-musleabihf": "4.21.3",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.13.0",
|
"@rollup/rollup-linux-arm64-gnu": "4.21.3",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.13.0",
|
"@rollup/rollup-linux-arm64-musl": "4.21.3",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.13.0",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.21.3",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.13.0",
|
"@rollup/rollup-linux-riscv64-gnu": "4.21.3",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.13.0",
|
"@rollup/rollup-linux-s390x-gnu": "4.21.3",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.13.0",
|
"@rollup/rollup-linux-x64-gnu": "4.21.3",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.13.0",
|
"@rollup/rollup-linux-x64-musl": "4.21.3",
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": "4.21.3",
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": "4.21.3",
|
||||||
|
"@rollup/rollup-win32-x64-msvc": "4.21.3",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rollup/node_modules/@types/estree": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||||
|
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/safe-buffer": {
|
"node_modules/safe-buffer": {
|
||||||
"version": "5.2.1",
|
"version": "5.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||||
@ -727,28 +840,32 @@
|
|||||||
"type": "consulting",
|
"type": "consulting",
|
||||||
"url": "https://feross.org/support"
|
"url": "https://feross.org/support"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/serialize-javascript": {
|
"node_modules/serialize-javascript": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
|
||||||
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
|
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"randombytes": "^2.1.0"
|
"randombytes": "^2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/smob": {
|
"node_modules/smob": {
|
||||||
"version": "1.4.1",
|
"version": "1.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
|
||||||
"integrity": "sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==",
|
"integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/source-map": {
|
"node_modules/source-map": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@ -758,6 +875,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||||
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"buffer-from": "^1.0.0",
|
"buffer-from": "^1.0.0",
|
||||||
"source-map": "^0.6.0"
|
"source-map": "^0.6.0"
|
||||||
@ -766,12 +884,14 @@
|
|||||||
"node_modules/style-mod": {
|
"node_modules/style-mod": {
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
|
||||||
"integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
|
"integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/supports-preserve-symlinks-flag": {
|
"node_modules/supports-preserve-symlinks-flag": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
@ -780,10 +900,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.29.1",
|
"version": "5.33.0",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz",
|
||||||
"integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==",
|
"integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.8.2",
|
"acorn": "^8.8.2",
|
||||||
@ -800,7 +921,8 @@
|
|||||||
"node_modules/w3c-keyname": {
|
"node_modules/w3c-keyname": {
|
||||||
"version": "2.2.8",
|
"version": "2.2.8",
|
||||||
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
|
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
|
||||||
"integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
|
"integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
|
||||||
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
deps/crypt_blowfish
vendored
Submodule
1
deps/crypt_blowfish
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 3354bb81eea489e972b0a7c63231514ab34f73a0
|
29
deps/crypt_blowfish/LINKS
vendored
29
deps/crypt_blowfish/LINKS
vendored
@ -1,29 +0,0 @@
|
|||||||
New versions of this package (crypt_blowfish):
|
|
||||||
|
|
||||||
http://www.openwall.com/crypt/
|
|
||||||
|
|
||||||
A paper on the algorithm that explains its design decisions:
|
|
||||||
|
|
||||||
http://www.usenix.org/events/usenix99/provos.html
|
|
||||||
|
|
||||||
Unix Seventh Edition Manual, Volume 2: the password scheme (1978):
|
|
||||||
|
|
||||||
http://plan9.bell-labs.com/7thEdMan/vol2/password
|
|
||||||
|
|
||||||
The Openwall GNU/*/Linux (Owl) tcb suite implementing the alternative
|
|
||||||
password shadowing scheme. This includes a PAM module which
|
|
||||||
supersedes pam_unix and uses the password hashing framework provided
|
|
||||||
with crypt_blowfish when setting new passwords.
|
|
||||||
|
|
||||||
http://www.openwall.com/tcb/
|
|
||||||
|
|
||||||
pam_passwdqc, a password strength checking and policy enforcement
|
|
||||||
module for PAM-aware password changing programs:
|
|
||||||
|
|
||||||
http://www.openwall.com/passwdqc/
|
|
||||||
|
|
||||||
John the Ripper password cracker:
|
|
||||||
|
|
||||||
http://www.openwall.com/john/
|
|
||||||
|
|
||||||
$Owl: Owl/packages/glibc/crypt_blowfish/LINKS,v 1.4 2005/11/16 13:09:47 solar Exp $
|
|
77
deps/crypt_blowfish/Makefile
vendored
77
deps/crypt_blowfish/Makefile
vendored
@ -1,77 +0,0 @@
|
|||||||
#
|
|
||||||
# Written and revised by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
# No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
# domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
# in the public domain is deemed null and void, then the software is
|
|
||||||
# Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
# general public under the following terms:
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted.
|
|
||||||
#
|
|
||||||
# There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
#
|
|
||||||
# See crypt_blowfish.c for more information.
|
|
||||||
#
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
AS = $(CC)
|
|
||||||
LD = $(CC)
|
|
||||||
RM = rm -f
|
|
||||||
CFLAGS = -W -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wundef -Wpointer-arith -O2 -fomit-frame-pointer -funroll-loops
|
|
||||||
ASFLAGS = -c
|
|
||||||
LDFLAGS = -s
|
|
||||||
|
|
||||||
BLOWFISH_OBJS = \
|
|
||||||
crypt_blowfish.o x86.o
|
|
||||||
|
|
||||||
CRYPT_OBJS = \
|
|
||||||
$(BLOWFISH_OBJS) crypt_gensalt.o wrapper.o
|
|
||||||
|
|
||||||
TEST_OBJS = \
|
|
||||||
$(BLOWFISH_OBJS) crypt_gensalt.o crypt_test.o
|
|
||||||
|
|
||||||
TEST_THREADS_OBJS = \
|
|
||||||
$(BLOWFISH_OBJS) crypt_gensalt.o crypt_test_threads.o
|
|
||||||
|
|
||||||
EXTRA_MANS = \
|
|
||||||
crypt_r.3 crypt_rn.3 crypt_ra.3 \
|
|
||||||
crypt_gensalt.3 crypt_gensalt_rn.3 crypt_gensalt_ra.3
|
|
||||||
|
|
||||||
all: $(CRYPT_OBJS) man
|
|
||||||
|
|
||||||
check: crypt_test
|
|
||||||
./crypt_test
|
|
||||||
|
|
||||||
crypt_test: $(TEST_OBJS)
|
|
||||||
$(LD) $(LDFLAGS) $(TEST_OBJS) -o $@
|
|
||||||
|
|
||||||
crypt_test.o: wrapper.c ow-crypt.h crypt_blowfish.h crypt_gensalt.h
|
|
||||||
$(CC) -c $(CFLAGS) wrapper.c -DTEST -o $@
|
|
||||||
|
|
||||||
check_threads: crypt_test_threads
|
|
||||||
./crypt_test_threads
|
|
||||||
|
|
||||||
crypt_test_threads: $(TEST_THREADS_OBJS)
|
|
||||||
$(LD) $(LDFLAGS) $(TEST_THREADS_OBJS) -lpthread -o $@
|
|
||||||
|
|
||||||
crypt_test_threads.o: wrapper.c ow-crypt.h crypt_blowfish.h crypt_gensalt.h
|
|
||||||
$(CC) -c $(CFLAGS) wrapper.c -DTEST -DTEST_THREADS=4 -o $@
|
|
||||||
|
|
||||||
man: $(EXTRA_MANS)
|
|
||||||
|
|
||||||
$(EXTRA_MANS):
|
|
||||||
echo '.so man3/crypt.3' > $@
|
|
||||||
|
|
||||||
crypt_blowfish.o: crypt_blowfish.h
|
|
||||||
crypt_gensalt.o: crypt_gensalt.h
|
|
||||||
wrapper.o: crypt.h ow-crypt.h crypt_blowfish.h crypt_gensalt.h
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
$(CC) -c $(CFLAGS) $*.c
|
|
||||||
|
|
||||||
.S.o:
|
|
||||||
$(AS) $(ASFLAGS) $*.S
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) crypt_test crypt_test_threads *.o $(EXTRA_MANS) core
|
|
30
deps/crypt_blowfish/PERFORMANCE
vendored
30
deps/crypt_blowfish/PERFORMANCE
vendored
@ -1,30 +0,0 @@
|
|||||||
These numbers are for 32 iterations ("$2a$05"):
|
|
||||||
|
|
||||||
OpenBSD 3.0 bcrypt(*) crypt_blowfish 0.4.4
|
|
||||||
Pentium III, 840 MHz 99 c/s 121 c/s (+22%)
|
|
||||||
Alpha 21164PC, 533 MHz 55.5 c/s 76.9 c/s (+38%)
|
|
||||||
UltraSparc IIi, 400 MHz 49.9 c/s 52.5 c/s (+5%)
|
|
||||||
Pentium, 120 MHz 8.8 c/s 20.1 c/s (+128%)
|
|
||||||
PA-RISC 7100LC, 80 MHz 8.5 c/s 16.3 c/s (+92%)
|
|
||||||
|
|
||||||
(*) built with -fomit-frame-pointer -funroll-loops, which I don't
|
|
||||||
think happens for libcrypt.
|
|
||||||
|
|
||||||
Starting with version 1.1 released in June 2011, default builds of
|
|
||||||
crypt_blowfish invoke a quick self-test on every hash computation.
|
|
||||||
This has roughly a 4.8% performance impact at "$2a$05", but only a 0.6%
|
|
||||||
impact at a more typical setting of "$2a$08".
|
|
||||||
|
|
||||||
The large speedup for the original Pentium is due to the assembly
|
|
||||||
code and the weird optimizations this processor requires.
|
|
||||||
|
|
||||||
The numbers for password cracking are 2 to 10% higher than those for
|
|
||||||
crypt_blowfish as certain things may be done out of the loop and the
|
|
||||||
code doesn't need to be reentrant.
|
|
||||||
|
|
||||||
Recent versions of John the Ripper (1.6.25-dev and newer) achieve an
|
|
||||||
additional 15% speedup on the Pentium Pro family of processors (which
|
|
||||||
includes Pentium III) with a separate version of the assembly code and
|
|
||||||
run-time CPU detection.
|
|
||||||
|
|
||||||
$Owl: Owl/packages/glibc/crypt_blowfish/PERFORMANCE,v 1.6 2011/06/21 12:09:20 solar Exp $
|
|
68
deps/crypt_blowfish/README
vendored
68
deps/crypt_blowfish/README
vendored
@ -1,68 +0,0 @@
|
|||||||
This is an implementation of a password hashing method, provided via the
|
|
||||||
crypt(3) and a reentrant interface. It is fully compatible with
|
|
||||||
OpenBSD's bcrypt.c for prefix "$2b$", originally by Niels Provos and
|
|
||||||
David Mazieres. (Please refer to the included crypt(3) man page for
|
|
||||||
information on minor compatibility issues for other bcrypt prefixes.)
|
|
||||||
|
|
||||||
I've placed this code in the public domain, with fallback to a
|
|
||||||
permissive license. Please see the comment in crypt_blowfish.c for
|
|
||||||
more information.
|
|
||||||
|
|
||||||
You can use the provided routines in your own packages, or link them
|
|
||||||
into a C library. I've provided hooks for linking into GNU libc, but
|
|
||||||
it shouldn't be too hard to get this into another C library. Note
|
|
||||||
that simply adding this code into your libc is probably not enough to
|
|
||||||
make your system use the new password hashing algorithm. Changes to
|
|
||||||
passwd(1), PAM modules, or whatever else your system uses will likely
|
|
||||||
be needed as well. These are not a part of this package, but see
|
|
||||||
LINKS for a pointer to our tcb suite.
|
|
||||||
|
|
||||||
Instructions on using the routines in one of the two common ways are
|
|
||||||
given below. It is recommended that you test the routines on your
|
|
||||||
system before you start. Type "make check" or "make check_threads"
|
|
||||||
(if you have the POSIX threads library), then "make clean".
|
|
||||||
|
|
||||||
|
|
||||||
1. Using the routines in your programs.
|
|
||||||
|
|
||||||
The available interfaces are in ow-crypt.h, and this is the file you
|
|
||||||
should include. You won't need crypt.h. When linking, add all of the
|
|
||||||
C files and x86.S (you can compile and link it even on a non-x86, it
|
|
||||||
will produce no code in this case).
|
|
||||||
|
|
||||||
|
|
||||||
2. Building the routines into GNU C library.
|
|
||||||
|
|
||||||
For versions 2.13 and 2.14 (and likely other nearby ones), extract the
|
|
||||||
library sources as usual. Apply the patch for glibc 2.14 provided in
|
|
||||||
this package. Enter crypt/ and rename crypt.h to gnu-crypt.h within
|
|
||||||
that directory. Copy the C sources, header, and assembly (x86.S) files
|
|
||||||
from this package in there as well (but be sure you don't overwrite the
|
|
||||||
Makefile). Configure, build, and install the library as usual.
|
|
||||||
|
|
||||||
For versions 2.2 to 2.3.6 (and likely also for some newer ones),
|
|
||||||
extract the library sources and maybe its optional add-ons as usual.
|
|
||||||
Apply the patch for glibc 2.3.6 provided in this package. Enter
|
|
||||||
crypt/ and rename crypt.h to gnu-crypt.h within that directory. Copy
|
|
||||||
the C sources, header, and assembly (x86.S) files from this package in
|
|
||||||
there as well (but be sure you don't overwrite the Makefile).
|
|
||||||
Configure, build, and install the library as usual.
|
|
||||||
|
|
||||||
For versions 2.1 to 2.1.3, extract the library sources and the crypt
|
|
||||||
and linuxthreads add-ons as usual. Apply the patch for glibc 2.1.3
|
|
||||||
provided in this package. Enter crypt/sysdeps/unix/, and rename
|
|
||||||
crypt.h to gnu-crypt.h within that directory. Copy C sources, header,
|
|
||||||
and assembly (x86.S) files from this package in there as well (but be
|
|
||||||
sure you don't overwrite the Makefile). Configure, build, and install
|
|
||||||
the library as usual.
|
|
||||||
|
|
||||||
Programs that want to use the provided interfaces will need to include
|
|
||||||
crypt.h (but not ow-crypt.h directly). By default, prototypes for the
|
|
||||||
new routines aren't defined (but the extra functionality of crypt(3)
|
|
||||||
is indeed available). You need to define _OW_SOURCE to obtain the new
|
|
||||||
routines as well.
|
|
||||||
|
|
||||||
--
|
|
||||||
Solar Designer <solar at openwall.com>
|
|
||||||
|
|
||||||
$Owl: Owl/packages/glibc/crypt_blowfish/README,v 1.10 2014/07/07 15:19:04 solar Exp $
|
|
575
deps/crypt_blowfish/crypt.3
vendored
575
deps/crypt_blowfish/crypt.3
vendored
@ -1,575 +0,0 @@
|
|||||||
.\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
.\" No copyright is claimed, and this man page is hereby placed in the public
|
|
||||||
.\" domain. In case this attempt to disclaim copyright and place the man page
|
|
||||||
.\" in the public domain is deemed null and void, then the man page is
|
|
||||||
.\" Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
.\" general public under the following terms:
|
|
||||||
.\"
|
|
||||||
.\" Redistribution and use in source and binary forms, with or without
|
|
||||||
.\" modification, are permitted.
|
|
||||||
.\"
|
|
||||||
.\" There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
.\"
|
|
||||||
.\" This manual page in its current form is intended for use on systems
|
|
||||||
.\" based on the GNU C Library with crypt_blowfish patched into libcrypt.
|
|
||||||
.\"
|
|
||||||
.TH CRYPT 3 "July 7, 2014" "Openwall Project" "Library functions"
|
|
||||||
.ad l
|
|
||||||
.\" No macros in NAME to keep makewhatis happy.
|
|
||||||
.SH NAME
|
|
||||||
\fBcrypt\fR, \fBcrypt_r\fR, \fBcrypt_rn\fR, \fBcrypt_ra\fR,
|
|
||||||
\fBcrypt_gensalt\fR, \fBcrypt_gensalt_rn\fR, \fBcrypt_gensalt_ra\fR
|
|
||||||
\- password hashing
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B #define _XOPEN_SOURCE
|
|
||||||
.br
|
|
||||||
.B #include <unistd.h>
|
|
||||||
.sp
|
|
||||||
.in +8
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt(const char *" key ", const char *" setting );
|
|
||||||
.in -8
|
|
||||||
.sp
|
|
||||||
.B #define _GNU_SOURCE
|
|
||||||
.br
|
|
||||||
.B #include <crypt.h>
|
|
||||||
.sp
|
|
||||||
.in +8
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_r(const char *" key ", const char *" setting ", struct crypt_data *" data );
|
|
||||||
.in -8
|
|
||||||
.sp
|
|
||||||
.B #define _OW_SOURCE
|
|
||||||
.br
|
|
||||||
.B #include <crypt.h>
|
|
||||||
.sp
|
|
||||||
.in +8
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_rn(const char *" key ", const char *" setting ", void *" data ", int " size );
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_ra(const char *" key ", const char *" setting ", void **" data ", int *" size );
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_gensalt(const char *" prefix ", unsigned long " count ", const char *" input ", int " size );
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_gensalt_rn(const char *" prefix ", unsigned long " count ", const char *" input ", int " size ", char *" output ", int " output_size );
|
|
||||||
.ti -8
|
|
||||||
.BI "char *crypt_gensalt_ra(const char *" prefix ", unsigned long " count ", const char *" input ", int " size );
|
|
||||||
.ad b
|
|
||||||
.de crypt
|
|
||||||
.BR crypt ,
|
|
||||||
.BR crypt_r ,
|
|
||||||
.BR crypt_rn ", \\$1"
|
|
||||||
.ie "\\$2"" .B crypt_ra
|
|
||||||
.el .BR crypt_ra "\\$2"
|
|
||||||
..
|
|
||||||
.de crypt_gensalt
|
|
||||||
.BR crypt_gensalt ,
|
|
||||||
.BR crypt_gensalt_rn ", \\$1"
|
|
||||||
.ie "\\$2"" .B crypt_gensalt_ra
|
|
||||||
.el .BR crypt_gensalt_ra "\\$2"
|
|
||||||
..
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The
|
|
||||||
.crypt and
|
|
||||||
functions calculate a cryptographic hash function of
|
|
||||||
.I key
|
|
||||||
with one of a number of supported methods as requested with
|
|
||||||
.IR setting ,
|
|
||||||
which is also used to pass a salt and possibly other parameters to
|
|
||||||
the chosen method.
|
|
||||||
The hashing methods are explained below.
|
|
||||||
.PP
|
|
||||||
Unlike
|
|
||||||
.BR crypt ,
|
|
||||||
the functions
|
|
||||||
.BR crypt_r ,
|
|
||||||
.BR crypt_rn " and"
|
|
||||||
.B crypt_ra
|
|
||||||
are reentrant.
|
|
||||||
They place their result and possibly their private data in a
|
|
||||||
.I data
|
|
||||||
area of
|
|
||||||
.I size
|
|
||||||
bytes as passed to them by an application and/or in memory they
|
|
||||||
allocate dynamically. Some hashing algorithms may use the data area to
|
|
||||||
cache precomputed intermediate values across calls. Thus, applications
|
|
||||||
must properly initialize the data area before its first use.
|
|
||||||
.B crypt_r
|
|
||||||
requires that only
|
|
||||||
.I data->initialized
|
|
||||||
be reset to zero;
|
|
||||||
.BR crypt_rn " and " crypt_ra
|
|
||||||
require that either the entire data area is zeroed or, in the case of
|
|
||||||
.BR crypt_ra ,
|
|
||||||
.I *data
|
|
||||||
is NULL. When called with a NULL
|
|
||||||
.I *data
|
|
||||||
or insufficient
|
|
||||||
.I *size
|
|
||||||
for the requested hashing algorithm,
|
|
||||||
.B crypt_ra
|
|
||||||
uses
|
|
||||||
.BR realloc (3)
|
|
||||||
to allocate the required amount of memory dynamically. Thus,
|
|
||||||
.B crypt_ra
|
|
||||||
has the additional requirement that
|
|
||||||
.IR *data ,
|
|
||||||
when non-NULL, must point to an area allocated either with a previous
|
|
||||||
call to
|
|
||||||
.B crypt_ra
|
|
||||||
or with a
|
|
||||||
.BR malloc (3)
|
|
||||||
family call.
|
|
||||||
The memory allocated by
|
|
||||||
.B crypt_ra
|
|
||||||
should be freed with
|
|
||||||
.BR free "(3)."
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.crypt_gensalt and
|
|
||||||
functions compile a string for use as
|
|
||||||
.I setting
|
|
||||||
\- with the given
|
|
||||||
.I prefix
|
|
||||||
(used to choose a hashing method), the iteration
|
|
||||||
.I count
|
|
||||||
(if supported by the chosen method) and up to
|
|
||||||
.I size
|
|
||||||
cryptographically random
|
|
||||||
.I input
|
|
||||||
bytes for use as the actual salt.
|
|
||||||
If
|
|
||||||
.I count
|
|
||||||
is 0, a low default will be picked.
|
|
||||||
The random bytes may be obtained from
|
|
||||||
.BR /dev/urandom .
|
|
||||||
Unlike
|
|
||||||
.BR crypt_gensalt ,
|
|
||||||
the functions
|
|
||||||
.BR crypt_gensalt_rn " and " crypt_gensalt_ra
|
|
||||||
are reentrant.
|
|
||||||
.B crypt_gensalt_rn
|
|
||||||
places its result in the
|
|
||||||
.I output
|
|
||||||
buffer of
|
|
||||||
.I output_size
|
|
||||||
bytes.
|
|
||||||
.B crypt_gensalt_ra
|
|
||||||
allocates memory for its result dynamically. The memory should be
|
|
||||||
freed with
|
|
||||||
.BR free "(3)."
|
|
||||||
.SH RETURN VALUE
|
|
||||||
Upon successful completion, the functions
|
|
||||||
.crypt and
|
|
||||||
return a pointer to a string containing the setting that was actually used
|
|
||||||
and a printable encoding of the hash function value.
|
|
||||||
The entire string is directly usable as
|
|
||||||
.I setting
|
|
||||||
with other calls to
|
|
||||||
.crypt and
|
|
||||||
and as
|
|
||||||
.I prefix
|
|
||||||
with calls to
|
|
||||||
.crypt_gensalt and .
|
|
||||||
.PP
|
|
||||||
The behavior of
|
|
||||||
.B crypt
|
|
||||||
on errors isn't well standardized. Some implementations simply can't fail
|
|
||||||
(unless the process dies, in which case they obviously can't return),
|
|
||||||
others return NULL or a fixed string. Most implementations don't set
|
|
||||||
.IR errno ,
|
|
||||||
but some do. SUSv2 specifies only returning NULL and setting
|
|
||||||
.I errno
|
|
||||||
as a valid behavior, and defines only one possible error
|
|
||||||
.RB "(" ENOSYS ,
|
|
||||||
"The functionality is not supported on this implementation.")
|
|
||||||
Unfortunately, most existing applications aren't prepared to handle
|
|
||||||
NULL returns from
|
|
||||||
.BR crypt .
|
|
||||||
The description below corresponds to this implementation of
|
|
||||||
.BR crypt " and " crypt_r
|
|
||||||
only, and to
|
|
||||||
.BR crypt_rn " and " crypt_ra .
|
|
||||||
The behavior may change to match standards, other implementations or
|
|
||||||
existing applications.
|
|
||||||
.PP
|
|
||||||
.BR crypt " and " crypt_r
|
|
||||||
may only fail (and return) when passed an invalid or unsupported
|
|
||||||
.IR setting ,
|
|
||||||
in which case they return a pointer to a magic string that is
|
|
||||||
shorter than 13 characters and is guaranteed to differ from
|
|
||||||
.IR setting .
|
|
||||||
This behavior is safe for older applications which assume that
|
|
||||||
.B crypt
|
|
||||||
can't fail, when both setting new passwords and authenticating against
|
|
||||||
existing password hashes.
|
|
||||||
.BR crypt_rn " and " crypt_ra
|
|
||||||
return NULL to indicate failure. All four functions set
|
|
||||||
.I errno
|
|
||||||
when they fail.
|
|
||||||
.PP
|
|
||||||
The functions
|
|
||||||
.crypt_gensalt and
|
|
||||||
return a pointer to the compiled string for
|
|
||||||
.IR setting ,
|
|
||||||
or NULL on error in which case
|
|
||||||
.I errno
|
|
||||||
is set.
|
|
||||||
.SH ERRORS
|
|
||||||
.TP
|
|
||||||
.B EINVAL
|
|
||||||
.crypt "" :
|
|
||||||
.I setting
|
|
||||||
is invalid or not supported by this implementation;
|
|
||||||
.sp
|
|
||||||
.crypt_gensalt "" :
|
|
||||||
.I prefix
|
|
||||||
is invalid or not supported by this implementation;
|
|
||||||
.I count
|
|
||||||
is invalid for the requested
|
|
||||||
.IR prefix ;
|
|
||||||
the input
|
|
||||||
.I size
|
|
||||||
is insufficient for the smallest valid salt with the requested
|
|
||||||
.IR prefix ;
|
|
||||||
.I input
|
|
||||||
is NULL.
|
|
||||||
.TP
|
|
||||||
.B ERANGE
|
|
||||||
.BR crypt_rn :
|
|
||||||
the provided data area
|
|
||||||
.I size
|
|
||||||
is insufficient for the requested hashing algorithm;
|
|
||||||
.sp
|
|
||||||
.BR crypt_gensalt_rn :
|
|
||||||
.I output_size
|
|
||||||
is too small to hold the compiled
|
|
||||||
.I setting
|
|
||||||
string.
|
|
||||||
.TP
|
|
||||||
.B ENOMEM
|
|
||||||
.B crypt
|
|
||||||
(original glibc only):
|
|
||||||
failed to allocate memory for the output buffer (which subsequent calls
|
|
||||||
would re-use);
|
|
||||||
.sp
|
|
||||||
.BR crypt_ra :
|
|
||||||
.I *data
|
|
||||||
is NULL or
|
|
||||||
.I *size
|
|
||||||
is insufficient for the requested hashing algorithm and
|
|
||||||
.BR realloc (3)
|
|
||||||
failed;
|
|
||||||
.sp
|
|
||||||
.BR crypt_gensalt_ra :
|
|
||||||
failed to allocate memory for the compiled
|
|
||||||
.I setting
|
|
||||||
string.
|
|
||||||
.TP
|
|
||||||
.B ENOSYS
|
|
||||||
.B crypt
|
|
||||||
(SUSv2):
|
|
||||||
the functionality is not supported on this implementation;
|
|
||||||
.sp
|
|
||||||
.BR crypt ,
|
|
||||||
.B crypt_r
|
|
||||||
(glibc 2.0 to 2.0.1 only):
|
|
||||||
.de no-crypt-add-on
|
|
||||||
the crypt add-on is not compiled in and
|
|
||||||
.I setting
|
|
||||||
requests something other than the MD5-based algorithm.
|
|
||||||
..
|
|
||||||
.no-crypt-add-on
|
|
||||||
.TP
|
|
||||||
.B EOPNOTSUPP
|
|
||||||
.BR crypt ,
|
|
||||||
.B crypt_r
|
|
||||||
(glibc 2.0.2 to 2.1.3 only):
|
|
||||||
.no-crypt-add-on
|
|
||||||
.SH HASHING METHODS
|
|
||||||
The implemented hashing methods are intended specifically for processing
|
|
||||||
user passwords for storage and authentication;
|
|
||||||
they are at best inefficient for most other purposes.
|
|
||||||
.PP
|
|
||||||
It is important to understand that password hashing is not a replacement
|
|
||||||
for strong passwords.
|
|
||||||
It is always possible for an attacker with access to password hashes
|
|
||||||
to try guessing candidate passwords against the hashes.
|
|
||||||
There are, however, certain properties a password hashing method may have
|
|
||||||
which make these key search attacks somewhat harder.
|
|
||||||
.PP
|
|
||||||
All of the hashing methods use salts such that the same
|
|
||||||
.I key
|
|
||||||
may produce many possible hashes.
|
|
||||||
Proper use of salts may defeat a number of attacks, including:
|
|
||||||
.TP
|
|
||||||
1.
|
|
||||||
The ability to try candidate passwords against multiple hashes at the
|
|
||||||
price of one.
|
|
||||||
.TP
|
|
||||||
2.
|
|
||||||
The use of pre-hashed lists of candidate passwords.
|
|
||||||
.TP
|
|
||||||
3.
|
|
||||||
The ability to determine whether two users (or two accounts of one user)
|
|
||||||
have the same or different passwords without actually having to guess
|
|
||||||
one of the passwords.
|
|
||||||
.PP
|
|
||||||
The key search attacks depend on computing hashes of large numbers of
|
|
||||||
candidate passwords.
|
|
||||||
Thus, the computational cost of a good password hashing method must be
|
|
||||||
high \- but of course not too high to render it impractical.
|
|
||||||
.PP
|
|
||||||
All hashing methods implemented within the
|
|
||||||
.crypt and
|
|
||||||
interfaces use multiple iterations of an underlying cryptographic
|
|
||||||
primitive specifically in order to increase the cost of trying a
|
|
||||||
candidate password.
|
|
||||||
Unfortunately, due to hardware improvements, the hashing methods which
|
|
||||||
have a fixed cost become increasingly less secure over time.
|
|
||||||
.PP
|
|
||||||
In addition to salts, modern password hashing methods accept a variable
|
|
||||||
iteration
|
|
||||||
.IR count .
|
|
||||||
This makes it possible to adapt their cost to the hardware improvements
|
|
||||||
while still maintaining compatibility.
|
|
||||||
.PP
|
|
||||||
The following hashing methods are or may be implemented within the
|
|
||||||
described interfaces:
|
|
||||||
.PP
|
|
||||||
.de hash
|
|
||||||
.ad l
|
|
||||||
.TP
|
|
||||||
.I prefix
|
|
||||||
.ie "\\$1"" \{\
|
|
||||||
"" (empty string);
|
|
||||||
.br
|
|
||||||
a string matching ^[./0-9A-Za-z]{2} (see
|
|
||||||
.BR regex (7))
|
|
||||||
.\}
|
|
||||||
.el "\\$1"
|
|
||||||
.TP
|
|
||||||
.B Encoding syntax
|
|
||||||
\\$2
|
|
||||||
.TP
|
|
||||||
.B Maximum password length
|
|
||||||
\\$3 (uses \\$4-bit characters)
|
|
||||||
.TP
|
|
||||||
.B Effective key size
|
|
||||||
.ie "\\$5"" limited by the hash size only
|
|
||||||
.el up to \\$5 bits
|
|
||||||
.TP
|
|
||||||
.B Hash size
|
|
||||||
\\$6 bits
|
|
||||||
.TP
|
|
||||||
.B Salt size
|
|
||||||
\\$7 bits
|
|
||||||
.TP
|
|
||||||
.B Iteration count
|
|
||||||
\\$8
|
|
||||||
.ad b
|
|
||||||
..
|
|
||||||
.ti -2
|
|
||||||
.B Traditional DES-based
|
|
||||||
.br
|
|
||||||
This method is supported by almost all implementations of
|
|
||||||
.BR crypt .
|
|
||||||
Unfortunately, it no longer offers adequate security because of its many
|
|
||||||
limitations.
|
|
||||||
Thus, it should not be used for new passwords unless you absolutely have
|
|
||||||
to be able to migrate the password hashes to other systems.
|
|
||||||
.hash "" "[./0-9A-Za-z]{13}" 8 7 56 64 12 25
|
|
||||||
.PP
|
|
||||||
.ti -2
|
|
||||||
.B Extended BSDI-style DES-based
|
|
||||||
.br
|
|
||||||
This method is used on BSDI and is also available on at least NetBSD,
|
|
||||||
OpenBSD, and FreeBSD due to the use of David Burren's FreeSec library.
|
|
||||||
.hash _ "_[./0-9A-Za-z]{19}" unlimited 7 56 64 24 "1 to 2**24-1 (must be odd)"
|
|
||||||
.PP
|
|
||||||
.ti -2
|
|
||||||
.B FreeBSD-style MD5-based
|
|
||||||
.br
|
|
||||||
This is Poul-Henning Kamp's MD5-based password hashing method originally
|
|
||||||
developed for FreeBSD.
|
|
||||||
It is currently supported on many free Unix-like systems, on Solaris 10
|
|
||||||
and newer, and it is part of the official glibc.
|
|
||||||
Its main disadvantage is the fixed iteration count, which is already
|
|
||||||
too low for the currently available hardware.
|
|
||||||
.hash "$1$" "\e$1\e$[^$]{1,8}\e$[./0-9A-Za-z]{22}" unlimited 8 "" 128 "6 to 48" 1000
|
|
||||||
.PP
|
|
||||||
.ti -2
|
|
||||||
.BR "OpenBSD-style Blowfish-based" " (" bcrypt )
|
|
||||||
.br
|
|
||||||
.B bcrypt
|
|
||||||
was originally developed by Niels Provos and David Mazieres for OpenBSD
|
|
||||||
and is also supported on recent versions of FreeBSD and NetBSD,
|
|
||||||
on Solaris 10 and newer, and on several GNU/*/Linux distributions.
|
|
||||||
It is, however, not part of the official glibc.
|
|
||||||
.PP
|
|
||||||
While both
|
|
||||||
.B bcrypt
|
|
||||||
and the BSDI-style DES-based hashing offer a variable iteration count,
|
|
||||||
.B bcrypt
|
|
||||||
may scale to even faster hardware, doesn't allow for certain optimizations
|
|
||||||
specific to password cracking only, doesn't have the effective key size
|
|
||||||
limitation, and uses 8-bit characters in passwords.
|
|
||||||
.hash "$2b$" "\e$2[abxy]\e$[0-9]{2}\e$[./A-Za-z0-9]{53}" 72 8 "" 184 128 "2**4 to 2**99 (current implementations are limited to 2**31 iterations)"
|
|
||||||
.PP
|
|
||||||
With
|
|
||||||
.BR bcrypt ,
|
|
||||||
the
|
|
||||||
.I count
|
|
||||||
passed to
|
|
||||||
.crypt_gensalt and
|
|
||||||
is the base-2 logarithm of the actual iteration count.
|
|
||||||
.PP
|
|
||||||
.B bcrypt
|
|
||||||
hashes used the "$2a$" prefix since 1997.
|
|
||||||
However, in 2011 an implementation bug was discovered in crypt_blowfish
|
|
||||||
(versions up to 1.0.4 inclusive) affecting handling of password characters with
|
|
||||||
the 8th bit set.
|
|
||||||
Besides fixing the bug,
|
|
||||||
to provide for upgrade strategies for existing systems, two new prefixes were
|
|
||||||
introduced: "$2x$", which fully re-introduces the bug, and "$2y$", which
|
|
||||||
guarantees correct handling of both 7- and 8-bit characters.
|
|
||||||
OpenBSD 5.5 introduced the "$2b$" prefix for behavior that exactly matches
|
|
||||||
crypt_blowfish's "$2y$", and current crypt_blowfish supports it as well.
|
|
||||||
Unfortunately, the behavior of "$2a$" on password characters with the 8th bit
|
|
||||||
set has to be considered system-specific.
|
|
||||||
When generating new password hashes, the "$2b$" or "$2y$" prefix should be used.
|
|
||||||
(If such hashes ever need to be migrated to a system that does not yet support
|
|
||||||
these new prefixes, the prefix in migrated copies of the already-generated
|
|
||||||
hashes may be changed to "$2a$".)
|
|
||||||
.PP
|
|
||||||
.crypt_gensalt and
|
|
||||||
support the "$2b$", "$2y$", and "$2a$" prefixes (the latter for legacy programs
|
|
||||||
or configurations), but not "$2x$" (which must not be used for new hashes).
|
|
||||||
.crypt and
|
|
||||||
support all four of these prefixes.
|
|
||||||
.SH PORTABILITY NOTES
|
|
||||||
Programs using any of these functions on a glibc 2.x system must be
|
|
||||||
linked against
|
|
||||||
.BR libcrypt .
|
|
||||||
However, many Unix-like operating systems and older versions of the
|
|
||||||
GNU C Library include the
|
|
||||||
.BR crypt " function in " libc .
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.BR crypt_r ,
|
|
||||||
.BR crypt_rn ,
|
|
||||||
.BR crypt_ra ,
|
|
||||||
.crypt_gensalt and
|
|
||||||
functions are very non-portable.
|
|
||||||
.PP
|
|
||||||
The set of supported hashing methods is implementation-dependent.
|
|
||||||
.SH CONFORMING TO
|
|
||||||
The
|
|
||||||
.B crypt
|
|
||||||
function conforms to SVID, X/OPEN, and is available on BSD 4.3.
|
|
||||||
The strings returned by
|
|
||||||
.B crypt
|
|
||||||
are not required to be portable among conformant systems.
|
|
||||||
.PP
|
|
||||||
.B crypt_r
|
|
||||||
is a GNU extension.
|
|
||||||
There's also a
|
|
||||||
.B crypt_r
|
|
||||||
function on HP-UX and MKS Toolkit, but the prototypes and semantics differ.
|
|
||||||
.PP
|
|
||||||
.B crypt_gensalt
|
|
||||||
is an Openwall extension.
|
|
||||||
There's also a
|
|
||||||
.B crypt_gensalt
|
|
||||||
function on Solaris 10 and newer, but the prototypes and semantics differ.
|
|
||||||
.PP
|
|
||||||
.BR crypt_rn ,
|
|
||||||
.BR crypt_ra ,
|
|
||||||
.BR crypt_gensalt_rn ,
|
|
||||||
and
|
|
||||||
.B crypt_gensalt_ra
|
|
||||||
are Openwall extensions.
|
|
||||||
.SH HISTORY
|
|
||||||
A rotor-based
|
|
||||||
.B crypt
|
|
||||||
function appeared in Version 6 AT&T UNIX.
|
|
||||||
The "traditional"
|
|
||||||
.B crypt
|
|
||||||
first appeared in Version 7 AT&T UNIX.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B crypt_r
|
|
||||||
function was introduced during glibc 2.0 development.
|
|
||||||
.SH BUGS
|
|
||||||
The return values of
|
|
||||||
.BR crypt " and " crypt_gensalt
|
|
||||||
point to static buffers that are overwritten by subsequent calls.
|
|
||||||
These functions are not thread-safe.
|
|
||||||
.RB ( crypt
|
|
||||||
on recent versions of Solaris uses thread-specific data and actually is
|
|
||||||
thread-safe.)
|
|
||||||
.PP
|
|
||||||
The strings returned by certain other implementations of
|
|
||||||
.B crypt
|
|
||||||
on error may be stored in read-only locations or only initialized once,
|
|
||||||
which makes it unsafe to always attempt to zero out the buffer normally
|
|
||||||
pointed to by the
|
|
||||||
.B crypt
|
|
||||||
return value as it would otherwise be preferable for security reasons.
|
|
||||||
The problem could be avoided with the use of
|
|
||||||
.BR crypt_r ,
|
|
||||||
.BR crypt_rn ,
|
|
||||||
or
|
|
||||||
.B crypt_ra
|
|
||||||
where the application has full control over output buffers of these functions
|
|
||||||
(and often over some of their private data as well).
|
|
||||||
Unfortunately, the functions aren't (yet?) available on platforms where
|
|
||||||
.B crypt
|
|
||||||
has this undesired property.
|
|
||||||
.PP
|
|
||||||
Applications using the thread-safe
|
|
||||||
.B crypt_r
|
|
||||||
need to allocate address space for the large (over 128 KB)
|
|
||||||
.I struct crypt_data
|
|
||||||
structure. Each thread needs a separate instance of the structure. The
|
|
||||||
.B crypt_r
|
|
||||||
interface makes it impossible to implement a hashing algorithm which
|
|
||||||
would need to keep an even larger amount of private data, without breaking
|
|
||||||
binary compatibility.
|
|
||||||
.B crypt_ra
|
|
||||||
allows for dynamically increasing the allocation size as required by the
|
|
||||||
hashing algorithm that is actually used. Unfortunately,
|
|
||||||
.B crypt_ra
|
|
||||||
is even more non-portable than
|
|
||||||
.BR crypt_r .
|
|
||||||
.PP
|
|
||||||
Multi-threaded applications or library functions which are meant to be
|
|
||||||
thread-safe should use
|
|
||||||
.BR crypt_gensalt_rn " or " crypt_gensalt_ra
|
|
||||||
rather than
|
|
||||||
.BR crypt_gensalt .
|
|
||||||
.SH SEE ALSO
|
|
||||||
.BR login (1),
|
|
||||||
.BR passwd (1),
|
|
||||||
.BR crypto (3),
|
|
||||||
.BR encrypt (3),
|
|
||||||
.BR free (3),
|
|
||||||
.BR getpass (3),
|
|
||||||
.BR getpwent (3),
|
|
||||||
.BR malloc (3),
|
|
||||||
.BR realloc (3),
|
|
||||||
.BR shadow (3),
|
|
||||||
.BR passwd (5),
|
|
||||||
.BR shadow (5),
|
|
||||||
.BR regex (7),
|
|
||||||
.BR pam (8)
|
|
||||||
.sp
|
|
||||||
Niels Provos and David Mazieres. A Future-Adaptable Password Scheme.
|
|
||||||
Proceedings of the 1999 USENIX Annual Technical Conference, June 1999.
|
|
||||||
.br
|
|
||||||
http://www.usenix.org/events/usenix99/provos.html
|
|
||||||
.sp
|
|
||||||
Robert Morris and Ken Thompson. Password Security: A Case History.
|
|
||||||
Unix Seventh Edition Manual, Volume 2, April 1978.
|
|
||||||
.br
|
|
||||||
http://plan9.bell-labs.com/7thEdMan/vol2/password
|
|
24
deps/crypt_blowfish/crypt.h
vendored
24
deps/crypt_blowfish/crypt.h
vendored
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2002.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2002 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gnu-crypt.h>
|
|
||||||
|
|
||||||
#if defined(_OW_SOURCE) || defined(__USE_OW)
|
|
||||||
#define __SKIP_GNU
|
|
||||||
#undef __SKIP_OW
|
|
||||||
#include <ow-crypt.h>
|
|
||||||
#undef __SKIP_GNU
|
|
||||||
#endif
|
|
907
deps/crypt_blowfish/crypt_blowfish.c
vendored
907
deps/crypt_blowfish/crypt_blowfish.c
vendored
@ -1,907 +0,0 @@
|
|||||||
/*
|
|
||||||
* The crypt_blowfish homepage is:
|
|
||||||
*
|
|
||||||
* http://www.openwall.com/crypt/
|
|
||||||
*
|
|
||||||
* This code comes from John the Ripper password cracker, with reentrant
|
|
||||||
* and crypt(3) interfaces added, but optimizations specific to password
|
|
||||||
* cracking removed.
|
|
||||||
*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 1998-2014.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* It is my intent that you should be able to use this on your system,
|
|
||||||
* as part of a software package, or anywhere else to improve security,
|
|
||||||
* ensure compatibility, or for any other purpose. I would appreciate
|
|
||||||
* it if you give credit where it is due and keep your modifications in
|
|
||||||
* the public domain as well, but I don't require that in order to let
|
|
||||||
* you place this code and any modifications you make under a license
|
|
||||||
* of your choice.
|
|
||||||
*
|
|
||||||
* This implementation is fully compatible with OpenBSD's bcrypt.c for prefix
|
|
||||||
* "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses
|
|
||||||
* some of his ideas. The password hashing algorithm was designed by David
|
|
||||||
* Mazieres <dm at lcs.mit.edu>. For information on the level of
|
|
||||||
* compatibility for bcrypt hash prefixes other than "$2b$", please refer to
|
|
||||||
* the comments in BF_set_key() below and to the included crypt(3) man page.
|
|
||||||
*
|
|
||||||
* There's a paper on the algorithm that explains its design decisions:
|
|
||||||
*
|
|
||||||
* http://www.usenix.org/events/usenix99/provos.html
|
|
||||||
*
|
|
||||||
* Some of the tricks in BF_ROUND might be inspired by Eric Young's
|
|
||||||
* Blowfish library (I can't be sure if I would think of something if I
|
|
||||||
* hadn't seen his code).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#ifndef __set_errno
|
|
||||||
#define __set_errno(val) errno = (val)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Just to make sure the prototypes match the actual definitions */
|
|
||||||
#include "crypt_blowfish.h"
|
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
#define BF_ASM 1
|
|
||||||
#define BF_SCALE 1
|
|
||||||
#elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__)
|
|
||||||
#define BF_ASM 0
|
|
||||||
#define BF_SCALE 1
|
|
||||||
#else
|
|
||||||
#define BF_ASM 0
|
|
||||||
#define BF_SCALE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef unsigned int BF_word;
|
|
||||||
typedef signed int BF_word_signed;
|
|
||||||
|
|
||||||
/* Number of Blowfish rounds, this is also hardcoded into a few places */
|
|
||||||
#define BF_N 16
|
|
||||||
|
|
||||||
typedef BF_word BF_key[BF_N + 2];
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
BF_word S[4][0x100];
|
|
||||||
BF_key P;
|
|
||||||
} BF_ctx;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Magic IV for 64 Blowfish encryptions that we do at the end.
|
|
||||||
* The string is "OrpheanBeholderScryDoubt" on big-endian.
|
|
||||||
*/
|
|
||||||
static BF_word BF_magic_w[6] = {
|
|
||||||
0x4F727068, 0x65616E42, 0x65686F6C,
|
|
||||||
0x64657253, 0x63727944, 0x6F756274
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* P-box and S-box tables initialized with digits of Pi.
|
|
||||||
*/
|
|
||||||
static BF_ctx BF_init_state = {
|
|
||||||
{
|
|
||||||
{
|
|
||||||
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
|
|
||||||
0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
|
|
||||||
0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
|
|
||||||
0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
|
|
||||||
0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
|
|
||||||
0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
|
|
||||||
0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
|
|
||||||
0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
|
|
||||||
0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
|
|
||||||
0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
|
|
||||||
0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
|
|
||||||
0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
|
|
||||||
0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
|
|
||||||
0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
|
|
||||||
0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
|
|
||||||
0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
|
|
||||||
0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
|
|
||||||
0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
|
|
||||||
0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
|
|
||||||
0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
|
|
||||||
0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
|
|
||||||
0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
|
|
||||||
0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
|
|
||||||
0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
|
|
||||||
0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
|
|
||||||
0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
|
|
||||||
0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
|
|
||||||
0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
|
|
||||||
0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
|
|
||||||
0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
|
|
||||||
0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
|
|
||||||
0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
|
|
||||||
0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
|
|
||||||
0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
|
|
||||||
0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
|
|
||||||
0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
|
|
||||||
0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
|
|
||||||
0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
|
|
||||||
0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
|
|
||||||
0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
|
|
||||||
0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
|
|
||||||
0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
|
|
||||||
0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
|
|
||||||
0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
|
|
||||||
0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
|
|
||||||
0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
|
|
||||||
0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
|
|
||||||
0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
|
|
||||||
0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
|
|
||||||
0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
|
|
||||||
0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
|
|
||||||
0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
|
|
||||||
0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
|
|
||||||
0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
|
|
||||||
0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
|
|
||||||
0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
|
|
||||||
0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
|
|
||||||
0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
|
|
||||||
0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
|
|
||||||
0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
|
|
||||||
0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
|
|
||||||
0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
|
|
||||||
0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
|
|
||||||
0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
|
|
||||||
}, {
|
|
||||||
0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
|
|
||||||
0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
|
|
||||||
0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
|
|
||||||
0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
|
|
||||||
0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
|
|
||||||
0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
|
|
||||||
0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
|
|
||||||
0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
|
|
||||||
0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
|
|
||||||
0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
|
|
||||||
0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
|
|
||||||
0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
|
|
||||||
0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
|
|
||||||
0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
|
|
||||||
0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
|
|
||||||
0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
|
|
||||||
0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
|
|
||||||
0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
|
|
||||||
0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
|
|
||||||
0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
|
|
||||||
0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
|
|
||||||
0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
|
|
||||||
0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
|
|
||||||
0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
|
|
||||||
0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
|
|
||||||
0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
|
|
||||||
0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
|
|
||||||
0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
|
|
||||||
0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
|
|
||||||
0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
|
|
||||||
0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
|
|
||||||
0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
|
|
||||||
0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
|
|
||||||
0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
|
|
||||||
0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
|
|
||||||
0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
|
|
||||||
0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
|
|
||||||
0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
|
|
||||||
0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
|
|
||||||
0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
|
|
||||||
0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
|
|
||||||
0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
|
|
||||||
0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
|
|
||||||
0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
|
|
||||||
0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
|
|
||||||
0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
|
|
||||||
0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
|
|
||||||
0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
|
|
||||||
0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
|
|
||||||
0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
|
|
||||||
0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
|
|
||||||
0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
|
|
||||||
0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
|
|
||||||
0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
|
|
||||||
0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
|
|
||||||
0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
|
|
||||||
0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
|
|
||||||
0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
|
|
||||||
0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
|
|
||||||
0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
|
|
||||||
0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
|
|
||||||
0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
|
|
||||||
0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
|
|
||||||
0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
|
|
||||||
}, {
|
|
||||||
0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
|
|
||||||
0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
|
|
||||||
0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
|
|
||||||
0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
|
|
||||||
0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
|
|
||||||
0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
|
|
||||||
0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
|
|
||||||
0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
|
|
||||||
0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
|
|
||||||
0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
|
|
||||||
0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
|
|
||||||
0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
|
|
||||||
0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
|
|
||||||
0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
|
|
||||||
0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
|
|
||||||
0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
|
|
||||||
0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
|
|
||||||
0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
|
|
||||||
0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
|
|
||||||
0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
|
|
||||||
0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
|
|
||||||
0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
|
|
||||||
0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
|
|
||||||
0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
|
|
||||||
0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
|
|
||||||
0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
|
|
||||||
0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
|
|
||||||
0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
|
|
||||||
0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
|
|
||||||
0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
|
|
||||||
0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
|
|
||||||
0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
|
|
||||||
0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
|
|
||||||
0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
|
|
||||||
0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
|
|
||||||
0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
|
|
||||||
0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
|
|
||||||
0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
|
|
||||||
0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
|
|
||||||
0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
|
|
||||||
0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
|
|
||||||
0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
|
|
||||||
0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
|
|
||||||
0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
|
|
||||||
0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
|
|
||||||
0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
|
|
||||||
0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
|
|
||||||
0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
|
|
||||||
0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
|
|
||||||
0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
|
|
||||||
0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
|
|
||||||
0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
|
|
||||||
0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
|
|
||||||
0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
|
|
||||||
0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
|
|
||||||
0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
|
|
||||||
0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
|
|
||||||
0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
|
|
||||||
0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
|
|
||||||
0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
|
|
||||||
0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
|
|
||||||
0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
|
|
||||||
0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
|
|
||||||
0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
|
|
||||||
}, {
|
|
||||||
0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
|
|
||||||
0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
|
|
||||||
0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
|
|
||||||
0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
|
|
||||||
0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
|
|
||||||
0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
|
|
||||||
0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
|
|
||||||
0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
|
|
||||||
0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
|
|
||||||
0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
|
|
||||||
0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
|
|
||||||
0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
|
|
||||||
0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
|
|
||||||
0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
|
|
||||||
0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
|
|
||||||
0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
|
|
||||||
0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
|
|
||||||
0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
|
|
||||||
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
|
|
||||||
0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
|
|
||||||
0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
|
|
||||||
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
|
|
||||||
0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
|
|
||||||
0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
|
|
||||||
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
|
|
||||||
0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
|
|
||||||
0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
|
|
||||||
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
|
|
||||||
0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
|
|
||||||
0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
|
|
||||||
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
|
|
||||||
0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
|
|
||||||
0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
|
|
||||||
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
|
|
||||||
0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
|
|
||||||
0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
|
|
||||||
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
|
|
||||||
0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
|
|
||||||
0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
|
|
||||||
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
|
|
||||||
0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
|
|
||||||
0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
|
|
||||||
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
|
|
||||||
0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
|
|
||||||
0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
|
|
||||||
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
|
|
||||||
0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
|
|
||||||
0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
|
|
||||||
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
|
|
||||||
0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
|
|
||||||
0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
|
|
||||||
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
|
|
||||||
0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
|
|
||||||
0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
|
|
||||||
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
|
|
||||||
0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
|
|
||||||
0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
|
|
||||||
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
|
|
||||||
0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
|
|
||||||
0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
|
|
||||||
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
|
|
||||||
0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
|
|
||||||
0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
|
|
||||||
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
|
|
||||||
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
|
|
||||||
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
|
|
||||||
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
|
|
||||||
0x9216d5d9, 0x8979fb1b
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned char BF_itoa64[64 + 1] =
|
|
||||||
"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
||||||
|
|
||||||
static unsigned char BF_atoi64[0x60] = {
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,
|
|
||||||
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
||||||
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,
|
|
||||||
64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
|
|
||||||
43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64
|
|
||||||
};
|
|
||||||
|
|
||||||
#define BF_safe_atoi64(dst, src) \
|
|
||||||
{ \
|
|
||||||
tmp = (unsigned char)(src); \
|
|
||||||
if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
|
|
||||||
tmp = BF_atoi64[tmp]; \
|
|
||||||
if (tmp > 63) return -1; \
|
|
||||||
(dst) = tmp; \
|
|
||||||
}
|
|
||||||
|
|
||||||
static int BF_decode(BF_word *dst, const char *src, int size)
|
|
||||||
{
|
|
||||||
unsigned char *dptr = (unsigned char *)dst;
|
|
||||||
unsigned char *end = dptr + size;
|
|
||||||
const unsigned char *sptr = (const unsigned char *)src;
|
|
||||||
unsigned int tmp, c1, c2, c3, c4;
|
|
||||||
|
|
||||||
do {
|
|
||||||
BF_safe_atoi64(c1, *sptr++);
|
|
||||||
BF_safe_atoi64(c2, *sptr++);
|
|
||||||
*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
|
|
||||||
if (dptr >= end) break;
|
|
||||||
|
|
||||||
BF_safe_atoi64(c3, *sptr++);
|
|
||||||
*dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2);
|
|
||||||
if (dptr >= end) break;
|
|
||||||
|
|
||||||
BF_safe_atoi64(c4, *sptr++);
|
|
||||||
*dptr++ = ((c3 & 0x03) << 6) | c4;
|
|
||||||
} while (dptr < end);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BF_encode(char *dst, const BF_word *src, int size)
|
|
||||||
{
|
|
||||||
const unsigned char *sptr = (const unsigned char *)src;
|
|
||||||
const unsigned char *end = sptr + size;
|
|
||||||
unsigned char *dptr = (unsigned char *)dst;
|
|
||||||
unsigned int c1, c2;
|
|
||||||
|
|
||||||
do {
|
|
||||||
c1 = *sptr++;
|
|
||||||
*dptr++ = BF_itoa64[c1 >> 2];
|
|
||||||
c1 = (c1 & 0x03) << 4;
|
|
||||||
if (sptr >= end) {
|
|
||||||
*dptr++ = BF_itoa64[c1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
c2 = *sptr++;
|
|
||||||
c1 |= c2 >> 4;
|
|
||||||
*dptr++ = BF_itoa64[c1];
|
|
||||||
c1 = (c2 & 0x0f) << 2;
|
|
||||||
if (sptr >= end) {
|
|
||||||
*dptr++ = BF_itoa64[c1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
c2 = *sptr++;
|
|
||||||
c1 |= c2 >> 6;
|
|
||||||
*dptr++ = BF_itoa64[c1];
|
|
||||||
*dptr++ = BF_itoa64[c2 & 0x3f];
|
|
||||||
} while (sptr < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BF_swap(BF_word *x, int count)
|
|
||||||
{
|
|
||||||
static int endianness_check = 1;
|
|
||||||
char *is_little_endian = (char *)&endianness_check;
|
|
||||||
BF_word tmp;
|
|
||||||
|
|
||||||
if (*is_little_endian)
|
|
||||||
do {
|
|
||||||
tmp = *x;
|
|
||||||
tmp = (tmp << 16) | (tmp >> 16);
|
|
||||||
*x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
|
|
||||||
} while (--count);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if BF_SCALE
|
|
||||||
/* Architectures which can shift addresses left by 2 bits with no extra cost */
|
|
||||||
#define BF_ROUND(L, R, N) \
|
|
||||||
tmp1 = L & 0xFF; \
|
|
||||||
tmp2 = L >> 8; \
|
|
||||||
tmp2 &= 0xFF; \
|
|
||||||
tmp3 = L >> 16; \
|
|
||||||
tmp3 &= 0xFF; \
|
|
||||||
tmp4 = L >> 24; \
|
|
||||||
tmp1 = data.ctx.S[3][tmp1]; \
|
|
||||||
tmp2 = data.ctx.S[2][tmp2]; \
|
|
||||||
tmp3 = data.ctx.S[1][tmp3]; \
|
|
||||||
tmp3 += data.ctx.S[0][tmp4]; \
|
|
||||||
tmp3 ^= tmp2; \
|
|
||||||
R ^= data.ctx.P[N + 1]; \
|
|
||||||
tmp3 += tmp1; \
|
|
||||||
R ^= tmp3;
|
|
||||||
#else
|
|
||||||
/* Architectures with no complicated addressing modes supported */
|
|
||||||
#define BF_INDEX(S, i) \
|
|
||||||
(*((BF_word *)(((unsigned char *)S) + (i))))
|
|
||||||
#define BF_ROUND(L, R, N) \
|
|
||||||
tmp1 = L & 0xFF; \
|
|
||||||
tmp1 <<= 2; \
|
|
||||||
tmp2 = L >> 6; \
|
|
||||||
tmp2 &= 0x3FC; \
|
|
||||||
tmp3 = L >> 14; \
|
|
||||||
tmp3 &= 0x3FC; \
|
|
||||||
tmp4 = L >> 22; \
|
|
||||||
tmp4 &= 0x3FC; \
|
|
||||||
tmp1 = BF_INDEX(data.ctx.S[3], tmp1); \
|
|
||||||
tmp2 = BF_INDEX(data.ctx.S[2], tmp2); \
|
|
||||||
tmp3 = BF_INDEX(data.ctx.S[1], tmp3); \
|
|
||||||
tmp3 += BF_INDEX(data.ctx.S[0], tmp4); \
|
|
||||||
tmp3 ^= tmp2; \
|
|
||||||
R ^= data.ctx.P[N + 1]; \
|
|
||||||
tmp3 += tmp1; \
|
|
||||||
R ^= tmp3;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encrypt one block, BF_N is hardcoded here.
|
|
||||||
*/
|
|
||||||
#define BF_ENCRYPT \
|
|
||||||
L ^= data.ctx.P[0]; \
|
|
||||||
BF_ROUND(L, R, 0); \
|
|
||||||
BF_ROUND(R, L, 1); \
|
|
||||||
BF_ROUND(L, R, 2); \
|
|
||||||
BF_ROUND(R, L, 3); \
|
|
||||||
BF_ROUND(L, R, 4); \
|
|
||||||
BF_ROUND(R, L, 5); \
|
|
||||||
BF_ROUND(L, R, 6); \
|
|
||||||
BF_ROUND(R, L, 7); \
|
|
||||||
BF_ROUND(L, R, 8); \
|
|
||||||
BF_ROUND(R, L, 9); \
|
|
||||||
BF_ROUND(L, R, 10); \
|
|
||||||
BF_ROUND(R, L, 11); \
|
|
||||||
BF_ROUND(L, R, 12); \
|
|
||||||
BF_ROUND(R, L, 13); \
|
|
||||||
BF_ROUND(L, R, 14); \
|
|
||||||
BF_ROUND(R, L, 15); \
|
|
||||||
tmp4 = R; \
|
|
||||||
R = L; \
|
|
||||||
L = tmp4 ^ data.ctx.P[BF_N + 1];
|
|
||||||
|
|
||||||
#if BF_ASM
|
|
||||||
#define BF_body() \
|
|
||||||
_BF_body_r(&data.ctx);
|
|
||||||
#else
|
|
||||||
#define BF_body() \
|
|
||||||
L = R = 0; \
|
|
||||||
ptr = data.ctx.P; \
|
|
||||||
do { \
|
|
||||||
ptr += 2; \
|
|
||||||
BF_ENCRYPT; \
|
|
||||||
*(ptr - 2) = L; \
|
|
||||||
*(ptr - 1) = R; \
|
|
||||||
} while (ptr < &data.ctx.P[BF_N + 2]); \
|
|
||||||
\
|
|
||||||
ptr = data.ctx.S[0]; \
|
|
||||||
do { \
|
|
||||||
ptr += 2; \
|
|
||||||
BF_ENCRYPT; \
|
|
||||||
*(ptr - 2) = L; \
|
|
||||||
*(ptr - 1) = R; \
|
|
||||||
} while (ptr < &data.ctx.S[3][0xFF]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
|
|
||||||
unsigned char flags)
|
|
||||||
{
|
|
||||||
const char *ptr = key;
|
|
||||||
unsigned int bug, i, j;
|
|
||||||
BF_word safety, sign, diff, tmp[2];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There was a sign extension bug in older revisions of this function. While
|
|
||||||
* we would have liked to simply fix the bug and move on, we have to provide
|
|
||||||
* a backwards compatibility feature (essentially the bug) for some systems and
|
|
||||||
* a safety measure for some others. The latter is needed because for certain
|
|
||||||
* multiple inputs to the buggy algorithm there exist easily found inputs to
|
|
||||||
* the correct algorithm that produce the same hash. Thus, we optionally
|
|
||||||
* deviate from the correct algorithm just enough to avoid such collisions.
|
|
||||||
* While the bug itself affected the majority of passwords containing
|
|
||||||
* characters with the 8th bit set (although only a percentage of those in a
|
|
||||||
* collision-producing way), the anti-collision safety measure affects
|
|
||||||
* only a subset of passwords containing the '\xff' character (not even all of
|
|
||||||
* those passwords, just some of them). This character is not found in valid
|
|
||||||
* UTF-8 sequences and is rarely used in popular 8-bit character encodings.
|
|
||||||
* Thus, the safety measure is unlikely to cause much annoyance, and is a
|
|
||||||
* reasonable tradeoff to use when authenticating against existing hashes that
|
|
||||||
* are not reliably known to have been computed with the correct algorithm.
|
|
||||||
*
|
|
||||||
* We use an approach that tries to minimize side-channel leaks of password
|
|
||||||
* information - that is, we mostly use fixed-cost bitwise operations instead
|
|
||||||
* of branches or table lookups. (One conditional branch based on password
|
|
||||||
* length remains. It is not part of the bug aftermath, though, and is
|
|
||||||
* difficult and possibly unreasonable to avoid given the use of C strings by
|
|
||||||
* the caller, which results in similar timing leaks anyway.)
|
|
||||||
*
|
|
||||||
* For actual implementation, we set an array index in the variable "bug"
|
|
||||||
* (0 means no bug, 1 means sign extension bug emulation) and a flag in the
|
|
||||||
* variable "safety" (bit 16 is set when the safety measure is requested).
|
|
||||||
* Valid combinations of settings are:
|
|
||||||
*
|
|
||||||
* Prefix "$2a$": bug = 0, safety = 0x10000
|
|
||||||
* Prefix "$2b$": bug = 0, safety = 0
|
|
||||||
* Prefix "$2x$": bug = 1, safety = 0
|
|
||||||
* Prefix "$2y$": bug = 0, safety = 0
|
|
||||||
*/
|
|
||||||
bug = (unsigned int)flags & 1;
|
|
||||||
safety = ((BF_word)flags & 2) << 15;
|
|
||||||
|
|
||||||
sign = diff = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < BF_N + 2; i++) {
|
|
||||||
tmp[0] = tmp[1] = 0;
|
|
||||||
for (j = 0; j < 4; j++) {
|
|
||||||
tmp[0] <<= 8;
|
|
||||||
tmp[0] |= (unsigned char)*ptr; /* correct */
|
|
||||||
tmp[1] <<= 8;
|
|
||||||
tmp[1] |= (BF_word_signed)(signed char)*ptr; /* bug */
|
|
||||||
/*
|
|
||||||
* Sign extension in the first char has no effect - nothing to overwrite yet,
|
|
||||||
* and those extra 24 bits will be fully shifted out of the 32-bit word. For
|
|
||||||
* chars 2, 3, 4 in each four-char block, we set bit 7 of "sign" if sign
|
|
||||||
* extension in tmp[1] occurs. Once this flag is set, it remains set.
|
|
||||||
*/
|
|
||||||
if (j)
|
|
||||||
sign |= tmp[1] & 0x80;
|
|
||||||
if (!*ptr)
|
|
||||||
ptr = key;
|
|
||||||
else
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
diff |= tmp[0] ^ tmp[1]; /* Non-zero on any differences */
|
|
||||||
|
|
||||||
expanded[i] = tmp[bug];
|
|
||||||
initial[i] = BF_init_state.P[i] ^ tmp[bug];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* At this point, "diff" is zero iff the correct and buggy algorithms produced
|
|
||||||
* exactly the same result. If so and if "sign" is non-zero, which indicates
|
|
||||||
* that there was a non-benign sign extension, this means that we have a
|
|
||||||
* collision between the correctly computed hash for this password and a set of
|
|
||||||
* passwords that could be supplied to the buggy algorithm. Our safety measure
|
|
||||||
* is meant to protect from such many-buggy to one-correct collisions, by
|
|
||||||
* deviating from the correct algorithm in such cases. Let's check for this.
|
|
||||||
*/
|
|
||||||
diff |= diff >> 16; /* still zero iff exact match */
|
|
||||||
diff &= 0xffff; /* ditto */
|
|
||||||
diff += 0xffff; /* bit 16 set iff "diff" was non-zero (on non-match) */
|
|
||||||
sign <<= 9; /* move the non-benign sign extension flag to bit 16 */
|
|
||||||
sign &= ~diff & safety; /* action needed? */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we have determined that we need to deviate from the correct algorithm,
|
|
||||||
* flip bit 16 in initial expanded key. (The choice of 16 is arbitrary, but
|
|
||||||
* let's stick to it now. It came out of the approach we used above, and it's
|
|
||||||
* not any worse than any other choice we could make.)
|
|
||||||
*
|
|
||||||
* It is crucial that we don't do the same to the expanded key used in the main
|
|
||||||
* Eksblowfish loop. By doing it to only one of these two, we deviate from a
|
|
||||||
* state that could be directly specified by a password to the buggy algorithm
|
|
||||||
* (and to the fully correct one as well, but that's a side-effect).
|
|
||||||
*/
|
|
||||||
initial[0] ^= sign;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const unsigned char flags_by_subtype[26] =
|
|
||||||
{2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0};
|
|
||||||
|
|
||||||
static char *BF_crypt(const char *key, const char *setting,
|
|
||||||
char *output, int size,
|
|
||||||
BF_word min)
|
|
||||||
{
|
|
||||||
#if BF_ASM
|
|
||||||
extern void _BF_body_r(BF_ctx *ctx);
|
|
||||||
#endif
|
|
||||||
struct {
|
|
||||||
BF_ctx ctx;
|
|
||||||
BF_key expanded_key;
|
|
||||||
union {
|
|
||||||
BF_word salt[4];
|
|
||||||
BF_word output[6];
|
|
||||||
} binary;
|
|
||||||
} data;
|
|
||||||
BF_word L, R;
|
|
||||||
BF_word tmp1, tmp2, tmp3, tmp4;
|
|
||||||
BF_word *ptr;
|
|
||||||
BF_word count;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (size < 7 + 22 + 31 + 1) {
|
|
||||||
__set_errno(ERANGE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (setting[0] != '$' ||
|
|
||||||
setting[1] != '2' ||
|
|
||||||
setting[2] < 'a' || setting[2] > 'z' ||
|
|
||||||
!flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a'] ||
|
|
||||||
setting[3] != '$' ||
|
|
||||||
setting[4] < '0' || setting[4] > '3' ||
|
|
||||||
setting[5] < '0' || setting[5] > '9' ||
|
|
||||||
(setting[4] == '3' && setting[5] > '1') ||
|
|
||||||
setting[6] != '$') {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = (BF_word)1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
|
|
||||||
if (count < min || BF_decode(data.binary.salt, &setting[7], 16)) {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
BF_swap(data.binary.salt, 4);
|
|
||||||
|
|
||||||
BF_set_key(key, data.expanded_key, data.ctx.P,
|
|
||||||
flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a']);
|
|
||||||
|
|
||||||
memcpy(data.ctx.S, BF_init_state.S, sizeof(data.ctx.S));
|
|
||||||
|
|
||||||
L = R = 0;
|
|
||||||
for (i = 0; i < BF_N + 2; i += 2) {
|
|
||||||
L ^= data.binary.salt[i & 2];
|
|
||||||
R ^= data.binary.salt[(i & 2) + 1];
|
|
||||||
BF_ENCRYPT;
|
|
||||||
data.ctx.P[i] = L;
|
|
||||||
data.ctx.P[i + 1] = R;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = data.ctx.S[0];
|
|
||||||
do {
|
|
||||||
ptr += 4;
|
|
||||||
L ^= data.binary.salt[(BF_N + 2) & 3];
|
|
||||||
R ^= data.binary.salt[(BF_N + 3) & 3];
|
|
||||||
BF_ENCRYPT;
|
|
||||||
*(ptr - 4) = L;
|
|
||||||
*(ptr - 3) = R;
|
|
||||||
|
|
||||||
L ^= data.binary.salt[(BF_N + 4) & 3];
|
|
||||||
R ^= data.binary.salt[(BF_N + 5) & 3];
|
|
||||||
BF_ENCRYPT;
|
|
||||||
*(ptr - 2) = L;
|
|
||||||
*(ptr - 1) = R;
|
|
||||||
} while (ptr < &data.ctx.S[3][0xFF]);
|
|
||||||
|
|
||||||
do {
|
|
||||||
int done;
|
|
||||||
|
|
||||||
for (i = 0; i < BF_N + 2; i += 2) {
|
|
||||||
data.ctx.P[i] ^= data.expanded_key[i];
|
|
||||||
data.ctx.P[i + 1] ^= data.expanded_key[i + 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
done = 0;
|
|
||||||
do {
|
|
||||||
BF_body();
|
|
||||||
if (done)
|
|
||||||
break;
|
|
||||||
done = 1;
|
|
||||||
|
|
||||||
tmp1 = data.binary.salt[0];
|
|
||||||
tmp2 = data.binary.salt[1];
|
|
||||||
tmp3 = data.binary.salt[2];
|
|
||||||
tmp4 = data.binary.salt[3];
|
|
||||||
for (i = 0; i < BF_N; i += 4) {
|
|
||||||
data.ctx.P[i] ^= tmp1;
|
|
||||||
data.ctx.P[i + 1] ^= tmp2;
|
|
||||||
data.ctx.P[i + 2] ^= tmp3;
|
|
||||||
data.ctx.P[i + 3] ^= tmp4;
|
|
||||||
}
|
|
||||||
data.ctx.P[16] ^= tmp1;
|
|
||||||
data.ctx.P[17] ^= tmp2;
|
|
||||||
} while (1);
|
|
||||||
} while (--count);
|
|
||||||
|
|
||||||
for (i = 0; i < 6; i += 2) {
|
|
||||||
L = BF_magic_w[i];
|
|
||||||
R = BF_magic_w[i + 1];
|
|
||||||
|
|
||||||
count = 64;
|
|
||||||
do {
|
|
||||||
BF_ENCRYPT;
|
|
||||||
} while (--count);
|
|
||||||
|
|
||||||
data.binary.output[i] = L;
|
|
||||||
data.binary.output[i + 1] = R;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(output, setting, 7 + 22 - 1);
|
|
||||||
output[7 + 22 - 1] = BF_itoa64[(int)
|
|
||||||
BF_atoi64[(int)setting[7 + 22 - 1] - 0x20] & 0x30];
|
|
||||||
|
|
||||||
/* This has to be bug-compatible with the original implementation, so
|
|
||||||
* only encode 23 of the 24 bytes. :-) */
|
|
||||||
BF_swap(data.binary.output, 6);
|
|
||||||
BF_encode(&output[7 + 22], data.binary.output, 23);
|
|
||||||
output[7 + 22 + 31] = '\0';
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _crypt_output_magic(const char *setting, char *output, int size)
|
|
||||||
{
|
|
||||||
if (size < 3)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
output[0] = '*';
|
|
||||||
output[1] = '0';
|
|
||||||
output[2] = '\0';
|
|
||||||
|
|
||||||
if (setting[0] == '*' && setting[1] == '0')
|
|
||||||
output[1] = '1';
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Please preserve the runtime self-test. It serves two purposes at once:
|
|
||||||
*
|
|
||||||
* 1. We really can't afford the risk of producing incompatible hashes e.g.
|
|
||||||
* when there's something like gcc bug 26587 again, whereas an application or
|
|
||||||
* library integrating this code might not also integrate our external tests or
|
|
||||||
* it might not run them after every build. Even if it does, the miscompile
|
|
||||||
* might only occur on the production build, but not on a testing build (such
|
|
||||||
* as because of different optimization settings). It is painful to recover
|
|
||||||
* from incorrectly-computed hashes - merely fixing whatever broke is not
|
|
||||||
* enough. Thus, a proactive measure like this self-test is needed.
|
|
||||||
*
|
|
||||||
* 2. We don't want to leave sensitive data from our actual password hash
|
|
||||||
* computation on the stack or in registers. Previous revisions of the code
|
|
||||||
* would do explicit cleanups, but simply running the self-test after hash
|
|
||||||
* computation is more reliable.
|
|
||||||
*
|
|
||||||
* The performance cost of this quick self-test is around 0.6% at the "$2a$08"
|
|
||||||
* setting.
|
|
||||||
*/
|
|
||||||
char *_crypt_blowfish_rn(const char *key, const char *setting,
|
|
||||||
char *output, int size)
|
|
||||||
{
|
|
||||||
const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
|
|
||||||
const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu";
|
|
||||||
static const char * const test_hashes[2] =
|
|
||||||
{"i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55", /* 'a', 'b', 'y' */
|
|
||||||
"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55"}; /* 'x' */
|
|
||||||
const char *test_hash = test_hashes[0];
|
|
||||||
char *retval;
|
|
||||||
const char *p;
|
|
||||||
int save_errno, ok;
|
|
||||||
struct {
|
|
||||||
char s[7 + 22 + 1];
|
|
||||||
char o[7 + 22 + 31 + 1 + 1 + 1];
|
|
||||||
} buf;
|
|
||||||
|
|
||||||
/* Hash the supplied password */
|
|
||||||
_crypt_output_magic(setting, output, size);
|
|
||||||
retval = BF_crypt(key, setting, output, size, 16);
|
|
||||||
save_errno = errno;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do a quick self-test. It is important that we make both calls to BF_crypt()
|
|
||||||
* from the same scope such that they likely use the same stack locations,
|
|
||||||
* which makes the second call overwrite the first call's sensitive data on the
|
|
||||||
* stack and makes it more likely that any alignment related issues would be
|
|
||||||
* detected by the self-test.
|
|
||||||
*/
|
|
||||||
memcpy(buf.s, test_setting, sizeof(buf.s));
|
|
||||||
if (retval) {
|
|
||||||
unsigned int flags = flags_by_subtype[
|
|
||||||
(unsigned int)(unsigned char)setting[2] - 'a'];
|
|
||||||
test_hash = test_hashes[flags & 1];
|
|
||||||
buf.s[2] = setting[2];
|
|
||||||
}
|
|
||||||
memset(buf.o, 0x55, sizeof(buf.o));
|
|
||||||
buf.o[sizeof(buf.o) - 1] = 0;
|
|
||||||
p = BF_crypt(test_key, buf.s, buf.o, sizeof(buf.o) - (1 + 1), 1);
|
|
||||||
|
|
||||||
ok = (p == buf.o &&
|
|
||||||
!memcmp(p, buf.s, 7 + 22) &&
|
|
||||||
!memcmp(p + (7 + 22), test_hash, 31 + 1 + 1 + 1));
|
|
||||||
|
|
||||||
{
|
|
||||||
const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345";
|
|
||||||
BF_key ae, ai, ye, yi;
|
|
||||||
BF_set_key(k, ae, ai, 2); /* $2a$ */
|
|
||||||
BF_set_key(k, ye, yi, 4); /* $2y$ */
|
|
||||||
ai[0] ^= 0x10000; /* undo the safety (for comparison) */
|
|
||||||
ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 &&
|
|
||||||
!memcmp(ae, ye, sizeof(ae)) &&
|
|
||||||
!memcmp(ai, yi, sizeof(ai));
|
|
||||||
}
|
|
||||||
|
|
||||||
__set_errno(save_errno);
|
|
||||||
if (ok)
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
/* Should not happen */
|
|
||||||
_crypt_output_magic(setting, output, size);
|
|
||||||
__set_errno(EINVAL); /* pretend we don't support this hash type */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *_crypt_gensalt_blowfish_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size)
|
|
||||||
{
|
|
||||||
if (size < 16 || output_size < 7 + 22 + 1 ||
|
|
||||||
(count && (count < 4 || count > 31)) ||
|
|
||||||
prefix[0] != '$' || prefix[1] != '2' ||
|
|
||||||
(prefix[2] != 'a' && prefix[2] != 'b' && prefix[2] != 'y')) {
|
|
||||||
if (output_size > 0) output[0] = '\0';
|
|
||||||
__set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!count) count = 5;
|
|
||||||
|
|
||||||
output[0] = '$';
|
|
||||||
output[1] = '2';
|
|
||||||
output[2] = prefix[2];
|
|
||||||
output[3] = '$';
|
|
||||||
output[4] = '0' + count / 10;
|
|
||||||
output[5] = '0' + count % 10;
|
|
||||||
output[6] = '$';
|
|
||||||
|
|
||||||
BF_encode(&output[7], (const BF_word *)input, 16);
|
|
||||||
output[7 + 22] = '\0';
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
27
deps/crypt_blowfish/crypt_blowfish.h
vendored
27
deps/crypt_blowfish/crypt_blowfish.h
vendored
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _CRYPT_BLOWFISH_H
|
|
||||||
#define _CRYPT_BLOWFISH_H
|
|
||||||
|
|
||||||
extern int _crypt_output_magic(const char *setting, char *output, int size);
|
|
||||||
extern char *_crypt_blowfish_rn(const char *key, const char *setting,
|
|
||||||
char *output, int size);
|
|
||||||
extern char *_crypt_gensalt_blowfish_rn(const char *prefix,
|
|
||||||
unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size);
|
|
||||||
|
|
||||||
#endif
|
|
124
deps/crypt_blowfish/crypt_gensalt.c
vendored
124
deps/crypt_blowfish/crypt_gensalt.c
vendored
@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*
|
|
||||||
* This file contains salt generation functions for the traditional and
|
|
||||||
* other common crypt(3) algorithms, except for bcrypt which is defined
|
|
||||||
* entirely in crypt_blowfish.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#ifndef __set_errno
|
|
||||||
#define __set_errno(val) errno = (val)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Just to make sure the prototypes match the actual definitions */
|
|
||||||
#include "crypt_gensalt.h"
|
|
||||||
|
|
||||||
unsigned char _crypt_itoa64[64 + 1] =
|
|
||||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
||||||
|
|
||||||
char *_crypt_gensalt_traditional_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size)
|
|
||||||
{
|
|
||||||
(void) prefix;
|
|
||||||
|
|
||||||
if (size < 2 || output_size < 2 + 1 || (count && count != 25)) {
|
|
||||||
if (output_size > 0) output[0] = '\0';
|
|
||||||
__set_errno((output_size < 2 + 1) ? ERANGE : EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
output[0] = _crypt_itoa64[(unsigned int)input[0] & 0x3f];
|
|
||||||
output[1] = _crypt_itoa64[(unsigned int)input[1] & 0x3f];
|
|
||||||
output[2] = '\0';
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *_crypt_gensalt_extended_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size)
|
|
||||||
{
|
|
||||||
unsigned long value;
|
|
||||||
|
|
||||||
(void) prefix;
|
|
||||||
|
|
||||||
/* Even iteration counts make it easier to detect weak DES keys from a look
|
|
||||||
* at the hash, so they should be avoided */
|
|
||||||
if (size < 3 || output_size < 1 + 4 + 4 + 1 ||
|
|
||||||
(count && (count > 0xffffff || !(count & 1)))) {
|
|
||||||
if (output_size > 0) output[0] = '\0';
|
|
||||||
__set_errno((output_size < 1 + 4 + 4 + 1) ? ERANGE : EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!count) count = 725;
|
|
||||||
|
|
||||||
output[0] = '_';
|
|
||||||
output[1] = _crypt_itoa64[count & 0x3f];
|
|
||||||
output[2] = _crypt_itoa64[(count >> 6) & 0x3f];
|
|
||||||
output[3] = _crypt_itoa64[(count >> 12) & 0x3f];
|
|
||||||
output[4] = _crypt_itoa64[(count >> 18) & 0x3f];
|
|
||||||
value = (unsigned long)(unsigned char)input[0] |
|
|
||||||
((unsigned long)(unsigned char)input[1] << 8) |
|
|
||||||
((unsigned long)(unsigned char)input[2] << 16);
|
|
||||||
output[5] = _crypt_itoa64[value & 0x3f];
|
|
||||||
output[6] = _crypt_itoa64[(value >> 6) & 0x3f];
|
|
||||||
output[7] = _crypt_itoa64[(value >> 12) & 0x3f];
|
|
||||||
output[8] = _crypt_itoa64[(value >> 18) & 0x3f];
|
|
||||||
output[9] = '\0';
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *_crypt_gensalt_md5_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size)
|
|
||||||
{
|
|
||||||
unsigned long value;
|
|
||||||
|
|
||||||
(void) prefix;
|
|
||||||
|
|
||||||
if (size < 3 || output_size < 3 + 4 + 1 || (count && count != 1000)) {
|
|
||||||
if (output_size > 0) output[0] = '\0';
|
|
||||||
__set_errno((output_size < 3 + 4 + 1) ? ERANGE : EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
output[0] = '$';
|
|
||||||
output[1] = '1';
|
|
||||||
output[2] = '$';
|
|
||||||
value = (unsigned long)(unsigned char)input[0] |
|
|
||||||
((unsigned long)(unsigned char)input[1] << 8) |
|
|
||||||
((unsigned long)(unsigned char)input[2] << 16);
|
|
||||||
output[3] = _crypt_itoa64[value & 0x3f];
|
|
||||||
output[4] = _crypt_itoa64[(value >> 6) & 0x3f];
|
|
||||||
output[5] = _crypt_itoa64[(value >> 12) & 0x3f];
|
|
||||||
output[6] = _crypt_itoa64[(value >> 18) & 0x3f];
|
|
||||||
output[7] = '\0';
|
|
||||||
|
|
||||||
if (size >= 6 && output_size >= 3 + 4 + 4 + 1) {
|
|
||||||
value = (unsigned long)(unsigned char)input[3] |
|
|
||||||
((unsigned long)(unsigned char)input[4] << 8) |
|
|
||||||
((unsigned long)(unsigned char)input[5] << 16);
|
|
||||||
output[7] = _crypt_itoa64[value & 0x3f];
|
|
||||||
output[8] = _crypt_itoa64[(value >> 6) & 0x3f];
|
|
||||||
output[9] = _crypt_itoa64[(value >> 12) & 0x3f];
|
|
||||||
output[10] = _crypt_itoa64[(value >> 18) & 0x3f];
|
|
||||||
output[11] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
30
deps/crypt_blowfish/crypt_gensalt.h
vendored
30
deps/crypt_blowfish/crypt_gensalt.h
vendored
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _CRYPT_GENSALT_H
|
|
||||||
#define _CRYPT_GENSALT_H
|
|
||||||
|
|
||||||
extern unsigned char _crypt_itoa64[];
|
|
||||||
extern char *_crypt_gensalt_traditional_rn(const char *prefix,
|
|
||||||
unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size);
|
|
||||||
extern char *_crypt_gensalt_extended_rn(const char *prefix,
|
|
||||||
unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size);
|
|
||||||
extern char *_crypt_gensalt_md5_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size);
|
|
||||||
|
|
||||||
#endif
|
|
53
deps/crypt_blowfish/glibc-2.1.3-crypt.diff
vendored
53
deps/crypt_blowfish/glibc-2.1.3-crypt.diff
vendored
@ -1,53 +0,0 @@
|
|||||||
--- glibc-2.1.3.orig/crypt/sysdeps/unix/Makefile 1997-03-05 00:33:59 +0000
|
|
||||||
+++ glibc-2.1.3/crypt/sysdeps/unix/Makefile 2000-06-11 03:13:41 +0000
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
ifeq ($(subdir),md5-crypt)
|
|
||||||
-libcrypt-routines += crypt crypt_util
|
|
||||||
-dont_distribute += crypt.c crypt_util.c
|
|
||||||
+libcrypt-routines += crypt crypt_util crypt_blowfish x86 crypt_gensalt wrapper
|
|
||||||
+dont_distribute += crypt.c crypt_util.c crypt_blowfish.c x86.S crypt_gensalt.c wrapper.c
|
|
||||||
endif
|
|
||||||
--- glibc-2.1.3.orig/crypt/sysdeps/unix/crypt-entry.c 1998-12-10 12:49:04 +0000
|
|
||||||
+++ glibc-2.1.3/crypt/sysdeps/unix/crypt-entry.c 2000-06-11 03:14:57 +0000
|
|
||||||
@@ -70,7 +70,7 @@ extern struct crypt_data _ufc_foobar;
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
-__crypt_r (key, salt, data)
|
|
||||||
+__des_crypt_r (key, salt, data)
|
|
||||||
const char *key;
|
|
||||||
const char *salt;
|
|
||||||
struct crypt_data * __restrict data;
|
|
||||||
@@ -115,6 +115,7 @@ __crypt_r (key, salt, data)
|
|
||||||
_ufc_output_conversion_r (res[0], res[1], salt, data);
|
|
||||||
return data->crypt_3_buf;
|
|
||||||
}
|
|
||||||
+#if 0
|
|
||||||
weak_alias (__crypt_r, crypt_r)
|
|
||||||
|
|
||||||
char *
|
|
||||||
@@ -147,3 +148,4 @@ __fcrypt (key, salt)
|
|
||||||
return crypt (key, salt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
+#endif
|
|
||||||
--- glibc-2.1.3.orig/md5-crypt/Makefile 1998-07-02 22:46:47 +0000
|
|
||||||
+++ glibc-2.1.3/md5-crypt/Makefile 2000-06-11 03:12:34 +0000
|
|
||||||
@@ -21,7 +21,7 @@
|
|
||||||
#
|
|
||||||
subdir := md5-crypt
|
|
||||||
|
|
||||||
-headers := crypt.h
|
|
||||||
+headers := crypt.h gnu-crypt.h ow-crypt.h
|
|
||||||
|
|
||||||
distribute := md5.h
|
|
||||||
|
|
||||||
--- glibc-2.1.3.orig/md5-crypt/Versions 1998-07-02 22:32:07 +0000
|
|
||||||
+++ glibc-2.1.3/md5-crypt/Versions 2000-06-11 09:11:03 +0000
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
libcrypt {
|
|
||||||
GLIBC_2.0 {
|
|
||||||
crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r;
|
|
||||||
+ crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra;
|
|
||||||
}
|
|
||||||
}
|
|
55
deps/crypt_blowfish/glibc-2.14-crypt.diff
vendored
55
deps/crypt_blowfish/glibc-2.14-crypt.diff
vendored
@ -1,55 +0,0 @@
|
|||||||
diff -urp glibc-2.14.orig/crypt/Makefile glibc-2.14/crypt/Makefile
|
|
||||||
--- glibc-2.14.orig/crypt/Makefile 2011-05-31 04:12:33 +0000
|
|
||||||
+++ glibc-2.14/crypt/Makefile 2011-07-16 21:40:56 +0000
|
|
||||||
@@ -22,6 +22,7 @@
|
|
||||||
subdir := crypt
|
|
||||||
|
|
||||||
headers := crypt.h
|
|
||||||
+headers += gnu-crypt.h ow-crypt.h
|
|
||||||
|
|
||||||
extra-libs := libcrypt
|
|
||||||
extra-libs-others := $(extra-libs)
|
|
||||||
@@ -29,6 +30,8 @@ extra-libs-others := $(extra-libs)
|
|
||||||
libcrypt-routines := crypt-entry md5-crypt sha256-crypt sha512-crypt crypt \
|
|
||||||
crypt_util
|
|
||||||
|
|
||||||
+libcrypt-routines += crypt_blowfish x86 crypt_gensalt wrapper
|
|
||||||
+
|
|
||||||
tests := cert md5c-test sha256c-test sha512c-test
|
|
||||||
|
|
||||||
distribute := ufc-crypt.h crypt-private.h ufc.c speeds.c README.ufc-crypt \
|
|
||||||
diff -urp glibc-2.14.orig/crypt/Versions glibc-2.14/crypt/Versions
|
|
||||||
--- glibc-2.14.orig/crypt/Versions 2011-05-31 04:12:33 +0000
|
|
||||||
+++ glibc-2.14/crypt/Versions 2011-07-16 21:40:56 +0000
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
libcrypt {
|
|
||||||
GLIBC_2.0 {
|
|
||||||
crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r;
|
|
||||||
+ crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff -urp glibc-2.14.orig/crypt/crypt-entry.c glibc-2.14/crypt/crypt-entry.c
|
|
||||||
--- glibc-2.14.orig/crypt/crypt-entry.c 2011-05-31 04:12:33 +0000
|
|
||||||
+++ glibc-2.14/crypt/crypt-entry.c 2011-07-16 21:40:56 +0000
|
|
||||||
@@ -82,7 +82,7 @@ extern struct crypt_data _ufc_foobar;
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
-__crypt_r (key, salt, data)
|
|
||||||
+__des_crypt_r (key, salt, data)
|
|
||||||
const char *key;
|
|
||||||
const char *salt;
|
|
||||||
struct crypt_data * __restrict data;
|
|
||||||
@@ -137,6 +137,7 @@ __crypt_r (key, salt, data)
|
|
||||||
_ufc_output_conversion_r (res[0], res[1], salt, data);
|
|
||||||
return data->crypt_3_buf;
|
|
||||||
}
|
|
||||||
+#if 0
|
|
||||||
weak_alias (__crypt_r, crypt_r)
|
|
||||||
|
|
||||||
char *
|
|
||||||
@@ -177,3 +178,4 @@ __fcrypt (key, salt)
|
|
||||||
return crypt (key, salt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
+#endif
|
|
52
deps/crypt_blowfish/glibc-2.3.6-crypt.diff
vendored
52
deps/crypt_blowfish/glibc-2.3.6-crypt.diff
vendored
@ -1,52 +0,0 @@
|
|||||||
--- glibc-2.3.6.orig/crypt/Makefile 2001-07-06 04:54:45 +0000
|
|
||||||
+++ glibc-2.3.6/crypt/Makefile 2004-02-27 00:23:48 +0000
|
|
||||||
@@ -21,14 +21,14 @@
|
|
||||||
#
|
|
||||||
subdir := crypt
|
|
||||||
|
|
||||||
-headers := crypt.h
|
|
||||||
+headers := crypt.h gnu-crypt.h ow-crypt.h
|
|
||||||
|
|
||||||
distribute := md5.h
|
|
||||||
|
|
||||||
extra-libs := libcrypt
|
|
||||||
extra-libs-others := $(extra-libs)
|
|
||||||
|
|
||||||
-libcrypt-routines := crypt-entry md5-crypt md5 crypt crypt_util
|
|
||||||
+libcrypt-routines := crypt-entry md5-crypt md5 crypt crypt_util crypt_blowfish x86 crypt_gensalt wrapper
|
|
||||||
|
|
||||||
tests = cert md5test md5c-test
|
|
||||||
|
|
||||||
--- glibc-2.3.6.orig/crypt/Versions 2000-03-04 00:47:30 +0000
|
|
||||||
+++ glibc-2.3.6/crypt/Versions 2004-02-27 00:25:15 +0000
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
libcrypt {
|
|
||||||
GLIBC_2.0 {
|
|
||||||
crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r;
|
|
||||||
+ crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
--- glibc-2.3.6.orig/crypt/crypt-entry.c 2001-07-06 05:18:49 +0000
|
|
||||||
+++ glibc-2.3.6/crypt/crypt-entry.c 2004-02-27 00:12:32 +0000
|
|
||||||
@@ -70,7 +70,7 @@ extern struct crypt_data _ufc_foobar;
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
-__crypt_r (key, salt, data)
|
|
||||||
+__des_crypt_r (key, salt, data)
|
|
||||||
const char *key;
|
|
||||||
const char *salt;
|
|
||||||
struct crypt_data * __restrict data;
|
|
||||||
@@ -115,6 +115,7 @@ __crypt_r (key, salt, data)
|
|
||||||
_ufc_output_conversion_r (res[0], res[1], salt, data);
|
|
||||||
return data->crypt_3_buf;
|
|
||||||
}
|
|
||||||
+#if 0
|
|
||||||
weak_alias (__crypt_r, crypt_r)
|
|
||||||
|
|
||||||
char *
|
|
||||||
@@ -147,3 +148,4 @@ __fcrypt (key, salt)
|
|
||||||
return crypt (key, salt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
+#endif
|
|
43
deps/crypt_blowfish/ow-crypt.h
vendored
43
deps/crypt_blowfish/ow-crypt.h
vendored
@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2011.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _OW_CRYPT_H
|
|
||||||
#define _OW_CRYPT_H
|
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#undef __const
|
|
||||||
#define __const const
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __SKIP_GNU
|
|
||||||
extern char *crypt(__const char *key, __const char *setting);
|
|
||||||
extern char *crypt_r(__const char *key, __const char *setting, void *data);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __SKIP_OW
|
|
||||||
extern char *crypt_rn(__const char *key, __const char *setting,
|
|
||||||
void *data, int size);
|
|
||||||
extern char *crypt_ra(__const char *key, __const char *setting,
|
|
||||||
void **data, int *size);
|
|
||||||
extern char *crypt_gensalt(__const char *prefix, unsigned long count,
|
|
||||||
__const char *input, int size);
|
|
||||||
extern char *crypt_gensalt_rn(__const char *prefix, unsigned long count,
|
|
||||||
__const char *input, int size, char *output, int output_size);
|
|
||||||
extern char *crypt_gensalt_ra(__const char *prefix, unsigned long count,
|
|
||||||
__const char *input, int size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
551
deps/crypt_blowfish/wrapper.c
vendored
551
deps/crypt_blowfish/wrapper.c
vendored
@ -1,551 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 2000-2014.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2000-2014 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#ifndef __set_errno
|
|
||||||
#define __set_errno(val) errno = (val)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TEST
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/times.h>
|
|
||||||
#ifdef TEST_THREADS
|
|
||||||
#include <pthread.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CRYPT_OUTPUT_SIZE (7 + 22 + 31 + 1)
|
|
||||||
#define CRYPT_GENSALT_OUTPUT_SIZE (7 + 22 + 1)
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(_LIBC)
|
|
||||||
#define __SKIP_GNU
|
|
||||||
#endif
|
|
||||||
#include "ow-crypt.h"
|
|
||||||
|
|
||||||
#include "crypt_blowfish.h"
|
|
||||||
#include "crypt_gensalt.h"
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(_LIBC)
|
|
||||||
/* crypt.h from glibc-crypt-2.1 will define struct crypt_data for us */
|
|
||||||
#include "crypt.h"
|
|
||||||
extern char *__md5_crypt_r(const char *key, const char *salt,
|
|
||||||
char *buffer, int buflen);
|
|
||||||
/* crypt-entry.c needs to be patched to define __des_crypt_r rather than
|
|
||||||
* __crypt_r, and not define crypt_r and crypt at all */
|
|
||||||
extern char *__des_crypt_r(const char *key, const char *salt,
|
|
||||||
struct crypt_data *data);
|
|
||||||
extern struct crypt_data _ufc_foobar;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int _crypt_data_alloc(void **data, int *size, int need)
|
|
||||||
{
|
|
||||||
void *updated;
|
|
||||||
|
|
||||||
if (*data && *size >= need) return 0;
|
|
||||||
|
|
||||||
updated = realloc(*data, need);
|
|
||||||
|
|
||||||
if (!updated) {
|
|
||||||
#ifndef __GLIBC__
|
|
||||||
/* realloc(3) on glibc sets errno, so we don't need to bother */
|
|
||||||
__set_errno(ENOMEM);
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(_LIBC)
|
|
||||||
if (need >= sizeof(struct crypt_data))
|
|
||||||
((struct crypt_data *)updated)->initialized = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*data = updated;
|
|
||||||
*size = need;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *_crypt_retval_magic(char *retval, const char *setting,
|
|
||||||
char *output, int size)
|
|
||||||
{
|
|
||||||
if (retval)
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
if (_crypt_output_magic(setting, output, size))
|
|
||||||
return NULL; /* shouldn't happen */
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(_LIBC)
|
|
||||||
/*
|
|
||||||
* Applications may re-use the same instance of struct crypt_data without
|
|
||||||
* resetting the initialized field in order to let crypt_r() skip some of
|
|
||||||
* its initialization code. Thus, it is important that our multiple hashing
|
|
||||||
* algorithms either don't conflict with each other in their use of the
|
|
||||||
* data area or reset the initialized field themselves whenever required.
|
|
||||||
* Currently, the hashing algorithms simply have no conflicts: the first
|
|
||||||
* field of struct crypt_data is the 128-byte large DES key schedule which
|
|
||||||
* __des_crypt_r() calculates each time it is called while the two other
|
|
||||||
* hashing algorithms use less than 128 bytes of the data area.
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *__crypt_rn(__const char *key, __const char *setting,
|
|
||||||
void *data, int size)
|
|
||||||
{
|
|
||||||
if (setting[0] == '$' && setting[1] == '2')
|
|
||||||
return _crypt_blowfish_rn(key, setting, (char *)data, size);
|
|
||||||
if (setting[0] == '$' && setting[1] == '1')
|
|
||||||
return __md5_crypt_r(key, setting, (char *)data, size);
|
|
||||||
if (setting[0] == '$' || setting[0] == '_') {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (size >= sizeof(struct crypt_data))
|
|
||||||
return __des_crypt_r(key, setting, (struct crypt_data *)data);
|
|
||||||
__set_errno(ERANGE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__crypt_ra(__const char *key, __const char *setting,
|
|
||||||
void **data, int *size)
|
|
||||||
{
|
|
||||||
if (setting[0] == '$' && setting[1] == '2') {
|
|
||||||
if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE))
|
|
||||||
return NULL;
|
|
||||||
return _crypt_blowfish_rn(key, setting, (char *)*data, *size);
|
|
||||||
}
|
|
||||||
if (setting[0] == '$' && setting[1] == '1') {
|
|
||||||
if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE))
|
|
||||||
return NULL;
|
|
||||||
return __md5_crypt_r(key, setting, (char *)*data, *size);
|
|
||||||
}
|
|
||||||
if (setting[0] == '$' || setting[0] == '_') {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (_crypt_data_alloc(data, size, sizeof(struct crypt_data)))
|
|
||||||
return NULL;
|
|
||||||
return __des_crypt_r(key, setting, (struct crypt_data *)*data);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__crypt_r(__const char *key, __const char *setting,
|
|
||||||
struct crypt_data *data)
|
|
||||||
{
|
|
||||||
return _crypt_retval_magic(
|
|
||||||
__crypt_rn(key, setting, data, sizeof(*data)),
|
|
||||||
setting, (char *)data, sizeof(*data));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__crypt(__const char *key, __const char *setting)
|
|
||||||
{
|
|
||||||
return _crypt_retval_magic(
|
|
||||||
__crypt_rn(key, setting, &_ufc_foobar, sizeof(_ufc_foobar)),
|
|
||||||
setting, (char *)&_ufc_foobar, sizeof(_ufc_foobar));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
char *crypt_rn(const char *key, const char *setting, void *data, int size)
|
|
||||||
{
|
|
||||||
return _crypt_blowfish_rn(key, setting, (char *)data, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *crypt_ra(const char *key, const char *setting,
|
|
||||||
void **data, int *size)
|
|
||||||
{
|
|
||||||
if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE))
|
|
||||||
return NULL;
|
|
||||||
return _crypt_blowfish_rn(key, setting, (char *)*data, *size);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *crypt_r(const char *key, const char *setting, void *data)
|
|
||||||
{
|
|
||||||
return _crypt_retval_magic(
|
|
||||||
crypt_rn(key, setting, data, CRYPT_OUTPUT_SIZE),
|
|
||||||
setting, (char *)data, CRYPT_OUTPUT_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *crypt(const char *key, const char *setting)
|
|
||||||
{
|
|
||||||
static char output[CRYPT_OUTPUT_SIZE];
|
|
||||||
|
|
||||||
return _crypt_retval_magic(
|
|
||||||
crypt_rn(key, setting, output, sizeof(output)),
|
|
||||||
setting, output, sizeof(output));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __crypt_gensalt_rn crypt_gensalt_rn
|
|
||||||
#define __crypt_gensalt_ra crypt_gensalt_ra
|
|
||||||
#define __crypt_gensalt crypt_gensalt
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *__crypt_gensalt_rn(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size, char *output, int output_size)
|
|
||||||
{
|
|
||||||
char *(*use)(const char *_prefix, unsigned long _count,
|
|
||||||
const char *_input, int _size,
|
|
||||||
char *_output, int _output_size);
|
|
||||||
|
|
||||||
/* This may be supported on some platforms in the future */
|
|
||||||
if (!input) {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strncmp(prefix, "$2a$", 4) || !strncmp(prefix, "$2b$", 4) ||
|
|
||||||
!strncmp(prefix, "$2y$", 4))
|
|
||||||
use = _crypt_gensalt_blowfish_rn;
|
|
||||||
else
|
|
||||||
if (!strncmp(prefix, "$1$", 3))
|
|
||||||
use = _crypt_gensalt_md5_rn;
|
|
||||||
else
|
|
||||||
if (prefix[0] == '_')
|
|
||||||
use = _crypt_gensalt_extended_rn;
|
|
||||||
else
|
|
||||||
if (!prefix[0] ||
|
|
||||||
(prefix[0] && prefix[1] &&
|
|
||||||
memchr(_crypt_itoa64, prefix[0], 64) &&
|
|
||||||
memchr(_crypt_itoa64, prefix[1], 64)))
|
|
||||||
use = _crypt_gensalt_traditional_rn;
|
|
||||||
else {
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return use(prefix, count, input, size, output, output_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__crypt_gensalt_ra(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size)
|
|
||||||
{
|
|
||||||
char output[CRYPT_GENSALT_OUTPUT_SIZE];
|
|
||||||
char *retval;
|
|
||||||
|
|
||||||
retval = __crypt_gensalt_rn(prefix, count,
|
|
||||||
input, size, output, sizeof(output));
|
|
||||||
|
|
||||||
if (retval) {
|
|
||||||
retval = strdup(retval);
|
|
||||||
#ifndef __GLIBC__
|
|
||||||
/* strdup(3) on glibc sets errno, so we don't need to bother */
|
|
||||||
if (!retval)
|
|
||||||
__set_errno(ENOMEM);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__crypt_gensalt(const char *prefix, unsigned long count,
|
|
||||||
const char *input, int size)
|
|
||||||
{
|
|
||||||
static char output[CRYPT_GENSALT_OUTPUT_SIZE];
|
|
||||||
|
|
||||||
return __crypt_gensalt_rn(prefix, count,
|
|
||||||
input, size, output, sizeof(output));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(_LIBC)
|
|
||||||
weak_alias(__crypt_rn, crypt_rn)
|
|
||||||
weak_alias(__crypt_ra, crypt_ra)
|
|
||||||
weak_alias(__crypt_r, crypt_r)
|
|
||||||
weak_alias(__crypt, crypt)
|
|
||||||
weak_alias(__crypt_gensalt_rn, crypt_gensalt_rn)
|
|
||||||
weak_alias(__crypt_gensalt_ra, crypt_gensalt_ra)
|
|
||||||
weak_alias(__crypt_gensalt, crypt_gensalt)
|
|
||||||
weak_alias(crypt, fcrypt)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TEST
|
|
||||||
static const char *tests[][3] = {
|
|
||||||
{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW",
|
|
||||||
"U*U"},
|
|
||||||
{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK",
|
|
||||||
"U*U*"},
|
|
||||||
{"$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a",
|
|
||||||
"U*U*U"},
|
|
||||||
{"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui",
|
|
||||||
"0123456789abcdefghijklmnopqrstuvwxyz"
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
||||||
"chars after 72 are ignored"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
|
|
||||||
"\xa3"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
|
|
||||||
"\xff\xff\xa3"},
|
|
||||||
{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
|
|
||||||
"\xff\xff\xa3"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.nqd1wy.pTMdcvrRWxyiGL2eMz.2a85.",
|
|
||||||
"\xff\xff\xa3"},
|
|
||||||
{"$2b$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
|
|
||||||
"\xff\xff\xa3"},
|
|
||||||
{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
|
|
||||||
"\xa3"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
|
|
||||||
"\xa3"},
|
|
||||||
{"$2b$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
|
|
||||||
"\xa3"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
|
|
||||||
"1\xa3" "345"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
|
|
||||||
"\xff\xa3" "345"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
|
|
||||||
"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"},
|
|
||||||
{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
|
|
||||||
"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.ZC1JEJ8Z4gPfpe1JOr/oyPXTWl9EFd.",
|
|
||||||
"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"},
|
|
||||||
{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e",
|
|
||||||
"\xff\xa3" "345"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e",
|
|
||||||
"\xff\xa3" "345"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
|
|
||||||
"\xa3" "ab"},
|
|
||||||
{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
|
|
||||||
"\xa3" "ab"},
|
|
||||||
{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
|
|
||||||
"\xa3" "ab"},
|
|
||||||
{"$2x$05$6bNw2HLQYeqHYyBfLMsv/OiwqTymGIGzFsA4hOTWebfehXHNprcAS",
|
|
||||||
"\xd1\x91"},
|
|
||||||
{"$2x$05$6bNw2HLQYeqHYyBfLMsv/O9LIGgn8OMzuDoHfof8AQimSGfcSWxnS",
|
|
||||||
"\xd0\xc1\xd2\xcf\xcc\xd8"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6",
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
|
|
||||||
"chars after 72 are ignored as usual"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy",
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
|
|
||||||
"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"},
|
|
||||||
{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe",
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
|
|
||||||
"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"},
|
|
||||||
{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy",
|
|
||||||
""},
|
|
||||||
{"*0", "", "$2a$03$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*0", "", "$2a$32$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*0", "", "$2c$05$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*0", "", "$2z$05$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*0", "", "$2`$05$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*0", "", "$2{$05$CCCCCCCCCCCCCCCCCCCCC."},
|
|
||||||
{"*1", "", "*0"},
|
|
||||||
{NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
#define which tests[0]
|
|
||||||
|
|
||||||
static volatile sig_atomic_t running;
|
|
||||||
|
|
||||||
static void handle_timer(int signum)
|
|
||||||
{
|
|
||||||
(void) signum;
|
|
||||||
running = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *run(void *arg)
|
|
||||||
{
|
|
||||||
unsigned long count = 0;
|
|
||||||
int i = 0;
|
|
||||||
void *data = NULL;
|
|
||||||
int size = 0x12345678;
|
|
||||||
|
|
||||||
do {
|
|
||||||
const char *hash = tests[i][0];
|
|
||||||
const char *key = tests[i][1];
|
|
||||||
const char *setting = tests[i][2];
|
|
||||||
|
|
||||||
if (!tests[++i][0])
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
if (setting && strlen(hash) < 30) /* not for benchmark */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (strcmp(crypt_ra(key, hash, &data, &size), hash)) {
|
|
||||||
printf("%d: FAILED (crypt_ra/%d/%lu)\n",
|
|
||||||
(int)((char *)arg - (char *)0), i, count);
|
|
||||||
free(data);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
} while (running);
|
|
||||||
|
|
||||||
free(data);
|
|
||||||
return count + (char *)0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
struct itimerval it;
|
|
||||||
struct tms buf;
|
|
||||||
clock_t clk_tck, start_real, start_virtual, end_real, end_virtual;
|
|
||||||
unsigned long count;
|
|
||||||
void *data;
|
|
||||||
int size;
|
|
||||||
char *setting1, *setting2;
|
|
||||||
int i;
|
|
||||||
#ifdef TEST_THREADS
|
|
||||||
pthread_t t[TEST_THREADS];
|
|
||||||
void *t_retval;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
data = NULL;
|
|
||||||
size = 0x12345678;
|
|
||||||
|
|
||||||
for (i = 0; tests[i][0]; i++) {
|
|
||||||
const char *hash = tests[i][0];
|
|
||||||
const char *key = tests[i][1];
|
|
||||||
const char *setting = tests[i][2];
|
|
||||||
const char *p;
|
|
||||||
int ok = !setting || strlen(hash) >= 30;
|
|
||||||
int o_size;
|
|
||||||
char s_buf[30], o_buf[61];
|
|
||||||
if (!setting) {
|
|
||||||
memcpy(s_buf, hash, sizeof(s_buf) - 1);
|
|
||||||
s_buf[sizeof(s_buf) - 1] = 0;
|
|
||||||
setting = s_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
__set_errno(0);
|
|
||||||
p = crypt(key, setting);
|
|
||||||
if ((!ok && !errno) || strcmp(p, hash)) {
|
|
||||||
printf("FAILED (crypt/%d)\n", i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok && strcmp(crypt(key, hash), hash)) {
|
|
||||||
printf("FAILED (crypt/%d)\n", i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (o_size = -1; o_size <= (int)sizeof(o_buf); o_size++) {
|
|
||||||
int ok_n = ok && o_size == (int)sizeof(o_buf);
|
|
||||||
const char *x = "abc";
|
|
||||||
strcpy(o_buf, x);
|
|
||||||
if (o_size >= 3) {
|
|
||||||
x = "*0";
|
|
||||||
if (setting[0] == '*' && setting[1] == '0')
|
|
||||||
x = "*1";
|
|
||||||
}
|
|
||||||
__set_errno(0);
|
|
||||||
p = crypt_rn(key, setting, o_buf, o_size);
|
|
||||||
if ((ok_n && (!p || strcmp(p, hash))) ||
|
|
||||||
(!ok_n && (!errno || p || strcmp(o_buf, x)))) {
|
|
||||||
printf("FAILED (crypt_rn/%d)\n", i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__set_errno(0);
|
|
||||||
p = crypt_ra(key, setting, &data, &size);
|
|
||||||
if ((ok && (!p || strcmp(p, hash))) ||
|
|
||||||
(!ok && (!errno || p || strcmp((char *)data, hash)))) {
|
|
||||||
printf("FAILED (crypt_ra/%d)\n", i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setting1 = crypt_gensalt(which[0], 12, data, size);
|
|
||||||
if (!setting1 || strncmp(setting1, "$2a$12$", 7)) {
|
|
||||||
puts("FAILED (crypt_gensalt)\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
setting2 = crypt_gensalt_ra(setting1, 12, data, size);
|
|
||||||
if (strcmp(setting1, setting2)) {
|
|
||||||
puts("FAILED (crypt_gensalt_ra/1)\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*(char *)data)++;
|
|
||||||
setting1 = crypt_gensalt_ra(setting2, 12, data, size);
|
|
||||||
if (!strcmp(setting1, setting2)) {
|
|
||||||
puts("FAILED (crypt_gensalt_ra/2)\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(setting1);
|
|
||||||
free(setting2);
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
#if defined(_SC_CLK_TCK) || !defined(CLK_TCK)
|
|
||||||
clk_tck = sysconf(_SC_CLK_TCK);
|
|
||||||
#else
|
|
||||||
clk_tck = CLK_TCK;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
running = 1;
|
|
||||||
signal(SIGALRM, handle_timer);
|
|
||||||
|
|
||||||
memset(&it, 0, sizeof(it));
|
|
||||||
it.it_value.tv_sec = 5;
|
|
||||||
setitimer(ITIMER_REAL, &it, NULL);
|
|
||||||
|
|
||||||
start_real = times(&buf);
|
|
||||||
start_virtual = buf.tms_utime + buf.tms_stime;
|
|
||||||
|
|
||||||
count = (char *)run((char *)0) - (char *)0;
|
|
||||||
|
|
||||||
end_real = times(&buf);
|
|
||||||
end_virtual = buf.tms_utime + buf.tms_stime;
|
|
||||||
if (end_virtual == start_virtual) end_virtual++;
|
|
||||||
|
|
||||||
printf("%.1f c/s real, %.1f c/s virtual\n",
|
|
||||||
(float)count * clk_tck / (end_real - start_real),
|
|
||||||
(float)count * clk_tck / (end_virtual - start_virtual));
|
|
||||||
|
|
||||||
#ifdef TEST_THREADS
|
|
||||||
running = 1;
|
|
||||||
it.it_value.tv_sec = 60;
|
|
||||||
setitimer(ITIMER_REAL, &it, NULL);
|
|
||||||
start_real = times(&buf);
|
|
||||||
|
|
||||||
for (i = 0; i < TEST_THREADS; i++)
|
|
||||||
if (pthread_create(&t[i], NULL, run, i + (char *)0)) {
|
|
||||||
perror("pthread_create");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < TEST_THREADS; i++) {
|
|
||||||
if (pthread_join(t[i], &t_retval)) {
|
|
||||||
perror("pthread_join");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!t_retval) continue;
|
|
||||||
count = (char *)t_retval - (char *)0;
|
|
||||||
end_real = times(&buf);
|
|
||||||
printf("%d: %.1f c/s real\n", i,
|
|
||||||
(float)count * clk_tck / (end_real - start_real));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
203
deps/crypt_blowfish/x86.S
vendored
203
deps/crypt_blowfish/x86.S
vendored
@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
* Written by Solar Designer <solar at openwall.com> in 1998-2010.
|
|
||||||
* No copyright is claimed, and the software is hereby placed in the public
|
|
||||||
* domain. In case this attempt to disclaim copyright and place the software
|
|
||||||
* in the public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 1998-2010 Solar Designer and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* See crypt_blowfish.c for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
|
|
||||||
#if defined(__OpenBSD__) && !defined(__ELF__)
|
|
||||||
#define UNDERSCORES
|
|
||||||
#define ALIGN_LOG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__CYGWIN32__) || defined(__MINGW32__)
|
|
||||||
#define UNDERSCORES
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __DJGPP__
|
|
||||||
#define UNDERSCORES
|
|
||||||
#define ALIGN_LOG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNDERSCORES
|
|
||||||
#define _BF_body_r __BF_body_r
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ALIGN_LOG
|
|
||||||
#define DO_ALIGN(log) .align (log)
|
|
||||||
#elif defined(DUMBAS)
|
|
||||||
#define DO_ALIGN(log) .align 1 << log
|
|
||||||
#else
|
|
||||||
#define DO_ALIGN(log) .align (1 << (log))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BF_FRAME 0x200
|
|
||||||
#define ctx %esp
|
|
||||||
|
|
||||||
#define BF_ptr (ctx)
|
|
||||||
|
|
||||||
#define S(N, r) N+BF_FRAME(ctx,r,4)
|
|
||||||
#ifdef DUMBAS
|
|
||||||
#define P(N) 0x1000+N+N+N+N+BF_FRAME(ctx)
|
|
||||||
#else
|
|
||||||
#define P(N) 0x1000+4*N+BF_FRAME(ctx)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This version of the assembly code is optimized primarily for the original
|
|
||||||
* Intel Pentium but is also careful to avoid partial register stalls on the
|
|
||||||
* Pentium Pro family of processors (tested up to Pentium III Coppermine).
|
|
||||||
*
|
|
||||||
* It is possible to do 15% faster on the Pentium Pro family and probably on
|
|
||||||
* many non-Intel x86 processors, but, unfortunately, that would make things
|
|
||||||
* twice slower for the original Pentium.
|
|
||||||
*
|
|
||||||
* An additional 2% speedup may be achieved with non-reentrant code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define L %esi
|
|
||||||
#define R %edi
|
|
||||||
#define tmp1 %eax
|
|
||||||
#define tmp1_lo %al
|
|
||||||
#define tmp2 %ecx
|
|
||||||
#define tmp2_hi %ch
|
|
||||||
#define tmp3 %edx
|
|
||||||
#define tmp3_lo %dl
|
|
||||||
#define tmp4 %ebx
|
|
||||||
#define tmp4_hi %bh
|
|
||||||
#define tmp5 %ebp
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
#define BF_ROUND(L, R, N) \
|
|
||||||
xorl L,tmp2; \
|
|
||||||
xorl tmp1,tmp1; \
|
|
||||||
movl tmp2,L; \
|
|
||||||
shrl $16,tmp2; \
|
|
||||||
movl L,tmp4; \
|
|
||||||
movb tmp2_hi,tmp1_lo; \
|
|
||||||
andl $0xFF,tmp2; \
|
|
||||||
movb tmp4_hi,tmp3_lo; \
|
|
||||||
andl $0xFF,tmp4; \
|
|
||||||
movl S(0,tmp1),tmp1; \
|
|
||||||
movl S(0x400,tmp2),tmp5; \
|
|
||||||
addl tmp5,tmp1; \
|
|
||||||
movl S(0x800,tmp3),tmp5; \
|
|
||||||
xorl tmp5,tmp1; \
|
|
||||||
movl S(0xC00,tmp4),tmp5; \
|
|
||||||
addl tmp1,tmp5; \
|
|
||||||
movl 4+P(N),tmp2; \
|
|
||||||
xorl tmp5,R
|
|
||||||
|
|
||||||
#define BF_ENCRYPT_START \
|
|
||||||
BF_ROUND(L, R, 0); \
|
|
||||||
BF_ROUND(R, L, 1); \
|
|
||||||
BF_ROUND(L, R, 2); \
|
|
||||||
BF_ROUND(R, L, 3); \
|
|
||||||
BF_ROUND(L, R, 4); \
|
|
||||||
BF_ROUND(R, L, 5); \
|
|
||||||
BF_ROUND(L, R, 6); \
|
|
||||||
BF_ROUND(R, L, 7); \
|
|
||||||
BF_ROUND(L, R, 8); \
|
|
||||||
BF_ROUND(R, L, 9); \
|
|
||||||
BF_ROUND(L, R, 10); \
|
|
||||||
BF_ROUND(R, L, 11); \
|
|
||||||
BF_ROUND(L, R, 12); \
|
|
||||||
BF_ROUND(R, L, 13); \
|
|
||||||
BF_ROUND(L, R, 14); \
|
|
||||||
BF_ROUND(R, L, 15); \
|
|
||||||
movl BF_ptr,tmp5; \
|
|
||||||
xorl L,tmp2; \
|
|
||||||
movl P(17),L
|
|
||||||
|
|
||||||
#define BF_ENCRYPT_END \
|
|
||||||
xorl R,L; \
|
|
||||||
movl tmp2,R
|
|
||||||
|
|
||||||
DO_ALIGN(5)
|
|
||||||
.globl _BF_body_r
|
|
||||||
_BF_body_r:
|
|
||||||
movl 4(%esp),%eax
|
|
||||||
pushl %ebp
|
|
||||||
pushl %ebx
|
|
||||||
pushl %esi
|
|
||||||
pushl %edi
|
|
||||||
subl $BF_FRAME-8,%eax
|
|
||||||
xorl L,L
|
|
||||||
cmpl %esp,%eax
|
|
||||||
ja BF_die
|
|
||||||
xchgl %eax,%esp
|
|
||||||
xorl R,R
|
|
||||||
pushl %eax
|
|
||||||
leal 0x1000+BF_FRAME-4(ctx),%eax
|
|
||||||
movl 0x1000+BF_FRAME-4(ctx),tmp2
|
|
||||||
pushl %eax
|
|
||||||
xorl tmp3,tmp3
|
|
||||||
BF_loop_P:
|
|
||||||
BF_ENCRYPT_START
|
|
||||||
addl $8,tmp5
|
|
||||||
BF_ENCRYPT_END
|
|
||||||
leal 0x1000+18*4+BF_FRAME(ctx),tmp1
|
|
||||||
movl tmp5,BF_ptr
|
|
||||||
cmpl tmp5,tmp1
|
|
||||||
movl L,-8(tmp5)
|
|
||||||
movl R,-4(tmp5)
|
|
||||||
movl P(0),tmp2
|
|
||||||
ja BF_loop_P
|
|
||||||
leal BF_FRAME(ctx),tmp5
|
|
||||||
xorl tmp3,tmp3
|
|
||||||
movl tmp5,BF_ptr
|
|
||||||
BF_loop_S:
|
|
||||||
BF_ENCRYPT_START
|
|
||||||
BF_ENCRYPT_END
|
|
||||||
movl P(0),tmp2
|
|
||||||
movl L,(tmp5)
|
|
||||||
movl R,4(tmp5)
|
|
||||||
BF_ENCRYPT_START
|
|
||||||
BF_ENCRYPT_END
|
|
||||||
movl P(0),tmp2
|
|
||||||
movl L,8(tmp5)
|
|
||||||
movl R,12(tmp5)
|
|
||||||
BF_ENCRYPT_START
|
|
||||||
BF_ENCRYPT_END
|
|
||||||
movl P(0),tmp2
|
|
||||||
movl L,16(tmp5)
|
|
||||||
movl R,20(tmp5)
|
|
||||||
BF_ENCRYPT_START
|
|
||||||
addl $32,tmp5
|
|
||||||
BF_ENCRYPT_END
|
|
||||||
leal 0x1000+BF_FRAME(ctx),tmp1
|
|
||||||
movl tmp5,BF_ptr
|
|
||||||
cmpl tmp5,tmp1
|
|
||||||
movl P(0),tmp2
|
|
||||||
movl L,-8(tmp5)
|
|
||||||
movl R,-4(tmp5)
|
|
||||||
ja BF_loop_S
|
|
||||||
movl 4(%esp),%esp
|
|
||||||
popl %edi
|
|
||||||
popl %esi
|
|
||||||
popl %ebx
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
BF_die:
|
|
||||||
/* Oops, need to re-compile with a larger BF_FRAME. */
|
|
||||||
hlt
|
|
||||||
jmp BF_die
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ELF__) && defined(__linux__)
|
|
||||||
.section .note.GNU-stack,"",@progbits
|
|
||||||
#endif
|
|
1
deps/libbacktrace
vendored
Submodule
1
deps/libbacktrace
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 86885d14049fab06ef8a33aac51664230ca09200
|
5
deps/libbacktrace/.gitignore
vendored
5
deps/libbacktrace/.gitignore
vendored
@ -1,5 +0,0 @@
|
|||||||
*~
|
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
*.a
|
|
||||||
*.la
|
|
9286
deps/libbacktrace/Isaac.Newton-Opticks.txt
vendored
9286
deps/libbacktrace/Isaac.Newton-Opticks.txt
vendored
File diff suppressed because it is too large
Load Diff
29
deps/libbacktrace/LICENSE
vendored
29
deps/libbacktrace/LICENSE
vendored
@ -1,29 +0,0 @@
|
|||||||
# Copyright (C) 2012-2016 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
623
deps/libbacktrace/Makefile.am
vendored
623
deps/libbacktrace/Makefile.am
vendored
@ -1,623 +0,0 @@
|
|||||||
# Makefile.am -- Backtrace Makefile.
|
|
||||||
# Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I config
|
|
||||||
|
|
||||||
AM_CPPFLAGS =
|
|
||||||
|
|
||||||
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
|
|
||||||
|
|
||||||
include_HEADERS = backtrace.h backtrace-supported.h
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libbacktrace.la
|
|
||||||
|
|
||||||
libbacktrace_la_SOURCES = \
|
|
||||||
backtrace.h \
|
|
||||||
atomic.c \
|
|
||||||
dwarf.c \
|
|
||||||
fileline.c \
|
|
||||||
internal.h \
|
|
||||||
posix.c \
|
|
||||||
print.c \
|
|
||||||
sort.c \
|
|
||||||
state.c
|
|
||||||
|
|
||||||
BACKTRACE_FILES = \
|
|
||||||
backtrace.c \
|
|
||||||
simple.c \
|
|
||||||
nounwind.c
|
|
||||||
|
|
||||||
FORMAT_FILES = \
|
|
||||||
elf.c \
|
|
||||||
macho.c \
|
|
||||||
pecoff.c \
|
|
||||||
unknown.c \
|
|
||||||
xcoff.c
|
|
||||||
|
|
||||||
VIEW_FILES = \
|
|
||||||
read.c \
|
|
||||||
mmapio.c
|
|
||||||
|
|
||||||
ALLOC_FILES = \
|
|
||||||
alloc.c \
|
|
||||||
mmap.c
|
|
||||||
|
|
||||||
EXTRA_libbacktrace_la_SOURCES = \
|
|
||||||
$(BACKTRACE_FILES) \
|
|
||||||
$(FORMAT_FILES) \
|
|
||||||
$(VIEW_FILES) \
|
|
||||||
$(ALLOC_FILES)
|
|
||||||
|
|
||||||
libbacktrace_la_LIBADD = \
|
|
||||||
$(BACKTRACE_FILE) \
|
|
||||||
$(FORMAT_FILE) \
|
|
||||||
$(VIEW_FILE) \
|
|
||||||
$(ALLOC_FILE)
|
|
||||||
|
|
||||||
libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
|
|
||||||
|
|
||||||
# Testsuite.
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a program,
|
|
||||||
# with SOURCES, etc.
|
|
||||||
check_PROGRAMS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be run.
|
|
||||||
TESTS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a Makefile
|
|
||||||
# target and run.
|
|
||||||
MAKETESTS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a program,
|
|
||||||
# with SOURCES, etc., and run.
|
|
||||||
BUILDTESTS =
|
|
||||||
|
|
||||||
# Add a file to this variable if you want it to be built for testing.
|
|
||||||
check_DATA =
|
|
||||||
|
|
||||||
# Flags to use when compiling test programs.
|
|
||||||
libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
|
|
||||||
%.dSYM: %
|
|
||||||
$(DSYMUTIL) $<
|
|
||||||
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if NATIVE
|
|
||||||
check_LTLIBRARIES = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
libbacktrace_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) read.lo alloc.lo
|
|
||||||
|
|
||||||
libbacktrace_alloc_la_DEPENDENCIES = $(libbacktrace_alloc_la_LIBADD)
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_noformat.la
|
|
||||||
|
|
||||||
libbacktrace_noformat_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_noformat_la_LIBADD = $(BACKTRACE_FILE) $(VIEW_FILE) $(ALLOC_FILE)
|
|
||||||
|
|
||||||
libbacktrace_noformat_la_DEPENDENCIES = $(libbacktrace_noformat_la_LIBADD)
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
TEST_BUILD_ID_DIR=$(abs_builddir)/usr/lib/debug/.build-id/
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
libbacktrace_elf_for_test_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_elf_for_test_la_LIBADD = $(BACKTRACE_FILE) elf_for_test.lo \
|
|
||||||
$(VIEW_FILE) $(ALLOC_FILE)
|
|
||||||
|
|
||||||
elf_for_test.c: elf.c
|
|
||||||
SEARCH='^#define SYSTEM_BUILD_ID_DIR.*$$'; \
|
|
||||||
REPLACE="#define SYSTEM_BUILD_ID_DIR \"$(TEST_BUILD_ID_DIR)\""; \
|
|
||||||
$(SED) "s%$$SEARCH%$$REPLACE%" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
elf_%.c: elf.c
|
|
||||||
SEARCH='#error "Unknown BACKTRACE_ELF_SIZE"'; \
|
|
||||||
REPLACE='#undef BACKTRACE_ELF_SIZE\
|
|
||||||
#define BACKTRACE_ELF_SIZE'; \
|
|
||||||
$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
xcoff_%.c: xcoff.c
|
|
||||||
SEARCH='#error "Unknown BACKTRACE_XCOFF_SIZE"'; \
|
|
||||||
REPLACE='#undef BACKTRACE_XCOFF_SIZE\
|
|
||||||
#define BACKTRACE_XCOFF_SIZE'; \
|
|
||||||
$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
test_elf_32_SOURCES = test_format.c testlib.c
|
|
||||||
test_elf_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_elf_32_LDADD = libbacktrace_noformat.la elf_32.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_elf_32
|
|
||||||
|
|
||||||
test_elf_64_SOURCES = test_format.c testlib.c
|
|
||||||
test_elf_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_elf_64_LDADD = libbacktrace_noformat.la elf_64.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_elf_64
|
|
||||||
|
|
||||||
test_macho_SOURCES = test_format.c testlib.c
|
|
||||||
test_macho_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_macho_LDADD = libbacktrace_noformat.la macho.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_macho
|
|
||||||
|
|
||||||
test_xcoff_32_SOURCES = test_format.c testlib.c
|
|
||||||
test_xcoff_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_xcoff_32_LDADD = libbacktrace_noformat.la xcoff_32.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_xcoff_32
|
|
||||||
|
|
||||||
test_xcoff_64_SOURCES = test_format.c testlib.c
|
|
||||||
test_xcoff_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_xcoff_64_LDADD = libbacktrace_noformat.la xcoff_64.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_xcoff_64
|
|
||||||
|
|
||||||
test_pecoff_SOURCES = test_format.c testlib.c
|
|
||||||
test_pecoff_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_pecoff_LDADD = libbacktrace_noformat.la pecoff.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_pecoff
|
|
||||||
|
|
||||||
test_unknown_SOURCES = test_format.c testlib.c
|
|
||||||
test_unknown_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_unknown_LDADD = libbacktrace_noformat.la unknown.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_unknown
|
|
||||||
|
|
||||||
unittest_SOURCES = unittest.c testlib.c
|
|
||||||
unittest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
unittest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += unittest
|
|
||||||
|
|
||||||
unittest_alloc_SOURCES = $(unittest_SOURCES)
|
|
||||||
unittest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
unittest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += unittest_alloc
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_instrumented_alloc.la
|
|
||||||
|
|
||||||
libbacktrace_instrumented_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_instrumented_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) \
|
|
||||||
read.lo instrumented_alloc.lo
|
|
||||||
|
|
||||||
libbacktrace_instrumented_alloc_la_DEPENDENCIES = \
|
|
||||||
$(libbacktrace_instrumented_alloc_la_LIBADD)
|
|
||||||
|
|
||||||
instrumented_alloc.lo: alloc.c
|
|
||||||
|
|
||||||
allocfail_SOURCES = allocfail.c testlib.c
|
|
||||||
allocfail_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
allocfail_LDADD = libbacktrace_instrumented_alloc.la
|
|
||||||
|
|
||||||
check_PROGRAMS += allocfail
|
|
||||||
|
|
||||||
allocfail.sh: allocfail
|
|
||||||
|
|
||||||
TESTS += allocfail.sh
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += allocfail.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
if HAVE_BUILDID
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
b2test_SOURCES = $(btest_SOURCES)
|
|
||||||
b2test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
b2test_LDFLAGS = -Wl,--build-id
|
|
||||||
b2test_LDADD = libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
check_PROGRAMS += b2test
|
|
||||||
MAKETESTS += b2test_buildid
|
|
||||||
|
|
||||||
if HAVE_DWZ
|
|
||||||
|
|
||||||
b3test_SOURCES = $(btest_SOURCES)
|
|
||||||
b3test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
b3test_LDFLAGS = -Wl,--build-id
|
|
||||||
b3test_LDADD = libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
check_PROGRAMS += b3test
|
|
||||||
MAKETESTS += b3test_dwz_buildid
|
|
||||||
|
|
||||||
endif HAVE_DWZ
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
endif HAVE_BUILDID
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
btest_SOURCES = btest.c testlib.c
|
|
||||||
btest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
|
|
||||||
btest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += btest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
btest_lto_SOURCES = btest.c testlib.c
|
|
||||||
btest_lto_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O -flto
|
|
||||||
btest_lto_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest_lto
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
btest_alloc_SOURCES = $(btest_SOURCES)
|
|
||||||
btest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
btest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += btest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_DWZ
|
|
||||||
|
|
||||||
%_dwz: %
|
|
||||||
rm -f $@ $@_common.debug
|
|
||||||
cp $< $@_1
|
|
||||||
cp $< $@_2
|
|
||||||
if $(DWZ) -m $@_common.debug $@_1 $@_2; then \
|
|
||||||
rm -f $@_2; \
|
|
||||||
mv $@_1 $@; \
|
|
||||||
else \
|
|
||||||
echo "Ignoring dwz errors, assuming that test passes"; \
|
|
||||||
cp $< $@; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
MAKETESTS += btest_dwz
|
|
||||||
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
MAKETESTS += btest_dwz_gnudebuglink
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
endif HAVE_DWZ
|
|
||||||
|
|
||||||
stest_SOURCES = stest.c
|
|
||||||
stest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
stest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += stest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += stest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
stest_alloc_SOURCES = $(stest_SOURCES)
|
|
||||||
stest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
stest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += stest_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += stest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
ztest_SOURCES = ztest.c testlib.c
|
|
||||||
ztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
ztest_LDADD = libbacktrace.la
|
|
||||||
ztest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_ZLIB
|
|
||||||
ztest_LDADD += -lz
|
|
||||||
ztest_alloc_LDADD += -lz
|
|
||||||
endif
|
|
||||||
ztest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
ztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += ztest
|
|
||||||
|
|
||||||
ztest_alloc_SOURCES = $(ztest_SOURCES)
|
|
||||||
ztest_alloc_CFLAGS = $(ztest_CFLAGS)
|
|
||||||
|
|
||||||
BUILDTESTS += ztest_alloc
|
|
||||||
|
|
||||||
zstdtest_SOURCES = zstdtest.c testlib.c
|
|
||||||
zstdtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
zstdtest_LDADD = libbacktrace.la
|
|
||||||
zstdtest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_ZSTD
|
|
||||||
zstdtest_LDADD += -lzstd
|
|
||||||
zstdtest_alloc_LDADD += -lzstd
|
|
||||||
endif
|
|
||||||
zstdtest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
zstdtest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += zstdtest
|
|
||||||
|
|
||||||
zstdtest_alloc_SOURCES = $(zstdtest_SOURCES)
|
|
||||||
zstdtest_alloc_CFLAGS = $(zstdtest_CFLAGS)
|
|
||||||
|
|
||||||
BUILDTESTS += zstdtest_alloc
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
edtest_SOURCES = edtest.c edtest2_build.c testlib.c
|
|
||||||
edtest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
edtest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += edtest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += edtest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
edtest_alloc_SOURCES = $(edtest_SOURCES)
|
|
||||||
edtest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
edtest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += edtest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
BUILDTESTS += edtest_alloc
|
|
||||||
|
|
||||||
edtest2_build.c: gen_edtest2_build; @true
|
|
||||||
gen_edtest2_build: $(srcdir)/edtest2.c
|
|
||||||
cat $(srcdir)/edtest2.c > tmp-edtest2_build.c
|
|
||||||
$(SHELL) $(srcdir)/move-if-change tmp-edtest2_build.c edtest2_build.c
|
|
||||||
echo timestamp > $@
|
|
||||||
|
|
||||||
if HAVE_PTHREAD
|
|
||||||
|
|
||||||
BUILDTESTS += ttest
|
|
||||||
|
|
||||||
ttest_SOURCES = ttest.c testlib.c
|
|
||||||
ttest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -pthread
|
|
||||||
ttest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += ttest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
BUILDTESTS += ttest_alloc
|
|
||||||
|
|
||||||
ttest_alloc_SOURCES = $(ttest_SOURCES)
|
|
||||||
ttest_alloc_CFLAGS = $(ttest_CFLAGS)
|
|
||||||
ttest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += ttest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
endif HAVE_PTHREAD
|
|
||||||
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
MAKETESTS += btest_gnudebuglink
|
|
||||||
|
|
||||||
%_gnudebuglink: %
|
|
||||||
$(OBJCOPY) --only-keep-debug $< $@.debug
|
|
||||||
$(OBJCOPY) --strip-debug --add-gnu-debuglink=$@.debug $< $@
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
%_buildid: %
|
|
||||||
./install-debuginfo-for-buildid.sh \
|
|
||||||
"$(TEST_BUILD_ID_DIR)" \
|
|
||||||
$<
|
|
||||||
$(OBJCOPY) --strip-debug $< $@
|
|
||||||
|
|
||||||
if HAVE_COMPRESSED_DEBUG
|
|
||||||
|
|
||||||
ctestg_SOURCES = btest.c testlib.c
|
|
||||||
ctestg_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctestg_LDFLAGS = -Wl,--compress-debug-sections=zlib-gnu
|
|
||||||
ctestg_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
ctesta_SOURCES = btest.c testlib.c
|
|
||||||
ctesta_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctesta_LDFLAGS = -Wl,--compress-debug-sections=zlib-gabi
|
|
||||||
ctesta_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestg ctesta
|
|
||||||
|
|
||||||
if HAVE_COMPRESSED_DEBUG_ZSTD
|
|
||||||
|
|
||||||
ctestzstd_SOURCES = btest.c testlib.c
|
|
||||||
ctestzstd_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctestzstd_LDFLAGS = -Wl,--compress-debug-sections=zstd
|
|
||||||
ctestzstd_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestzstd
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
ctestg_alloc_SOURCES = $(ctestg_SOURCES)
|
|
||||||
ctestg_alloc_CFLAGS = $(ctestg_CFLAGS)
|
|
||||||
ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS)
|
|
||||||
ctestg_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
ctesta_alloc_SOURCES = $(ctesta_SOURCES)
|
|
||||||
ctesta_alloc_CFLAGS = $(ctesta_CFLAGS)
|
|
||||||
ctesta_alloc_LDFLAGS = $(ctesta_LDFLAGS)
|
|
||||||
ctesta_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestg_alloc ctesta_alloc
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_DWARF5
|
|
||||||
|
|
||||||
dwarf5_SOURCES = btest.c testlib.c
|
|
||||||
dwarf5_CFLAGS = $(libbacktrace_TEST_CFLAGS) -gdwarf-5
|
|
||||||
dwarf5_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += dwarf5
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += dwarf5.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
dwarf5_alloc_SOURCES = $(dwarf5_SOURCES)
|
|
||||||
dwarf5_alloc_CFLAGS = $(dwarf5_CFLAGS)
|
|
||||||
dwarf5_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += dwarf5_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += dwarf5_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
mtest_SOURCES = mtest.c testlib.c
|
|
||||||
mtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
|
|
||||||
mtest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += mtest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += mtest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_MINIDEBUG
|
|
||||||
|
|
||||||
MAKETESTS += mtest_minidebug
|
|
||||||
|
|
||||||
%_minidebug: %
|
|
||||||
$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
|
|
||||||
$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
|
|
||||||
$(COMM) -13 $<.dsyms $<.fsyms > $<.keepsyms
|
|
||||||
$(OBJCOPY) --only-keep-debug $< $<.dbg
|
|
||||||
$(OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$<.keepsyms $<.dbg $<.mdbg
|
|
||||||
$(OBJCOPY) --strip-all --remove-section ..comment $< $<.strip
|
|
||||||
rm -f $<.mdbg.xz
|
|
||||||
$(XZ) $<.mdbg
|
|
||||||
$(OBJCOPY) --add-section .gnu_debugdata=$<.mdbg.xz $<.strip
|
|
||||||
mv $<.strip $@
|
|
||||||
|
|
||||||
endif HAVE_MINIDEBUG
|
|
||||||
|
|
||||||
endif NATIVE
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
xztest_SOURCES = xztest.c testlib.c
|
|
||||||
xztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
xztest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
xztest_alloc_SOURCES = $(xztest_SOURCES)
|
|
||||||
xztest_alloc_CFLAGS = $(xztest_CFLAGS)
|
|
||||||
xztest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_LIBLZMA
|
|
||||||
xztest_LDADD += -llzma
|
|
||||||
xztest_alloc_LDADD += -llzma
|
|
||||||
endif
|
|
||||||
|
|
||||||
xztest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
xztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += xztest xztest_alloc
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
check_PROGRAMS += $(BUILDTESTS)
|
|
||||||
|
|
||||||
TESTS += $(MAKETESTS) $(BUILDTESTS)
|
|
||||||
|
|
||||||
CLEANFILES = \
|
|
||||||
$(MAKETESTS) $(BUILDTESTS) *.debug elf_for_test.c edtest2_build.c \
|
|
||||||
gen_edtest2_build \
|
|
||||||
*.dsyms *.fsyms *.keepsyms *.dbg *.mdbg *.mdbg.xz *.strip
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
-rm -rf usr
|
|
||||||
|
|
||||||
# We can't use automake's automatic dependency tracking, because it
|
|
||||||
# breaks when using bootstrap-lean. Automatic dependency tracking
|
|
||||||
# with GCC bootstrap will cause some of the objects to depend on
|
|
||||||
# header files in prev-gcc/include, e.g., stddef.h and stdarg.h. When
|
|
||||||
# using bootstrap-lean, prev-gcc is removed after each stage. When
|
|
||||||
# running "make install", those header files will be gone, causing the
|
|
||||||
# library to be rebuilt at install time. That may not succeed.
|
|
||||||
|
|
||||||
# These manual dependencies do not include dependencies on unwind.h,
|
|
||||||
# even though that is part of GCC, because where to find it depends on
|
|
||||||
# whether we are being built as a host library or a target library.
|
|
||||||
|
|
||||||
alloc.lo: config.h backtrace.h internal.h
|
|
||||||
backtrace.lo: config.h backtrace.h internal.h
|
|
||||||
btest.lo: filenames.h backtrace.h backtrace-supported.h
|
|
||||||
dwarf.lo: config.h filenames.h backtrace.h internal.h
|
|
||||||
elf.lo: config.h backtrace.h internal.h
|
|
||||||
fileline.lo: config.h backtrace.h internal.h
|
|
||||||
macho.lo: config.h backtrace.h internal.h
|
|
||||||
mmap.lo: config.h backtrace.h internal.h
|
|
||||||
mmapio.lo: config.h backtrace.h internal.h
|
|
||||||
mtest.lo: backtrace.h backtrace-supported.h
|
|
||||||
nounwind.lo: config.h internal.h
|
|
||||||
pecoff.lo: config.h backtrace.h internal.h
|
|
||||||
posix.lo: config.h backtrace.h internal.h
|
|
||||||
print.lo: config.h backtrace.h internal.h
|
|
||||||
read.lo: config.h backtrace.h internal.h
|
|
||||||
simple.lo: config.h backtrace.h internal.h
|
|
||||||
sort.lo: config.h backtrace.h internal.h
|
|
||||||
stest.lo: config.h backtrace.h internal.h
|
|
||||||
state.lo: config.h backtrace.h backtrace-supported.h internal.h
|
|
||||||
unknown.lo: config.h backtrace.h internal.h
|
|
||||||
xcoff.lo: config.h backtrace.h internal.h
|
|
||||||
xztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
|
|
||||||
ztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
|
|
||||||
|
|
2666
deps/libbacktrace/Makefile.in
vendored
2666
deps/libbacktrace/Makefile.in
vendored
File diff suppressed because it is too large
Load Diff
36
deps/libbacktrace/README.md
vendored
36
deps/libbacktrace/README.md
vendored
@ -1,36 +0,0 @@
|
|||||||
# libbacktrace
|
|
||||||
A C library that may be linked into a C/C++ program to produce symbolic backtraces
|
|
||||||
|
|
||||||
Initially written by Ian Lance Taylor <iant@golang.org>.
|
|
||||||
|
|
||||||
This is version 1.0.
|
|
||||||
It is likely that this will always be version 1.0.
|
|
||||||
|
|
||||||
The libbacktrace library may be linked into a program or library and
|
|
||||||
used to produce symbolic backtraces.
|
|
||||||
Sample uses would be to print a detailed backtrace when an error
|
|
||||||
occurs or to gather detailed profiling information.
|
|
||||||
In general the functions provided by this library are async-signal-safe,
|
|
||||||
meaning that they may be safely called from a signal handler.
|
|
||||||
|
|
||||||
The libbacktrace library is provided under a BSD license.
|
|
||||||
See the source files for the exact license text.
|
|
||||||
|
|
||||||
The public functions are declared and documented in the header file
|
|
||||||
backtrace.h, which should be #include'd by a user of the library.
|
|
||||||
|
|
||||||
Building libbacktrace will generate a file backtrace-supported.h,
|
|
||||||
which a user of the library may use to determine whether backtraces
|
|
||||||
will work.
|
|
||||||
See the source file backtrace-supported.h.in for the macros that it
|
|
||||||
defines.
|
|
||||||
|
|
||||||
As of October 2020, libbacktrace supports ELF, PE/COFF, Mach-O, and
|
|
||||||
XCOFF executables with DWARF debugging information.
|
|
||||||
In other words, it supports GNU/Linux, *BSD, macOS, Windows, and AIX.
|
|
||||||
The library is written to make it straightforward to add support for
|
|
||||||
other object file and debugging formats.
|
|
||||||
|
|
||||||
The library relies on the C++ unwind API defined at
|
|
||||||
https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
|
|
||||||
This API is provided by GCC and clang.
|
|
864
deps/libbacktrace/aclocal.m4
vendored
864
deps/libbacktrace/aclocal.m4
vendored
@ -1,864 +0,0 @@
|
|||||||
# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
|
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
|
||||||
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
|
|
||||||
[m4_warning([this file was generated for autoconf 2.69.
|
|
||||||
You have another version of autoconf. It may work, but is not guaranteed to.
|
|
||||||
If you have problems, you may need to regenerate the build system entirely.
|
|
||||||
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
|
||||||
|
|
||||||
# Copyright (C) 2002-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_AUTOMAKE_VERSION(VERSION)
|
|
||||||
# ----------------------------
|
|
||||||
# Automake X.Y traces this macro to ensure aclocal.m4 has been
|
|
||||||
# generated from the m4 files accompanying Automake X.Y.
|
|
||||||
# (This private macro should not be called outside this file.)
|
|
||||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
|
||||||
[am__api_version='1.15'
|
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
|
||||||
dnl require some minimum version. Point them to the right macro.
|
|
||||||
m4_if([$1], [1.15.1], [],
|
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
# _AM_AUTOCONF_VERSION(VERSION)
|
|
||||||
# -----------------------------
|
|
||||||
# aclocal traces this macro to find the Autoconf version.
|
|
||||||
# This is a private macro too. Using m4_define simplifies
|
|
||||||
# the logic in aclocal, which can simply ignore this definition.
|
|
||||||
m4_define([_AM_AUTOCONF_VERSION], [])
|
|
||||||
|
|
||||||
# AM_SET_CURRENT_AUTOMAKE_VERSION
|
|
||||||
# -------------------------------
|
|
||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
|
||||||
[AM_AUTOMAKE_VERSION([1.15.1])dnl
|
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
|
||||||
|
|
||||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
|
|
||||||
# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
|
|
||||||
# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
|
|
||||||
#
|
|
||||||
# Of course, Automake must honor this variable whenever it calls a
|
|
||||||
# tool from the auxiliary directory. The problem is that $srcdir (and
|
|
||||||
# therefore $ac_aux_dir as well) can be either absolute or relative,
|
|
||||||
# depending on how configure is run. This is pretty annoying, since
|
|
||||||
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
|
|
||||||
# source directory, any form will work fine, but in subdirectories a
|
|
||||||
# relative path needs to be adjusted first.
|
|
||||||
#
|
|
||||||
# $ac_aux_dir/missing
|
|
||||||
# fails when called from a subdirectory if $ac_aux_dir is relative
|
|
||||||
# $top_srcdir/$ac_aux_dir/missing
|
|
||||||
# fails if $ac_aux_dir is absolute,
|
|
||||||
# fails when called from a subdirectory in a VPATH build with
|
|
||||||
# a relative $ac_aux_dir
|
|
||||||
#
|
|
||||||
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
|
|
||||||
# are both prefixed by $srcdir. In an in-source build this is usually
|
|
||||||
# harmless because $srcdir is '.', but things will broke when you
|
|
||||||
# start a VPATH build or use an absolute $srcdir.
|
|
||||||
#
|
|
||||||
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
|
|
||||||
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
|
|
||||||
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
|
|
||||||
# and then we would define $MISSING as
|
|
||||||
# MISSING="\${SHELL} $am_aux_dir/missing"
|
|
||||||
# This will work as long as MISSING is not called from configure, because
|
|
||||||
# unfortunately $(top_srcdir) has no meaning in configure.
|
|
||||||
# However there are other variables, like CC, which are often used in
|
|
||||||
# configure, and could therefore not use this "fixed" $ac_aux_dir.
|
|
||||||
#
|
|
||||||
# Another solution, used here, is to always expand $ac_aux_dir to an
|
|
||||||
# absolute PATH. The drawback is that using absolute paths prevent a
|
|
||||||
# configured tree to be moved without reconfiguration.
|
|
||||||
|
|
||||||
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
|
||||||
[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
|
|
||||||
# Expand $ac_aux_dir to an absolute path.
|
|
||||||
am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
|
||||||
])
|
|
||||||
|
|
||||||
# AM_CONDITIONAL -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
|
|
||||||
# -------------------------------------
|
|
||||||
# Define a conditional.
|
|
||||||
AC_DEFUN([AM_CONDITIONAL],
|
|
||||||
[AC_PREREQ([2.52])dnl
|
|
||||||
m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
|
|
||||||
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
|
|
||||||
AC_SUBST([$1_TRUE])dnl
|
|
||||||
AC_SUBST([$1_FALSE])dnl
|
|
||||||
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
|
|
||||||
_AM_SUBST_NOTMAKE([$1_FALSE])dnl
|
|
||||||
m4_define([_AM_COND_VALUE_$1], [$2])dnl
|
|
||||||
if $2; then
|
|
||||||
$1_TRUE=
|
|
||||||
$1_FALSE='#'
|
|
||||||
else
|
|
||||||
$1_TRUE='#'
|
|
||||||
$1_FALSE=
|
|
||||||
fi
|
|
||||||
AC_CONFIG_COMMANDS_PRE(
|
|
||||||
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
|
|
||||||
AC_MSG_ERROR([[conditional "$1" was never defined.
|
|
||||||
Usually this means the macro was only invoked conditionally.]])
|
|
||||||
fi])])
|
|
||||||
|
|
||||||
# Do all the work for Automake. -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This macro actually does too much. Some checks are only needed if
|
|
||||||
# your package does certain things. But this isn't really a big deal.
|
|
||||||
|
|
||||||
dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
|
|
||||||
m4_define([AC_PROG_CC],
|
|
||||||
m4_defn([AC_PROG_CC])
|
|
||||||
[_AM_PROG_CC_C_O
|
|
||||||
])
|
|
||||||
|
|
||||||
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
|
|
||||||
# AM_INIT_AUTOMAKE([OPTIONS])
|
|
||||||
# -----------------------------------------------
|
|
||||||
# The call with PACKAGE and VERSION arguments is the old style
|
|
||||||
# call (pre autoconf-2.50), which is being phased out. PACKAGE
|
|
||||||
# and VERSION should now be passed to AC_INIT and removed from
|
|
||||||
# the call to AM_INIT_AUTOMAKE.
|
|
||||||
# We support both call styles for the transition. After
|
|
||||||
# the next Automake release, Autoconf can make the AC_INIT
|
|
||||||
# arguments mandatory, and then we can depend on a new Autoconf
|
|
||||||
# release and drop the old call support.
|
|
||||||
AC_DEFUN([AM_INIT_AUTOMAKE],
|
|
||||||
[AC_PREREQ([2.65])dnl
|
|
||||||
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
|
||||||
dnl the ones we care about.
|
|
||||||
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
|
||||||
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
|
|
||||||
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
|
||||||
if test "`cd $srcdir && pwd`" != "`pwd`"; then
|
|
||||||
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
|
|
||||||
# is not polluted with repeated "-I."
|
|
||||||
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
|
|
||||||
# test to see if srcdir already configured
|
|
||||||
if test -f $srcdir/config.status; then
|
|
||||||
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# test whether we have cygpath
|
|
||||||
if test -z "$CYGPATH_W"; then
|
|
||||||
if (cygpath --version) >/dev/null 2>/dev/null; then
|
|
||||||
CYGPATH_W='cygpath -w'
|
|
||||||
else
|
|
||||||
CYGPATH_W=echo
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST([CYGPATH_W])
|
|
||||||
|
|
||||||
# Define the identity of the package.
|
|
||||||
dnl Distinguish between old-style and new-style calls.
|
|
||||||
m4_ifval([$2],
|
|
||||||
[AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: two- and three-arguments forms are deprecated.])
|
|
||||||
m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
|
|
||||||
AC_SUBST([PACKAGE], [$1])dnl
|
|
||||||
AC_SUBST([VERSION], [$2])],
|
|
||||||
[_AM_SET_OPTIONS([$1])dnl
|
|
||||||
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
|
|
||||||
m4_if(
|
|
||||||
m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
|
|
||||||
[ok:ok],,
|
|
||||||
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
|
|
||||||
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
|
|
||||||
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
|
|
||||||
|
|
||||||
_AM_IF_OPTION([no-define],,
|
|
||||||
[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
|
|
||||||
AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
|
|
||||||
|
|
||||||
# Some tools Automake needs.
|
|
||||||
AC_REQUIRE([AM_SANITY_CHECK])dnl
|
|
||||||
AC_REQUIRE([AC_ARG_PROGRAM])dnl
|
|
||||||
AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
|
|
||||||
AM_MISSING_PROG([AUTOCONF], [autoconf])
|
|
||||||
AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
|
|
||||||
AM_MISSING_PROG([AUTOHEADER], [autoheader])
|
|
||||||
AM_MISSING_PROG([MAKEINFO], [makeinfo])
|
|
||||||
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
|
||||||
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
|
||||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
|
||||||
# For better backward compatibility. To be removed once Automake 1.9.x
|
|
||||||
# dies out for good. For more background, see:
|
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
|
||||||
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
|
||||||
# We need awk for the "check" target (and possibly the TAP driver). The
|
|
||||||
# system "awk" is bad on some platforms.
|
|
||||||
AC_REQUIRE([AC_PROG_AWK])dnl
|
|
||||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
|
||||||
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
|
||||||
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
|
|
||||||
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
|
|
||||||
[_AM_PROG_TAR([v7])])])
|
|
||||||
_AM_IF_OPTION([no-dependencies],,
|
|
||||||
[AC_PROVIDE_IFELSE([AC_PROG_CC],
|
|
||||||
[_AM_DEPENDENCIES([CC])],
|
|
||||||
[m4_define([AC_PROG_CC],
|
|
||||||
m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
|
|
||||||
AC_PROVIDE_IFELSE([AC_PROG_CXX],
|
|
||||||
[_AM_DEPENDENCIES([CXX])],
|
|
||||||
[m4_define([AC_PROG_CXX],
|
|
||||||
m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
|
|
||||||
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
|
|
||||||
[_AM_DEPENDENCIES([OBJC])],
|
|
||||||
[m4_define([AC_PROG_OBJC],
|
|
||||||
m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
|
|
||||||
AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
|
|
||||||
[_AM_DEPENDENCIES([OBJCXX])],
|
|
||||||
[m4_define([AC_PROG_OBJCXX],
|
|
||||||
m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
|
|
||||||
])
|
|
||||||
AC_REQUIRE([AM_SILENT_RULES])dnl
|
|
||||||
dnl The testsuite driver may need to know about EXEEXT, so add the
|
|
||||||
dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
|
|
||||||
dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
|
|
||||||
AC_CONFIG_COMMANDS_PRE(dnl
|
|
||||||
[m4_provide_if([_AM_COMPILER_EXEEXT],
|
|
||||||
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
|
|
||||||
|
|
||||||
# POSIX will say in a future version that running "rm -f" with no argument
|
|
||||||
# is OK; and we want to be able to make that assumption in our Makefile
|
|
||||||
# recipes. So use an aggressive probe to check that the usage we want is
|
|
||||||
# actually supported "in the wild" to an acceptable degree.
|
|
||||||
# See automake bug#10828.
|
|
||||||
# To make any issue more visible, cause the running configure to be aborted
|
|
||||||
# by default if the 'rm' program in use doesn't match our expectations; the
|
|
||||||
# user can still override this though.
|
|
||||||
if rm -f && rm -fr && rm -rf; then : OK; else
|
|
||||||
cat >&2 <<'END'
|
|
||||||
Oops!
|
|
||||||
|
|
||||||
Your 'rm' program seems unable to run without file operands specified
|
|
||||||
on the command line, even when the '-f' option is present. This is contrary
|
|
||||||
to the behaviour of most rm programs out there, and not conforming with
|
|
||||||
the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
|
|
||||||
|
|
||||||
Please tell bug-automake@gnu.org about your system, including the value
|
|
||||||
of your $PATH and any error possibly output before this message. This
|
|
||||||
can help us improve future automake versions.
|
|
||||||
|
|
||||||
END
|
|
||||||
if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
|
|
||||||
echo 'Configuration will proceed anyway, since you have set the' >&2
|
|
||||||
echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
|
|
||||||
echo >&2
|
|
||||||
else
|
|
||||||
cat >&2 <<'END'
|
|
||||||
Aborting the configuration process, to ensure you take notice of the issue.
|
|
||||||
|
|
||||||
You can download and install GNU coreutils to get an 'rm' implementation
|
|
||||||
that behaves properly: <http://www.gnu.org/software/coreutils/>.
|
|
||||||
|
|
||||||
If you want to complete the configuration process using your problematic
|
|
||||||
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
|
||||||
to "yes", and re-run configure.
|
|
||||||
|
|
||||||
END
|
|
||||||
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
dnl The trailing newline in this macro's definition is deliberate, for
|
|
||||||
dnl backward compatibility and to allow trailing 'dnl'-style comments
|
|
||||||
dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
|
||||||
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
|
||||||
dnl mangled by Autoconf and run in a shell conditional statement.
|
|
||||||
m4_define([_AC_COMPILER_EXEEXT],
|
|
||||||
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
|
|
||||||
|
|
||||||
# When config.status generates a header, we must update the stamp-h file.
|
|
||||||
# This file resides in the same directory as the config header
|
|
||||||
# that is generated. The stamp files are numbered to have different names.
|
|
||||||
|
|
||||||
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
|
|
||||||
# loop where config.status creates the headers, so we can generate
|
|
||||||
# our stamp files there.
|
|
||||||
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
|
|
||||||
[# Compute $1's index in $config_headers.
|
|
||||||
_am_arg=$1
|
|
||||||
_am_stamp_count=1
|
|
||||||
for _am_header in $config_headers :; do
|
|
||||||
case $_am_header in
|
|
||||||
$_am_arg | $_am_arg:* )
|
|
||||||
break ;;
|
|
||||||
* )
|
|
||||||
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_PROG_INSTALL_SH
|
|
||||||
# ------------------
|
|
||||||
# Define $install_sh.
|
|
||||||
AC_DEFUN([AM_PROG_INSTALL_SH],
|
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
|
||||||
if test x"${install_sh+set}" != xset; then
|
|
||||||
case $am_aux_dir in
|
|
||||||
*\ * | *\ *)
|
|
||||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
|
||||||
*)
|
|
||||||
install_sh="\${SHELL} $am_aux_dir/install-sh"
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_SUBST([install_sh])])
|
|
||||||
|
|
||||||
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
|
||||||
# From Jim Meyering
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_MAINTAINER_MODE([DEFAULT-MODE])
|
|
||||||
# ----------------------------------
|
|
||||||
# Control maintainer-specific portions of Makefiles.
|
|
||||||
# Default is to disable them, unless 'enable' is passed literally.
|
|
||||||
# For symmetry, 'disable' may be passed as well. Anyway, the user
|
|
||||||
# can override the default with the --enable/--disable switch.
|
|
||||||
AC_DEFUN([AM_MAINTAINER_MODE],
|
|
||||||
[m4_case(m4_default([$1], [disable]),
|
|
||||||
[enable], [m4_define([am_maintainer_other], [disable])],
|
|
||||||
[disable], [m4_define([am_maintainer_other], [enable])],
|
|
||||||
[m4_define([am_maintainer_other], [enable])
|
|
||||||
m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
|
|
||||||
AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
|
||||||
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
|
|
||||||
AC_ARG_ENABLE([maintainer-mode],
|
|
||||||
[AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
|
|
||||||
am_maintainer_other[ make rules and dependencies not useful
|
|
||||||
(and sometimes confusing) to the casual installer])],
|
|
||||||
[USE_MAINTAINER_MODE=$enableval],
|
|
||||||
[USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
|
|
||||||
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
|
|
||||||
AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
|
|
||||||
MAINT=$MAINTAINER_MODE_TRUE
|
|
||||||
AC_SUBST([MAINT])dnl
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_MISSING_PROG(NAME, PROGRAM)
|
|
||||||
# ------------------------------
|
|
||||||
AC_DEFUN([AM_MISSING_PROG],
|
|
||||||
[AC_REQUIRE([AM_MISSING_HAS_RUN])
|
|
||||||
$1=${$1-"${am_missing_run}$2"}
|
|
||||||
AC_SUBST($1)])
|
|
||||||
|
|
||||||
# AM_MISSING_HAS_RUN
|
|
||||||
# ------------------
|
|
||||||
# Define MISSING if not defined so far and test if it is modern enough.
|
|
||||||
# If it is, set am_missing_run to use it, otherwise, to nothing.
|
|
||||||
AC_DEFUN([AM_MISSING_HAS_RUN],
|
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
|
||||||
AC_REQUIRE_AUX_FILE([missing])dnl
|
|
||||||
if test x"${MISSING+set}" != xset; then
|
|
||||||
case $am_aux_dir in
|
|
||||||
*\ * | *\ *)
|
|
||||||
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
|
||||||
*)
|
|
||||||
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
# Use eval to expand $SHELL
|
|
||||||
if eval "$MISSING --is-lightweight"; then
|
|
||||||
am_missing_run="$MISSING "
|
|
||||||
else
|
|
||||||
am_missing_run=
|
|
||||||
AC_MSG_WARN(['missing' script is too old or missing])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# _AM_MANGLE_OPTION(NAME)
|
|
||||||
# -----------------------
|
|
||||||
AC_DEFUN([_AM_MANGLE_OPTION],
|
|
||||||
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
# _AM_SET_OPTION(NAME)
|
|
||||||
# --------------------
|
|
||||||
# Set option NAME. Presently that only means defining a flag for this option.
|
|
||||||
AC_DEFUN([_AM_SET_OPTION],
|
|
||||||
[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
|
|
||||||
|
|
||||||
# _AM_SET_OPTIONS(OPTIONS)
|
|
||||||
# ------------------------
|
|
||||||
# OPTIONS is a space-separated list of Automake options.
|
|
||||||
AC_DEFUN([_AM_SET_OPTIONS],
|
|
||||||
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
|
|
||||||
|
|
||||||
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
|
|
||||||
# -------------------------------------------
|
|
||||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
|
||||||
AC_DEFUN([_AM_IF_OPTION],
|
|
||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# _AM_PROG_CC_C_O
|
|
||||||
# ---------------
|
|
||||||
# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
|
|
||||||
# to automatically call this.
|
|
||||||
AC_DEFUN([_AM_PROG_CC_C_O],
|
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
|
||||||
AC_REQUIRE_AUX_FILE([compile])dnl
|
|
||||||
AC_LANG_PUSH([C])dnl
|
|
||||||
AC_CACHE_CHECK(
|
|
||||||
[whether $CC understands -c and -o together],
|
|
||||||
[am_cv_prog_cc_c_o],
|
|
||||||
[AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
|
|
||||||
# Make sure it works both with $CC and with simple cc.
|
|
||||||
# Following AC_PROG_CC_C_O, we do the test twice because some
|
|
||||||
# compilers refuse to overwrite an existing .o file with -o,
|
|
||||||
# though they will create one.
|
|
||||||
am_cv_prog_cc_c_o=yes
|
|
||||||
for am_i in 1 2; do
|
|
||||||
if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
|
|
||||||
&& test -f conftest2.$ac_objext; then
|
|
||||||
: OK
|
|
||||||
else
|
|
||||||
am_cv_prog_cc_c_o=no
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
rm -f core conftest*
|
|
||||||
unset am_i])
|
|
||||||
if test "$am_cv_prog_cc_c_o" != yes; then
|
|
||||||
# Losing compiler, so override with the script.
|
|
||||||
# FIXME: It is wrong to rewrite CC.
|
|
||||||
# But if we don't then we get into trouble of one sort or another.
|
|
||||||
# A longer-term fix would be to have automake use am__CC in this case,
|
|
||||||
# and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
|
|
||||||
CC="$am_aux_dir/compile $CC"
|
|
||||||
fi
|
|
||||||
AC_LANG_POP([C])])
|
|
||||||
|
|
||||||
# For backward compatibility.
|
|
||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_RUN_LOG(COMMAND)
|
|
||||||
# -------------------
|
|
||||||
# Run COMMAND, save the exit status in ac_status, and log it.
|
|
||||||
# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
|
|
||||||
AC_DEFUN([AM_RUN_LOG],
|
|
||||||
[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
|
|
||||||
($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
|
|
||||||
ac_status=$?
|
|
||||||
echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
|
|
||||||
(exit $ac_status); }])
|
|
||||||
|
|
||||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_SANITY_CHECK
|
|
||||||
# ---------------
|
|
||||||
AC_DEFUN([AM_SANITY_CHECK],
|
|
||||||
[AC_MSG_CHECKING([whether build environment is sane])
|
|
||||||
# Reject unsafe characters in $srcdir or the absolute working directory
|
|
||||||
# name. Accept space and tab only in the latter.
|
|
||||||
am_lf='
|
|
||||||
'
|
|
||||||
case `pwd` in
|
|
||||||
*[[\\\"\#\$\&\'\`$am_lf]]*)
|
|
||||||
AC_MSG_ERROR([unsafe absolute working directory name]);;
|
|
||||||
esac
|
|
||||||
case $srcdir in
|
|
||||||
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
|
|
||||||
AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Do 'set' in a subshell so we don't clobber the current shell's
|
|
||||||
# arguments. Must try -L first in case configure is actually a
|
|
||||||
# symlink; some systems play weird games with the mod time of symlinks
|
|
||||||
# (eg FreeBSD returns the mod time of the symlink's containing
|
|
||||||
# directory).
|
|
||||||
if (
|
|
||||||
am_has_slept=no
|
|
||||||
for am_try in 1 2; do
|
|
||||||
echo "timestamp, slept: $am_has_slept" > conftest.file
|
|
||||||
set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
|
|
||||||
if test "$[*]" = "X"; then
|
|
||||||
# -L didn't work.
|
|
||||||
set X `ls -t "$srcdir/configure" conftest.file`
|
|
||||||
fi
|
|
||||||
if test "$[*]" != "X $srcdir/configure conftest.file" \
|
|
||||||
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
|
|
||||||
|
|
||||||
# If neither matched, then we have a broken ls. This can happen
|
|
||||||
# if, for instance, CONFIG_SHELL is bash and it inherits a
|
|
||||||
# broken ls alias from the environment. This has actually
|
|
||||||
# happened. Such a system could not be considered "sane".
|
|
||||||
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
|
|
||||||
alias in your environment])
|
|
||||||
fi
|
|
||||||
if test "$[2]" = conftest.file || test $am_try -eq 2; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
# Just in case.
|
|
||||||
sleep 1
|
|
||||||
am_has_slept=yes
|
|
||||||
done
|
|
||||||
test "$[2]" = conftest.file
|
|
||||||
)
|
|
||||||
then
|
|
||||||
# Ok.
|
|
||||||
:
|
|
||||||
else
|
|
||||||
AC_MSG_ERROR([newly created file is older than distributed files!
|
|
||||||
Check your system clock])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
# If we didn't sleep, we still need to ensure time stamps of config.status and
|
|
||||||
# generated files are strictly newer.
|
|
||||||
am_sleep_pid=
|
|
||||||
if grep 'slept: no' conftest.file >/dev/null 2>&1; then
|
|
||||||
( sleep 1 ) &
|
|
||||||
am_sleep_pid=$!
|
|
||||||
fi
|
|
||||||
AC_CONFIG_COMMANDS_PRE(
|
|
||||||
[AC_MSG_CHECKING([that generated files are newer than configure])
|
|
||||||
if test -n "$am_sleep_pid"; then
|
|
||||||
# Hide warnings about reused PIDs.
|
|
||||||
wait $am_sleep_pid 2>/dev/null
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([done])])
|
|
||||||
rm -f conftest.file
|
|
||||||
])
|
|
||||||
|
|
||||||
# Copyright (C) 2009-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_SILENT_RULES([DEFAULT])
|
|
||||||
# --------------------------
|
|
||||||
# Enable less verbose build rules; with the default set to DEFAULT
|
|
||||||
# ("yes" being less verbose, "no" or empty being verbose).
|
|
||||||
AC_DEFUN([AM_SILENT_RULES],
|
|
||||||
[AC_ARG_ENABLE([silent-rules], [dnl
|
|
||||||
AS_HELP_STRING(
|
|
||||||
[--enable-silent-rules],
|
|
||||||
[less verbose build output (undo: "make V=1")])
|
|
||||||
AS_HELP_STRING(
|
|
||||||
[--disable-silent-rules],
|
|
||||||
[verbose build output (undo: "make V=0")])dnl
|
|
||||||
])
|
|
||||||
case $enable_silent_rules in @%:@ (((
|
|
||||||
yes) AM_DEFAULT_VERBOSITY=0;;
|
|
||||||
no) AM_DEFAULT_VERBOSITY=1;;
|
|
||||||
*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
|
|
||||||
esac
|
|
||||||
dnl
|
|
||||||
dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
|
|
||||||
dnl do not support nested variable expansions.
|
|
||||||
dnl See automake bug#9928 and bug#10237.
|
|
||||||
am_make=${MAKE-make}
|
|
||||||
AC_CACHE_CHECK([whether $am_make supports nested variables],
|
|
||||||
[am_cv_make_support_nested_variables],
|
|
||||||
[if AS_ECHO([['TRUE=$(BAR$(V))
|
|
||||||
BAR0=false
|
|
||||||
BAR1=true
|
|
||||||
V=1
|
|
||||||
am__doit:
|
|
||||||
@$(TRUE)
|
|
||||||
.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
|
|
||||||
am_cv_make_support_nested_variables=yes
|
|
||||||
else
|
|
||||||
am_cv_make_support_nested_variables=no
|
|
||||||
fi])
|
|
||||||
if test $am_cv_make_support_nested_variables = yes; then
|
|
||||||
dnl Using '$V' instead of '$(V)' breaks IRIX make.
|
|
||||||
AM_V='$(V)'
|
|
||||||
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
|
|
||||||
else
|
|
||||||
AM_V=$AM_DEFAULT_VERBOSITY
|
|
||||||
AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
|
|
||||||
fi
|
|
||||||
AC_SUBST([AM_V])dnl
|
|
||||||
AM_SUBST_NOTMAKE([AM_V])dnl
|
|
||||||
AC_SUBST([AM_DEFAULT_V])dnl
|
|
||||||
AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
|
|
||||||
AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
|
|
||||||
AM_BACKSLASH='\'
|
|
||||||
AC_SUBST([AM_BACKSLASH])dnl
|
|
||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# AM_PROG_INSTALL_STRIP
|
|
||||||
# ---------------------
|
|
||||||
# One issue with vendor 'install' (even GNU) is that you can't
|
|
||||||
# specify the program used to strip binaries. This is especially
|
|
||||||
# annoying in cross-compiling environments, where the build's strip
|
|
||||||
# is unlikely to handle the host's binaries.
|
|
||||||
# Fortunately install-sh will honor a STRIPPROG variable, so we
|
|
||||||
# always use install-sh in "make install-strip", and initialize
|
|
||||||
# STRIPPROG with the value of the STRIP variable (set by the user).
|
|
||||||
AC_DEFUN([AM_PROG_INSTALL_STRIP],
|
|
||||||
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
|
||||||
# Installed binaries are usually stripped using 'strip' when the user
|
|
||||||
# run "make install-strip". However 'strip' might not be the right
|
|
||||||
# tool to use in cross-compilation environments, therefore Automake
|
|
||||||
# will honor the 'STRIP' environment variable to overrule this program.
|
|
||||||
dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
|
|
||||||
if test "$cross_compiling" != no; then
|
|
||||||
AC_CHECK_TOOL([STRIP], [strip], :)
|
|
||||||
fi
|
|
||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
|
||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
|
||||||
|
|
||||||
# Copyright (C) 2006-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# _AM_SUBST_NOTMAKE(VARIABLE)
|
|
||||||
# ---------------------------
|
|
||||||
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
|
|
||||||
# This macro is traced by Automake.
|
|
||||||
AC_DEFUN([_AM_SUBST_NOTMAKE])
|
|
||||||
|
|
||||||
# AM_SUBST_NOTMAKE(VARIABLE)
|
|
||||||
# --------------------------
|
|
||||||
# Public sister of _AM_SUBST_NOTMAKE.
|
|
||||||
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
|
||||||
|
|
||||||
# Check how to create a tarball. -*- Autoconf -*-
|
|
||||||
|
|
||||||
# Copyright (C) 2004-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# _AM_PROG_TAR(FORMAT)
|
|
||||||
# --------------------
|
|
||||||
# Check how to create a tarball in format FORMAT.
|
|
||||||
# FORMAT should be one of 'v7', 'ustar', or 'pax'.
|
|
||||||
#
|
|
||||||
# Substitute a variable $(am__tar) that is a command
|
|
||||||
# writing to stdout a FORMAT-tarball containing the directory
|
|
||||||
# $tardir.
|
|
||||||
# tardir=directory && $(am__tar) > result.tar
|
|
||||||
#
|
|
||||||
# Substitute a variable $(am__untar) that extract such
|
|
||||||
# a tarball read from stdin.
|
|
||||||
# $(am__untar) < result.tar
|
|
||||||
#
|
|
||||||
AC_DEFUN([_AM_PROG_TAR],
|
|
||||||
[# Always define AMTAR for backward compatibility. Yes, it's still used
|
|
||||||
# in the wild :-( We should find a proper way to deprecate it ...
|
|
||||||
AC_SUBST([AMTAR], ['$${TAR-tar}'])
|
|
||||||
|
|
||||||
# We'll loop over all known methods to create a tar archive until one works.
|
|
||||||
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
|
|
||||||
|
|
||||||
m4_if([$1], [v7],
|
|
||||||
[am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
|
|
||||||
|
|
||||||
[m4_case([$1],
|
|
||||||
[ustar],
|
|
||||||
[# The POSIX 1988 'ustar' format is defined with fixed-size fields.
|
|
||||||
# There is notably a 21 bits limit for the UID and the GID. In fact,
|
|
||||||
# the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
|
|
||||||
# and bug#13588).
|
|
||||||
am_max_uid=2097151 # 2^21 - 1
|
|
||||||
am_max_gid=$am_max_uid
|
|
||||||
# The $UID and $GID variables are not portable, so we need to resort
|
|
||||||
# to the POSIX-mandated id(1) utility. Errors in the 'id' calls
|
|
||||||
# below are definitely unexpected, so allow the users to see them
|
|
||||||
# (that is, avoid stderr redirection).
|
|
||||||
am_uid=`id -u || echo unknown`
|
|
||||||
am_gid=`id -g || echo unknown`
|
|
||||||
AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
|
|
||||||
if test $am_uid -le $am_max_uid; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
_am_tools=none
|
|
||||||
fi
|
|
||||||
AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
|
|
||||||
if test $am_gid -le $am_max_gid; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
_am_tools=none
|
|
||||||
fi],
|
|
||||||
|
|
||||||
[pax],
|
|
||||||
[],
|
|
||||||
|
|
||||||
[m4_fatal([Unknown tar format])])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([how to create a $1 tar archive])
|
|
||||||
|
|
||||||
# Go ahead even if we have the value already cached. We do so because we
|
|
||||||
# need to set the values for the 'am__tar' and 'am__untar' variables.
|
|
||||||
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
|
|
||||||
|
|
||||||
for _am_tool in $_am_tools; do
|
|
||||||
case $_am_tool in
|
|
||||||
gnutar)
|
|
||||||
for _am_tar in tar gnutar gtar; do
|
|
||||||
AM_RUN_LOG([$_am_tar --version]) && break
|
|
||||||
done
|
|
||||||
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
|
|
||||||
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
|
|
||||||
am__untar="$_am_tar -xf -"
|
|
||||||
;;
|
|
||||||
plaintar)
|
|
||||||
# Must skip GNU tar: if it does not support --format= it doesn't create
|
|
||||||
# ustar tarball either.
|
|
||||||
(tar --version) >/dev/null 2>&1 && continue
|
|
||||||
am__tar='tar chf - "$$tardir"'
|
|
||||||
am__tar_='tar chf - "$tardir"'
|
|
||||||
am__untar='tar xf -'
|
|
||||||
;;
|
|
||||||
pax)
|
|
||||||
am__tar='pax -L -x $1 -w "$$tardir"'
|
|
||||||
am__tar_='pax -L -x $1 -w "$tardir"'
|
|
||||||
am__untar='pax -r'
|
|
||||||
;;
|
|
||||||
cpio)
|
|
||||||
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
|
|
||||||
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
|
|
||||||
am__untar='cpio -i -H $1 -d'
|
|
||||||
;;
|
|
||||||
none)
|
|
||||||
am__tar=false
|
|
||||||
am__tar_=false
|
|
||||||
am__untar=false
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If the value was cached, stop now. We just wanted to have am__tar
|
|
||||||
# and am__untar set.
|
|
||||||
test -n "${am_cv_prog_tar_$1}" && break
|
|
||||||
|
|
||||||
# tar/untar a dummy directory, and stop if the command works.
|
|
||||||
rm -rf conftest.dir
|
|
||||||
mkdir conftest.dir
|
|
||||||
echo GrepMe > conftest.dir/file
|
|
||||||
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
|
|
||||||
rm -rf conftest.dir
|
|
||||||
if test -s conftest.tar; then
|
|
||||||
AM_RUN_LOG([$am__untar <conftest.tar])
|
|
||||||
AM_RUN_LOG([cat conftest.dir/file])
|
|
||||||
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
rm -rf conftest.dir
|
|
||||||
|
|
||||||
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
|
|
||||||
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
|
|
||||||
|
|
||||||
AC_SUBST([am__tar])
|
|
||||||
AC_SUBST([am__untar])
|
|
||||||
]) # _AM_PROG_TAR
|
|
||||||
|
|
||||||
m4_include([config/lead-dot.m4])
|
|
||||||
m4_include([config/libtool.m4])
|
|
||||||
m4_include([config/ltoptions.m4])
|
|
||||||
m4_include([config/ltsugar.m4])
|
|
||||||
m4_include([config/ltversion.m4])
|
|
||||||
m4_include([config/lt~obsolete.m4])
|
|
||||||
m4_include([config/multi.m4])
|
|
||||||
m4_include([config/override.m4])
|
|
||||||
m4_include([config/unwind_ipinfo.m4])
|
|
||||||
m4_include([config/warnings.m4])
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user