Skip to content

Commit f9422cf

Browse files
authored
Merge pull request #30 from rust-lang/role-limit-tags
Protect the tags!
2 parents 7d65f30 + 593ae55 commit f9422cf

File tree

6 files changed

+69
-46
lines changed

6 files changed

+69
-46
lines changed

COMMANDS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ cmds.add("?greet {name}", |args: Args<'_>| -> Result {
1717

1818
The same command using a function pointer as a handler.
1919
```rust
20-
fn print_hello_name<'m>(args: Args<'m>) -> Result {
20+
fn print_hello_name(args: Args) -> Result {
2121
println!("Hello {}!", args.params.get("name").unwrap());
2222
};
2323

GETTING_STARTED.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ environment variables come from discord.
3939

4040
+ `MOD_ID` is the id of the mod role
4141
+ `TALK_ID` is the id of the talk role
42+
+ `WG_AND_TEAMS_ID` is the id of the working groups and teams role
4243
+ `DISCORD_TOKEN` is the token used to connect to discord
4344
+ `DATABASE_URL` is the url where the database is running, you will need to
4445
update the port to the port your instance of postgres is running on

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ Lookup a tag
1616
```
1717
Create a tag
1818
```
19-
?tag create {key} [value]
19+
?tags create {key} value...
2020
```
2121
Delete a tag
2222
```
23-
?tag delete {key}
23+
?tags delete {key}
2424
```
2525
Get all tags
2626
```

src/api.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,30 @@ pub(crate) fn has_role(args: &Args, role: &RoleId) -> Result<bool> {
2121
.contains(role))
2222
}
2323

24-
/// Return whether or not the user is a mod.
25-
pub(crate) fn is_mod(args: &Args) -> Result<bool> {
24+
fn check_permission(args: &Args, role: Option<String>) -> Result<bool> {
2625
use std::str::FromStr;
26+
if let Some(role_id) = role {
27+
Ok(has_role(args, &RoleId::from(u64::from_str(&role_id)?))?)
28+
} else {
29+
Ok(false)
30+
}
31+
}
2732

33+
/// Return whether or not the user is a mod.
34+
pub(crate) fn is_mod(args: &Args) -> Result<bool> {
2835
let role = roles::table
2936
.filter(roles::name.eq("mod"))
3037
.first::<(i32, String, String)>(&DB.get()?)
3138
.optional()?;
3239

33-
if let Some((_, role_id, _)) = role {
34-
Ok(has_role(args, &RoleId::from(u64::from_str(&role_id)?))?)
35-
} else {
36-
Ok(false)
37-
}
40+
check_permission(args, role.map(|(_, role_id, _)| role_id))
41+
}
42+
43+
pub(crate) fn is_wg_and_teams(args: &Args) -> Result<bool> {
44+
let role = roles::table
45+
.filter(roles::name.eq("wg_and_teams"))
46+
.first::<(i32, String, String)>(&DB.get()?)
47+
.optional()?;
48+
49+
check_permission(args, role.map(|(_, role_id, _)| role_id))
3850
}

src/main.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ fn init_data() -> Result {
3030
info!("Loading data into database");
3131
let mod_role = std::env::var("MOD_ID").map_err(|_| "MOD_ID env var not found")?;
3232
let talk_role = std::env::var("TALK_ID").map_err(|_| "TALK_ID env var not found")?;
33+
let wg_and_teams_role =
34+
std::env::var("WG_AND_TEAMS_ID").map_err(|_| "WG_AND_TEAMS_ID env var not found")?;
3335

3436
let conn = DB.get()?;
3537

@@ -50,6 +52,7 @@ fn init_data() -> Result {
5052
.run::<_, Box<dyn std::error::Error>, _>(|| {
5153
upsert_role("mod", &mod_role)?;
5254
upsert_role("talk", &talk_role)?;
55+
upsert_role("wg_and_teams", &wg_and_teams_role)?;
5356

5457
Ok(())
5558
})?;
@@ -69,12 +72,11 @@ fn app() -> Result {
6972
let mut cmds = Commands::new();
7073

7174
// Tags
72-
cmds.add("?tag {key}", tags::get);
73-
cmds.add("?tags get {key}", tags::get);
7475
cmds.add("?tags delete {key}", tags::delete);
7576
cmds.add("?tags create {key} value...", tags::post);
76-
cmds.add("?tags get-all", tags::get_all);
7777
cmds.add("?tags help", tags::help);
78+
cmds.add("?tags", tags::get_all);
79+
cmds.add("?tag {key}", tags::get);
7880

7981
// crates.io
8082
cmds.add("?crate help", crates::help);

src/tags.rs

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,48 @@ use diesel::prelude::*;
99

1010
/// Remove a key value pair from the tags.
1111
pub fn delete(args: Args) -> Result<()> {
12-
let conn = DB.get()?;
13-
let key = args
14-
.params
15-
.get("key")
16-
.ok_or("Unable to retrieve param: key")?;
17-
18-
match diesel::delete(tags::table.filter(tags::key.eq(key))).execute(&conn) {
19-
Ok(_) => args.msg.react(args.cx, "✅")?,
20-
Err(_) => args.msg.react(args.cx, "❌")?,
12+
if api::is_wg_and_teams(&args)? {
13+
let conn = DB.get()?;
14+
let key = args
15+
.params
16+
.get("key")
17+
.ok_or("Unable to retrieve param: key")?;
18+
19+
match diesel::delete(tags::table.filter(tags::key.eq(key))).execute(&conn) {
20+
Ok(_) => args.msg.react(args.cx, "✅")?,
21+
Err(_) => api::send_reply(&args, "A database error occurred when deleting the tag.")?,
22+
}
2123
}
2224
Ok(())
2325
}
2426

2527
/// Add a key value pair to the tags.
2628
pub fn post(args: Args) -> Result<()> {
27-
let conn = DB.get()?;
28-
29-
let key = args
30-
.params
31-
.get("key")
32-
.ok_or("Unable to retrieve param: key")?;
33-
34-
let value = args
35-
.params
36-
.get("value")
37-
.ok_or("Unable to retrieve param: value")?;
38-
39-
match diesel::insert_into(tags::table)
40-
.values((tags::key.eq(key), tags::value.eq(value)))
41-
.execute(&conn)
42-
{
43-
Ok(_) => args.msg.react(args.cx, "✅")?,
44-
Err(_) => args.msg.react(args.cx, "❌")?,
29+
if api::is_wg_and_teams(&args)? {
30+
let conn = DB.get()?;
31+
32+
let key = args
33+
.params
34+
.get("key")
35+
.ok_or("Unable to retrieve param: key")?;
36+
37+
let value = args
38+
.params
39+
.get("value")
40+
.ok_or("Unable to retrieve param: value")?;
41+
42+
match diesel::insert_into(tags::table)
43+
.values((tags::key.eq(key), tags::value.eq(value)))
44+
.execute(&conn)
45+
{
46+
Ok(_) => args.msg.react(args.cx, "✅")?,
47+
Err(_) => api::send_reply(&args, "A database error occurred when creating the tag.")?,
48+
}
49+
} else {
50+
api::send_reply(
51+
&args,
52+
"Please reach out to a Rust team/WG member to create a tag.",
53+
)?;
4554
}
4655

4756
Ok(())
@@ -88,12 +97,11 @@ pub fn get_all(args: Args) -> Result<()> {
8897
/// Print the help message
8998
pub fn help(args: Args) -> Result<()> {
9099
let help_string = "```
91-
?tag {key}
92-
?tags get {key}
93-
?tags get-all
94-
?tags create {key} value...
95-
?tags delete {key}
96-
?tags help
100+
?tags create {key} value... Create a tag. Limited to WG & Teams.
101+
?tags delete {key} Delete a tag. Limited to WG & Teams.
102+
?tags help This menu.
103+
?tags Get all the tags.
104+
?tag {key} Get a specific tag.
97105
```";
98106
api::send_reply(&args, &help_string)?;
99107
Ok(())

0 commit comments

Comments
 (0)