Browse Source

Fixed SD2-1340 - Can specify invalid namespace in Add Web Reference dialog.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3513 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 17 years ago
parent
commit
bb010887f8
  1. 52
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AddWebReferenceDialog.cs
  2. 68
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs
  3. 2
      src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
  4. 48
      src/Main/Base/Test/WebReferences/ValidReferenceNameTests.cs
  5. 70
      src/Main/Base/Test/WebReferences/ValidWebReferenceNamespaceTests.cs

52
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AddWebReferenceDialog.cs

@ -473,54 +473,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -473,54 +473,6 @@ namespace ICSharpCode.SharpDevelop.Gui
}
return String.Empty;
}
bool IsValidNamespace {
get {
bool valid = false;
if (namespaceTextBox.Text.Length > 0) {
// Can only begin with a letter or '_'
char ch = namespaceTextBox.Text[0];
if (Char.IsLetter(ch) || (ch == '_')) {
valid = true;
for (int i = 1; i < namespaceTextBox.Text.Length; ++i) {
ch = namespaceTextBox.Text[i];
// Can only contain letters, digits or '_'
if (!Char.IsLetterOrDigit(ch) && (ch != '.') && (ch != '_')) {
valid = false;
break;
}
}
}
}
return valid;
}
}
bool IsValidReferenceName {
get {
if (referenceNameTextBox.Text.Length > 0) {
if (referenceNameTextBox.Text.IndexOf('\\') == -1) {
if (!ContainsInvalidDirectoryChar(referenceNameTextBox.Text)) {
return true;
}
}
}
return false;
}
}
bool ContainsInvalidDirectoryChar(string item)
{
foreach (char ch in Path.GetInvalidPathChars()) {
if (item.IndexOf(ch) >= 0) {
return true;
}
}
return false;
}
/// <summary>
/// Starts the search for web services at the specified url.
@ -666,12 +618,12 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -666,12 +618,12 @@ namespace ICSharpCode.SharpDevelop.Gui
void AddButtonClick(object sender,EventArgs e)
{
try {
if (!IsValidReferenceName) {
if (!WebReference.IsValidReferenceName(referenceNameTextBox.Text)) {
MessageService.ShowError(StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.AddWebReferenceDialog.InvalidReferenceNameError}"));
return;
}
if (!IsValidNamespace) {
if (!WebReference.IsValidNamespace(namespaceTextBox.Text)) {
MessageService.ShowError(StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.AddWebReferenceDialog.InvalidNamespaceError}"));
return;
}

68
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs

@ -43,6 +43,36 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -43,6 +43,36 @@ namespace ICSharpCode.SharpDevelop.Gui
GetRelativePath();
}
/// <summary>
/// Checks that the string is valid to use for a web reference namespace.
/// </summary>
public static bool IsValidNamespace(string ns)
{
if (ns.Length > 0) {
try {
CodeNamespace codeNamespace = new CodeNamespace(ns);
CodeGenerator.ValidateIdentifiers(codeNamespace);
return true;
} catch (ArgumentException) { }
}
return false;
}
/// <summary>
/// Checks that the string is valid to use for a web reference name.
/// </summary>
public static bool IsValidReferenceName(string name)
{
if (name.Length > 0) {
if (name.IndexOf('\\') == -1) {
if (!ContainsInvalidDirectoryChar(name)) {
return true;
}
}
}
return false;
}
public static bool ProjectContainsWebReferencesFolder(IProject project)
{
return GetWebReferencesProjectItem(project) != null;
@ -124,9 +154,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -124,9 +154,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
public WebReferencesProjectItem WebReferencesProjectItem {
get {
return GetWebReferencesProjectItem(Items);
}
get { return GetWebReferencesProjectItem(Items); }
}
public WebReferenceUrl WebReferenceUrl {
@ -143,18 +171,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -143,18 +171,14 @@ namespace ICSharpCode.SharpDevelop.Gui
/// this web reference.
/// </summary>
public string WebReferencesDirectory {
get {
return webReferencesDirectory;
}
get { return webReferencesDirectory; }
}
/// <summary>
/// Gets the directory where the web reference files will be saved.
/// </summary>
public string Directory {
get {
return Path.Combine(project.Directory, relativePath);
}
get { return Path.Combine(project.Directory, relativePath); }
}
/// <summary>
@ -165,9 +189,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -165,9 +189,7 @@ namespace ICSharpCode.SharpDevelop.Gui
/// web reference files are saved.
/// </remarks>
public string Name {
get {
return name;
}
get { return name; }
set {
name = value;
OnNameChanged();
@ -175,12 +197,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -175,12 +197,8 @@ namespace ICSharpCode.SharpDevelop.Gui
}
public string ProxyNamespace {
get {
return proxyNamespace;
}
set {
proxyNamespace = value;
}
get { return proxyNamespace; }
set { proxyNamespace = value; }
}
public List<ProjectItem> Items {
@ -193,9 +211,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -193,9 +211,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
public string WebProxyFileName {
get {
return GetFullProxyFileName();
}
get { return GetFullProxyFileName(); }
}
/// <summary>
@ -447,5 +463,15 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -447,5 +463,15 @@ namespace ICSharpCode.SharpDevelop.Gui
}
return false;
}
static bool ContainsInvalidDirectoryChar(string item)
{
foreach (char ch in Path.GetInvalidPathChars()) {
if (item.IndexOf(ch) >= 0) {
return true;
}
}
return false;
}
}
}

2
src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj

@ -80,6 +80,8 @@ @@ -80,6 +80,8 @@
<Compile Include="Utils\MockProject.cs" />
<Compile Include="Utils\MockProperty.cs" />
<Compile Include="VBExpressionFinderTests.cs" />
<Compile Include="WebReferences\ValidReferenceNameTests.cs" />
<Compile Include="WebReferences\ValidWebReferenceNamespaceTests.cs" />
<Compile Include="WebReferences\WebReferenceProjectItemsTest.cs" />
<Compile Include="WebReferences\ProjectHasExistingWebRefFolderTest.cs" />
<Compile Include="WebReferences\VBNetWebReferenceTest.cs" />

48
src/Main/Base/Test/WebReferences/ValidReferenceNameTests.cs

@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using NUnit.Framework;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Tests.WebReferences
{
/// <summary>
/// Tests the WebReference.IsValidReferenceName method.
/// </summary>
[TestFixture]
public class ValidReferenceNameTests
{
[Test]
public void EmptyStringIsNotAValidReferenceName()
{
Assert.IsFalse(WebReference.IsValidReferenceName(String.Empty));
}
[Test]
public void ReferenceNameCannotContainABackslash()
{
Assert.IsFalse(WebReference.IsValidReferenceName("ab\\c"));
}
[Test]
public void ValidReferenceName()
{
Assert.IsTrue(WebReference.IsValidReferenceName("a"));
}
[Test]
public void NoInvalidDirectoryPathCharacters()
{
char[] ch = Path.GetInvalidPathChars();
string name = new string(ch);
Assert.IsFalse(WebReference.IsValidReferenceName(name));
}
}
}

70
src/Main/Base/Test/WebReferences/ValidWebReferenceNamespaceTests.cs

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using NUnit.Framework;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Tests.WebReferences
{
/// <summary>
/// When the user types in a namespace for the web service the WebReference.IsValidNamespace is called.
/// This test fixture tests that method.
/// </summary>
[TestFixture]
public class ValidWebReferenceNamespaceTests
{
[Test]
public void ValidWebReferenceName()
{
Assert.IsTrue(WebReference.IsValidNamespace("a"));
}
[Test]
public void EmptyStringIsNotValid()
{
Assert.IsFalse(WebReference.IsValidNamespace(String.Empty));
}
[Test]
public void FirstCharacterCannotBeANumber()
{
Assert.IsFalse(WebReference.IsValidNamespace("8abc"));
}
[Test]
public void SecondCharacterCanBeANumber()
{
Assert.IsTrue(WebReference.IsValidNamespace("a8"));
}
[Test]
public void SecondCharacterCanBeAnUnderscore()
{
Assert.IsTrue(WebReference.IsValidNamespace("a_"));
}
[Test]
public void SecondCharacterCanBeADot()
{
Assert.IsTrue(WebReference.IsValidNamespace("a.b"));
}
[Test]
public void FirstCharacterCanBeAnUnderscore()
{
Assert.IsTrue(WebReference.IsValidNamespace("_aa"));
}
[Test]
public void InvalidReferenceName()
{
Assert.IsFalse(WebReference.IsValidNamespace("Test.10.4.4.4"));
}
}
}
Loading…
Cancel
Save