public static Boolean IsSetVariableAllowed(this TaskRestrictions restrictions, String variable) { ArgUtil.NotNull(variable, nameof(variable)); var allowedList = restrictions.SettableVariables?.Allowed; if (allowedList == null) { return(true); } var opts = new Options() { IgnoreCase = true }; foreach (String pattern in allowedList) { if (Minimatcher.Check(variable, pattern, opts)) { return(true); } } return(false); }
public void ExactMatchAllowed() { using (TestHostContext hc = CreateTestContext()) { var restrictions = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; restrictions.SettableVariables.Allowed.Add("myVar"); restrictions.SettableVariables.Allowed.Add("otherVar"); _ec.Object.Restrictions.Add(restrictions); TaskSetVariableCommand setVariable; Command command; var value = "myValue"; foreach (String variable in new String[] { "myVar", "myvar", "MYVAR", "otherVAR" }) { command = SetVariableCommand(variable, value); setVariable = new TaskSetVariableCommand(); setVariable.Execute(_ec.Object, command); Assert.Equal(value, _variables.Get(variable)); Assert.Equal(0, _warnings.Count); } var badVar = "badVar"; command = SetVariableCommand(badVar, value); setVariable = new TaskSetVariableCommand(); setVariable.Execute(_ec.Object, command); Assert.Equal(null, _variables.Get(badVar)); Assert.Equal(1, _warnings.Count); Assert.Contains("SetVariableNotAllowed", _warnings[0]); } }
public void PrependPathAllowed() { using (TestHostContext hc = CreateTestContext()) { // everything allowed TaskPrepandPathCommand prependPath = new TaskPrepandPathCommand(); Command command = PrependPathCommand("path1"); prependPath.Execute(_ec.Object, command); Assert.True(_ec.Object.PrependPath.Contains("path1")); Assert.Equal(0, _warnings.Count); // disallow path var restrictions = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; _ec.Object.Restrictions.Add(restrictions); prependPath = new TaskPrepandPathCommand(); command = PrependPathCommand("path2"); prependPath.Execute(_ec.Object, command); Assert.False(_ec.Object.PrependPath.Contains("path2")); Assert.Equal(1, _warnings.Count); // allow path restrictions.SettableVariables.Allowed.Add("path"); prependPath = new TaskPrepandPathCommand(); command = PrependPathCommand("path3"); prependPath.Execute(_ec.Object, command); Assert.True(_ec.Object.PrependPath.Contains("path3")); } }
public void MultipleRestrictionsNothingAllowed() { using (TestHostContext hc = CreateTestContext()) { var restrictions1 = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; restrictions1.SettableVariables.Allowed.Add("myVar"); restrictions1.SettableVariables.Allowed.Add("otherVar"); _ec.Object.Restrictions.Add(restrictions1); var restrictions2 = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; _ec.Object.Restrictions.Add(restrictions2); TaskSetVariableCommand setVariable; Command command; var value = "myValue"; // nothing is settable based on the second, empty allowed list int lastCount = _warnings.Count; foreach (String variable in new String[] { "myVar", "otherVar", "neither" }) { command = SetVariableCommand(variable, value); setVariable = new TaskSetVariableCommand(); setVariable.Execute(_ec.Object, command); Assert.Equal(null, _variables.Get(variable)); Assert.Equal(lastCount + 1, _warnings.Count); Assert.Contains("SetVariableNotAllowed", _warnings.Last()); lastCount = _warnings.Count; } } }
public void MultipleRestrictionsMostRestrictive() { using (TestHostContext hc = CreateTestContext()) { // multiple sets of restrictions, such as from task.json and the pipeline yaml var restrictions1 = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; restrictions1.SettableVariables.Allowed.Add("my*"); restrictions1.SettableVariables.Allowed.Add("otherVar"); _ec.Object.Restrictions.Add(restrictions1); var restrictions2 = new TaskRestrictions() { SettableVariables = new TaskVariableRestrictions() }; restrictions2.SettableVariables.Allowed.Add("myVar"); restrictions2.SettableVariables.Allowed.Add("myThing"); restrictions2.SettableVariables.Allowed.Add("extra"); _ec.Object.Restrictions.Add(restrictions2); TaskSetVariableCommand setVariable; Command command; var value = "myValue"; // settable is both allowed lists foreach (String variable in new String[] { "myVar", "myThing" }) { command = SetVariableCommand(variable, value); setVariable = new TaskSetVariableCommand(); setVariable.Execute(_ec.Object, command); Assert.Equal(value, _variables.Get(variable)); Assert.Equal(0, _warnings.Count); } // settable in only one int lastCount = _warnings.Count; foreach (String variable in new String[] { "myStuff", "otherVar", "extra", "neither" }) { command = SetVariableCommand(variable, value); setVariable = new TaskSetVariableCommand(); setVariable.Execute(_ec.Object, command); Assert.Equal(null, _variables.Get(variable)); Assert.Equal(lastCount + 1, _warnings.Count); Assert.Contains("SetVariableNotAllowed", _warnings.Last()); lastCount = _warnings.Count; } } }
public static Boolean IsCommandAllowed(this TaskRestrictions restrictions, IWorkerCommand command) { ArgUtil.NotNull(command, nameof(command)); if (restrictions.Commands?.Mode == TaskCommandMode.Restricted) { foreach (var attr in command.GetType().GetCustomAttributes(typeof(CommandRestrictionAttribute), false)) { var cra = attr as CommandRestrictionAttribute; if (cra.AllowedInRestrictedMode) { return(true); } } return(false); } else { return(true); } }