summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCurtis McEnroe2019-09-16 16:57:50 -0400
committerCurtis McEnroe2019-09-16 16:57:50 -0400
commitc5718dd82fca4fb633846ae232838b477d95d16e (patch)
treee7d1e314584c56469a609005212523fa9c24ba15
parentaa3cf0b7d303e7e3b5c4c629f645e17cfb6c8fac (diff)
Add restricted mode
-rw-r--r--catgirl.112
-rw-r--r--chat.c3
-rw-r--r--chat.h1
-rw-r--r--input.c47
4 files changed, 39 insertions, 24 deletions
diff --git a/catgirl.1 b/catgirl.1
index 0dbed23..51f1c4f 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -1,4 +1,4 @@
-.Dd July 2, 2019
+.Dd September 16, 2019
.Dt CATGIRL 1
.Os
.
@@ -8,7 +8,7 @@
.
.Sh SYNOPSIS
.Nm
-.Op Fl Nv
+.Op Fl NRv
.Op Fl W Ar pass
.Op Fl a Ar auth
.Op Fl h Ar host
@@ -33,6 +33,14 @@ The arguments are as follows:
Send notifications with
.Xr notify-send 1 .
.
+.It Fl R
+Restrict the use of the
+.Ic /join ,
+.Ic /query ,
+.Ic /quote ,
+.Ic /raw
+commands.
+.
.It Fl W Ar pass
Send
.Cm WEBIRC
diff --git a/chat.c b/chat.c
index 13f3c76..021ac77 100644
--- a/chat.c
+++ b/chat.c
@@ -53,9 +53,10 @@ int main(int argc, char *argv[]) {
setlocale(LC_CTYPE, "");
int opt;
- while (0 < (opt = getopt(argc, argv, "NW:a:h:j:k:l:n:p:r:u:vw:"))) {
+ while (0 < (opt = getopt(argc, argv, "NRW:a:h:j:k:l:n:p:r:u:vw:"))) {
switch (opt) {
break; case 'N': self.notify = true;
+ break; case 'R': self.limit = true;
break; case 'W': self.webp = dupe(optarg);
break; case 'a': self.auth = dupe(optarg);
break; case 'h': self.host = dupe(optarg);
diff --git a/chat.h b/chat.h
index bd7158b..9cec917 100644
--- a/chat.h
+++ b/chat.h
@@ -44,6 +44,7 @@ struct {
char *real;
char *join;
char *keys;
+ bool limit;
bool raw;
bool notify;
bool quit;
diff --git a/input.c b/input.c
index c4f707e..8be8eaf 100644
--- a/input.c
+++ b/input.c
@@ -195,28 +195,29 @@ static void inputWindow(struct Tag tag, char *params) {
static const struct {
const char *command;
Handler *handler;
+ bool limit;
} Commands[] = {
- { "/close", inputClose },
- { "/help", inputMan },
- { "/join", inputJoin },
- { "/list", inputList },
- { "/man", inputMan },
- { "/me", inputMe },
- { "/move", inputMove },
- { "/names", inputWho },
- { "/nick", inputNick },
- { "/open", inputOpen },
- { "/part", inputPart },
- { "/query", inputQuery },
- { "/quit", inputQuit },
- { "/quote", inputQuote },
- { "/raw", inputRaw },
- { "/topic", inputTopic },
- { "/url", inputURL },
- { "/who", inputWho },
- { "/whois", inputWhois },
- { "/window", inputWindow },
- { "/znc", inputZNC },
+ { "/close", .handler = inputClose },
+ { "/help", .handler = inputMan },
+ { "/join", .handler = inputJoin, .limit = true },
+ { "/list", .handler = inputList },
+ { "/man", .handler = inputMan },
+ { "/me", .handler = inputMe },
+ { "/move", .handler = inputMove },
+ { "/names", .handler = inputWho },
+ { "/nick", .handler = inputNick },
+ { "/open", .handler = inputOpen },
+ { "/part", .handler = inputPart },
+ { "/query", .handler = inputQuery, .limit = true },
+ { "/quit", .handler = inputQuit },
+ { "/quote", .handler = inputQuote, .limit = true },
+ { "/raw", .handler = inputRaw, .limit = true },
+ { "/topic", .handler = inputTopic },
+ { "/url", .handler = inputURL },
+ { "/who", .handler = inputWho },
+ { "/whois", .handler = inputWhois },
+ { "/window", .handler = inputWindow },
+ { "/znc", .handler = inputZNC },
};
static const size_t CommandsLen = sizeof(Commands) / sizeof(Commands[0]);
@@ -264,6 +265,10 @@ void input(struct Tag tag, char *input) {
for (size_t i = 0; i < CommandsLen; ++i) {
if (strcasecmp(command, Commands[i].command)) continue;
+ if (self.limit && Commands[i].limit) {
+ uiFmt(tag, UIHot, "%s isn't available in restricted mode", command);
+ return;
+ }
Commands[i].handler(tag, input);
return;
}