use nu_protocol::ast::ExternalArgument;
use super::{
CommandEffects, ExternEffect,
predicates::{always, has_flag},
};
use crate::{context::LintContext, effect::CommonEffect};
fn curl_modifies_fs(context: &LintContext, args: &[ExternalArgument]) -> bool {
has_flag(args, context, &["-o", "--output", "-O", "--remote-name"])
}
fn curl_has_streaming(context: &LintContext, args: &[ExternalArgument]) -> bool {
has_flag(
args,
context,
&["-o", "--output", "-O", "--remote-name", "--progress-bar"],
)
}
fn rsync_is_dangerous(context: &LintContext, args: &[ExternalArgument]) -> bool {
has_flag(
args,
context,
&[
"--delete",
"--delete-before",
"--delete-after",
"--delete-during",
],
)
}
pub const COMMANDS: &[CommandEffects] = &[
(
"curl",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, curl_modifies_fs),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, curl_has_streaming),
],
),
(
"wget",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"rsync",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
rsync_is_dangerous,
),
],
),
(
"scp",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"sftp",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"ssh",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"ftp",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"ping",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"traceroute",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"mtr",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"dig",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
],
),
(
"nslookup",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
],
),
(
"host",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"ip",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
],
),
(
"ifconfig",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"netstat",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"ss",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"lsof",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"nc",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"netcat",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"ncat",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"socat",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"iptables",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"nft",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"ufw",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"firewall-cmd",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
];