]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/RegisterCommand.java
Update register error message
[signal-cli] / src / main / java / org / asamk / signal / commands / RegisterCommand.java
1 package org.asamk.signal.commands;
2
3 import com.fasterxml.jackson.core.type.TypeReference;
4
5 import net.sourceforge.argparse4j.impl.Arguments;
6 import net.sourceforge.argparse4j.inf.Namespace;
7 import net.sourceforge.argparse4j.inf.Subparser;
8
9 import org.asamk.signal.OutputType;
10 import org.asamk.signal.commands.exceptions.CommandException;
11 import org.asamk.signal.commands.exceptions.IOErrorException;
12 import org.asamk.signal.commands.exceptions.UserErrorException;
13 import org.asamk.signal.manager.RegistrationManager;
14 import org.asamk.signal.manager.api.CaptchaRequiredException;
15 import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
16 import org.asamk.signal.output.JsonWriter;
17
18 import java.io.IOException;
19 import java.util.List;
20
21 public class RegisterCommand implements RegistrationCommand, JsonRpcRegistrationCommand<RegisterCommand.RegistrationParams> {
22
23 @Override
24 public String getName() {
25 return "register";
26 }
27
28 @Override
29 public void attachToSubparser(final Subparser subparser) {
30 subparser.help("Register a phone number with SMS or voice verification.");
31 subparser.addArgument("-v", "--voice")
32 .help("The verification should be done over voice, not SMS.")
33 .action(Arguments.storeTrue());
34 subparser.addArgument("--captcha")
35 .help("The captcha token, required if registration failed with a captcha required error.");
36 }
37
38 @Override
39 public void handleCommand(final Namespace ns, final RegistrationManager m) throws CommandException {
40 final boolean voiceVerification = Boolean.TRUE.equals(ns.getBoolean("voice"));
41 final var captcha = ns.getString("captcha");
42
43 register(m, voiceVerification, captcha);
44 }
45
46 @Override
47 public TypeReference<RegistrationParams> getRequestType() {
48 return new TypeReference<>() {};
49 }
50
51 @Override
52 public List<OutputType> getSupportedOutputTypes() {
53 return List.of(OutputType.PLAIN_TEXT, OutputType.JSON);
54 }
55
56 @Override
57 public void handleCommand(
58 final RegistrationParams request, final RegistrationManager m, final JsonWriter jsonWriter
59 ) throws CommandException {
60 register(m, Boolean.TRUE.equals(request.voice()), request.captcha());
61 }
62
63 private void register(
64 final RegistrationManager m, final boolean voiceVerification, final String captcha
65 ) throws UserErrorException, IOErrorException {
66 try {
67 m.register(voiceVerification, captcha);
68 } catch (CaptchaRequiredException e) {
69 String message;
70 if (captcha == null) {
71 message = """
72 Captcha required for verification, use --captcha CAPTCHA
73 To get the token, go to https://signalcaptchas.org/registration/generate.html
74 Check the developer tools (F12) console for a failed redirect to signalcaptcha://
75 Everything after signalcaptcha:// is the captcha token.""";
76 } else {
77 message = "Invalid captcha given.";
78 }
79 throw new UserErrorException(message);
80 } catch (NonNormalizedPhoneNumberException e) {
81 throw new UserErrorException("Failed to register: " + e.getMessage(), e);
82 } catch (IOException e) {
83 throw new IOErrorException("Failed to register: " + e.getMessage(), e);
84 }
85 }
86
87 record RegistrationParams(Boolean voice, String captcha) {}
88 }