summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/home/homectl-recovery-key.c51
-rw-r--r--src/journal/journal-qrcode.c97
-rw-r--r--src/journal/journal-qrcode.h9
-rw-r--r--src/journal/journalctl.c75
-rw-r--r--src/journal/meson.build5
-rw-r--r--src/shared/meson.build9
-rw-r--r--src/shared/qrcode-util.c50
-rw-r--r--src/shared/qrcode-util.h12
8 files changed, 123 insertions, 185 deletions
diff --git a/src/home/homectl-recovery-key.c b/src/home/homectl-recovery-key.c
index c63d3415f4..3311205db5 100644
--- a/src/home/homectl-recovery-key.c
+++ b/src/home/homectl-recovery-key.c
@@ -1,17 +1,12 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
-#if HAVE_QRENCODE
-#include <qrencode.h>
-#include "qrcode-util.h"
-#endif
-
-#include "dlfcn-util.h"
#include "errno-util.h"
#include "homectl-recovery-key.h"
#include "libcrypt-util.h"
#include "locale-util.h"
#include "memory-util.h"
#include "modhex.h"
+#include "qrcode-util.h"
#include "random-util.h"
#include "strv.h"
#include "terminal-util.h"
@@ -140,48 +135,6 @@ static int add_secret(JsonVariant **v, const char *password) {
return 0;
}
-static int print_qr_code(const char *secret) {
-#if HAVE_QRENCODE
- QRcode* (*sym_QRcode_encodeString)(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
- void (*sym_QRcode_free)(QRcode *qrcode);
- _cleanup_(dlclosep) void *dl = NULL;
- QRcode* qr;
- int r;
-
- /* If this is not an UTF-8 system or ANSI colors aren't supported/disabled don't print any QR
- * codes */
- if (!is_locale_utf8() || !colors_enabled())
- return -EOPNOTSUPP;
-
- dl = dlopen("libqrencode.so.4", RTLD_LAZY);
- if (!dl)
- return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
- "QRCODE support is not installed: %s", dlerror());
-
- r = dlsym_many_and_warn(
- dl,
- LOG_DEBUG,
- &sym_QRcode_encodeString, "QRcode_encodeString",
- &sym_QRcode_free, "QRcode_free",
- NULL);
- if (r < 0)
- return r;
-
- qr = sym_QRcode_encodeString(secret, 0, QR_ECLEVEL_L, QR_MODE_8, 0);
- if (!qr)
- return -ENOMEM;
-
- fprintf(stderr, "\nYou may optionally scan the recovery key off screen:\n\n");
-
- write_qrcode(stderr, qr);
-
- fputc('\n', stderr);
-
- sym_QRcode_free(qr);
-#endif
- return 0;
-}
-
int identity_add_recovery_key(JsonVariant **v) {
_cleanup_(erase_and_freep) char *password = NULL, *hashed = NULL;
int r;
@@ -240,7 +193,7 @@ int identity_add_recovery_key(JsonVariant **v) {
"whenever authentication is requested.\n", stderr);
fflush(stderr);
- print_qr_code(password);
+ (void) print_qrcode(stderr, "You may optionally scan the recovery key off screen", password);
return 0;
}
diff --git a/src/journal/journal-qrcode.c b/src/journal/journal-qrcode.c
deleted file mode 100644
index e8a7655316..0000000000
--- a/src/journal/journal-qrcode.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1+ */
-
-#include <errno.h>
-#include <qrencode.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "alloc-util.h"
-#include "dlfcn-util.h"
-#include "fd-util.h"
-#include "fileio.h"
-#include "journal-qrcode.h"
-#include "locale-util.h"
-#include "macro.h"
-#include "qrcode-util.h"
-#include "terminal-util.h"
-
-int print_qr_code(
- FILE *output,
- const char *prefix_text,
- const void *seed,
- size_t seed_size,
- uint64_t start,
- uint64_t interval,
- const char *hn,
- sd_id128_t machine) {
-
- QRcode* (*sym_QRcode_encodeString)(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
- void (*sym_QRcode_free)(QRcode *qrcode);
- _cleanup_(dlclosep) void *dl = NULL;
- _cleanup_free_ char *url = NULL;
- _cleanup_fclose_ FILE *f = NULL;
- size_t url_size = 0;
- QRcode* qr;
- int r;
-
- assert(seed);
- assert(seed_size > 0);
-
- /* If this is not an UTF-8 system or ANSI colors aren't supported/disabled don't print any QR
- * codes */
- if (!is_locale_utf8() || !colors_enabled())
- return -EOPNOTSUPP;
-
- dl = dlopen("libqrencode.so.4", RTLD_LAZY);
- if (!dl)
- return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
- "QRCODE support is not installed: %s", dlerror());
-
- r = dlsym_many_and_warn(
- dl,
- LOG_DEBUG,
- &sym_QRcode_encodeString, "QRcode_encodeString",
- &sym_QRcode_free, "QRcode_free",
- NULL);
- if (r < 0)
- return r;
-
- f = open_memstream_unlocked(&url, &url_size);
- if (!f)
- return -ENOMEM;
-
- fputs("fss://", f);
-
- for (size_t i = 0; i < seed_size; i++) {
- if (i > 0 && i % 3 == 0)
- fputc('-', f);
- fprintf(f, "%02x", ((uint8_t*) seed)[i]);
- }
-
- fprintf(f, "/%"PRIx64"-%"PRIx64"?machine=" SD_ID128_FORMAT_STR,
- start,
- interval,
- SD_ID128_FORMAT_VAL(machine));
-
- if (hn)
- fprintf(f, ";hostname=%s", hn);
-
- r = fflush_and_check(f);
- if (r < 0)
- return r;
-
- f = safe_fclose(f);
-
- qr = sym_QRcode_encodeString(url, 0, QR_ECLEVEL_L, QR_MODE_8, 1);
- if (!qr)
- return -ENOMEM;
-
- if (prefix_text)
- fputs(prefix_text, output);
-
- write_qrcode(output, qr);
-
- sym_QRcode_free(qr);
- return 0;
-}
diff --git a/src/journal/journal-qrcode.h b/src/journal/journal-qrcode.h
deleted file mode 100644
index 24ae9d32ee..0000000000
--- a/src/journal/journal-qrcode.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1+ */
-#pragma once
-
-#include <inttypes.h>
-#include <stdio.h>
-
-#include "sd-id128.h"
-
-int print_qr_code(FILE *f, const char *prefix_text, const void *seed, size_t seed_size, uint64_t start, uint64_t interval, const char *hn, sd_id128_t machine);
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index e43e9d1afa..4014b8aad2 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -43,7 +43,6 @@
#include "io-util.h"
#include "journal-def.h"
#include "journal-internal.h"
-#include "journal-qrcode.h"
#include "journal-util.h"
#include "journal-vacuum.h"
#include "journal-verify.h"
@@ -60,6 +59,7 @@
#include "path-util.h"
#include "pcre2-dlopen.h"
#include "pretty-print.h"
+#include "qrcode-util.h"
#include "random-util.h"
#include "rlimit-util.h"
#include "set.h"
@@ -1779,6 +1779,53 @@ static int add_syslog_identifier(sd_journal *j) {
return 0;
}
+static int format_journal_url(
+ const void *seed,
+ size_t seed_size,
+ uint64_t start,
+ uint64_t interval,
+ const char *hn,
+ sd_id128_t machine,
+ bool full,
+ char **ret_url) {
+ _cleanup_free_ char *url = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ size_t url_size = 0;
+ int r;
+
+ assert(seed);
+ assert(seed_size > 0);
+
+ f = open_memstream_unlocked(&url, &url_size);
+ if (!f)
+ return -ENOMEM;
+
+ if (full)
+ fputs("fss://", f);
+
+ for (size_t i = 0; i < seed_size; i++) {
+ if (i > 0 && i % 3 == 0)
+ fputc('-', f);
+ fprintf(f, "%02x", ((uint8_t*) seed)[i]);
+ }
+
+ fprintf(f, "/%"PRIx64"-%"PRIx64, start, interval);
+
+ if (full) {
+ fprintf(f, "?machine=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(machine));
+ if (hn)
+ fprintf(f, ";hostname=%s", hn);
+ }
+
+ r = fflush_and_check(f);
+ if (r < 0)
+ return r;
+
+ f = safe_fclose(f);
+ *ret_url = TAKE_PTR(url);
+ return 0;
+}
+
static int setup_keys(void) {
#if HAVE_GCRYPT
size_t mpk_size, seed_size, state_size;
@@ -1893,7 +1940,11 @@ static int setup_keys(void) {
k = mfree(k);
- _cleanup_free_ char *hn = NULL;
+ _cleanup_free_ char *hn = NULL, *key = NULL;
+
+ r = format_journal_url(seed, seed_size, n, arg_interval, hn, machine, false, &key);
+ if (r < 0)
+ return r;
if (on_tty()) {
hn = gethostname_malloc();
@@ -1925,21 +1976,19 @@ static int setup_keys(void) {
fflush(stderr);
}
- for (size_t i = 0; i < seed_size; i++) {
- if (i > 0 && i % 3 == 0)
- putchar('-');
- printf("%02x", ((uint8_t*) seed)[i]);
- }
- printf("/%llx-%llx\n", (unsigned long long) n, (unsigned long long) arg_interval);
+ puts(key);
if (on_tty()) {
fprintf(stderr, "%s", ansi_normal());
#if HAVE_QRENCODE
- (void) print_qr_code(stderr,
- "\nTo transfer the verification key to your phone scan the QR code below:\n",
- seed, seed_size,
- n, arg_interval,
- hn, machine);
+ _cleanup_free_ char *url = NULL;
+ r = format_journal_url(seed, seed_size, n, arg_interval, hn, machine, true, &url);
+ if (r < 0)
+ return r;
+
+ (void) print_qrcode(stderr,
+ "To transfer the verification key to your phone scan the QR code below",
+ url);
#endif
}
diff --git a/src/journal/meson.build b/src/journal/meson.build
index 3a590bdc6c..215ba949e7 100644
--- a/src/journal/meson.build
+++ b/src/journal/meson.build
@@ -107,11 +107,6 @@ journalctl_sources = files('''
pcre2-dlopen.h
'''.split())
-if conf.get('HAVE_QRENCODE') == 1
- journalctl_sources += files('journal-qrcode.c',
- 'journal-qrcode.h')
-endif
-
install_data('journald.conf',
install_dir : pkgsysconfdir)
diff --git a/src/shared/meson.build b/src/shared/meson.build
index 0ed216f1aa..260ee5a8b6 100644
--- a/src/shared/meson.build
+++ b/src/shared/meson.build
@@ -195,6 +195,8 @@ shared_sources = files('''
ptyfwd.h
pwquality-util.c
pwquality-util.h
+ qrcode-util.c
+ qrcode-util.h
reboot-util.c
reboot-util.h
resize-fs.c
@@ -304,13 +306,6 @@ if conf.get('HAVE_PAM') == 1
'''.split())
endif
-if conf.get('HAVE_QRENCODE') == 1
- shared_sources += files('''
- qrcode-util.c
- qrcode-util.h
-'''.split())
-endif
-
generate_ip_protocol_list = find_program('generate-ip-protocol-list.sh')
ip_protocol_list_txt = custom_target(
'ip-protocol-list.txt',
diff --git a/src/shared/qrcode-util.c b/src/shared/qrcode-util.c
index 99995eb893..4094c4ff3b 100644
--- a/src/shared/qrcode-util.c
+++ b/src/shared/qrcode-util.c
@@ -1,4 +1,10 @@
#include "qrcode-util.h"
+
+#if HAVE_QRENCODE
+#include <qrencode.h>
+
+#include "dlfcn-util.h"
+#include "locale-util.h"
#include "terminal-util.h"
#define ANSI_WHITE_ON_BLACK "\033[40;37;1m"
@@ -15,7 +21,7 @@ static void print_border(FILE *output, unsigned width) {
}
}
-void write_qrcode(FILE *output, QRcode *qr) {
+static void write_qrcode(FILE *output, QRcode *qr) {
assert(qr);
if (!output)
@@ -55,3 +61,45 @@ void write_qrcode(FILE *output, QRcode *qr) {
print_border(output, qr->width);
fflush(output);
}
+
+int print_qrcode(FILE *out, const char *header, const char *string) {
+ QRcode* (*sym_QRcode_encodeString)(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
+ void (*sym_QRcode_free)(QRcode *qrcode);
+ _cleanup_(dlclosep) void *dl = NULL;
+ QRcode* qr;
+ int r;
+
+ /* If this is not an UTF-8 system or ANSI colors aren't supported/disabled don't print any QR
+ * codes */
+ if (!is_locale_utf8() || !colors_enabled())
+ return -EOPNOTSUPP;
+
+ dl = dlopen("libqrencode.so.4", RTLD_LAZY);
+ if (!dl)
+ return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+ "QRCODE support is not installed: %s", dlerror());
+
+ r = dlsym_many_and_warn(
+ dl,
+ LOG_DEBUG,
+ &sym_QRcode_encodeString, "QRcode_encodeString",
+ &sym_QRcode_free, "QRcode_free",
+ NULL);
+ if (r < 0)
+ return r;
+
+ qr = sym_QRcode_encodeString(string, 0, QR_ECLEVEL_L, QR_MODE_8, 0);
+ if (!qr)
+ return -ENOMEM;
+
+ if (header)
+ fprintf(out, "\n%s:\n\n", header);
+
+ write_qrcode(out, qr);
+
+ fputc('\n', out);
+
+ sym_QRcode_free(qr);
+ return 0;
+}
+#endif
diff --git a/src/shared/qrcode-util.h b/src/shared/qrcode-util.h
index 9a21ffd7fe..036c3f7f90 100644
--- a/src/shared/qrcode-util.h
+++ b/src/shared/qrcode-util.h
@@ -1,9 +1,13 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
-#pragma once
-#if HAVE_QRENCODE
-#include <qrencode.h>
+#pragma once
#include <stdio.h>
+#include <errno.h>
-void write_qrcode(FILE *output, QRcode *qr);
+#if HAVE_QRENCODE
+int print_qrcode(FILE *out, const char *header, const char *string);
+#else
+static inline int print_qrcode(FILE *out, const char *header, const char *string) {
+ return -EOPNOTSUPP;
+}
#endif