@@ -700,7 +700,7 @@ describe("configureWikiTools", () => {
700700 } ;
701701 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
702702
703- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki?wikiVersion=GBmain&pagePath=%2FDocs%2FIntro" ;
703+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki?wikiVersion=GBmain&pagePath=%2FDocs%2FIntro" ;
704704 const result = await handler ( { url } ) ;
705705
706706 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/Docs/Intro" , undefined , undefined , true ) ;
@@ -733,7 +733,7 @@ describe("configureWikiTools", () => {
733733 json : jest . fn ( ) . mockResolvedValue ( { content : "# Page Title\nBody" } ) ,
734734 } ) ;
735735
736- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/123/Page-Title" ;
736+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/123/Page-Title" ;
737737 const result = await handler ( { url } ) ;
738738
739739 // Current implementation may fallback to root path stream retrieval
@@ -766,7 +766,7 @@ describe("configureWikiTools", () => {
766766 } ;
767767 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
768768
769- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/999/Some-Page" ;
769+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/999/Some-Page" ;
770770 const result = await handler ( { url } ) ;
771771
772772 // Implementation currently falls back to root path if path not resolved prior to fallback
@@ -780,7 +780,7 @@ describe("configureWikiTools", () => {
780780 const call = ( server . tool as jest . Mock ) . mock . calls . find ( ( [ toolName ] ) => toolName === "wiki_get_page_content" ) ;
781781 if ( ! call ) throw new Error ( "wiki_get_page_content tool not registered" ) ;
782782 const [ , , , handler ] = call ;
783- const result = await handler ( { url : "https://dev.azure.com/org /project/_wiki/wikis/wiki1?pagePath=%2FHome" , wikiIdentifier : "wiki1" , project : "project" } ) ;
783+ const result = await handler ( { url : "https://dev.azure.com/testorg /project/_wiki/wikis/wiki1?pagePath=%2FHome" , wikiIdentifier : "wiki1" , project : "project" } ) ;
784784 expect ( result . isError ) . toBe ( true ) ;
785785 expect ( result . content [ 0 ] . text ) . toContain ( "Provide either 'url' OR 'wikiIdentifier'" ) ;
786786 } ) ;
@@ -817,6 +817,59 @@ describe("configureWikiTools", () => {
817817 expect ( result . content [ 0 ] . text ) . toContain ( "Error fetching wiki page content: Invalid URL format" ) ;
818818 } ) ;
819819
820+ it ( "should reject a URL pointing to a different organization (dev.azure.com)" , async ( ) => {
821+ configureWikiTools ( server , tokenProvider , connectionProvider , userAgentProvider ) ;
822+ const call = ( server . tool as jest . Mock ) . mock . calls . find ( ( [ toolName ] ) => toolName === "wiki_get_page_content" ) ;
823+ if ( ! call ) throw new Error ( "wiki_get_page_content tool not registered" ) ;
824+ const [ , , , handler ] = call ;
825+
826+ const url = "https://dev.azure.com/otherorg/project/_wiki/wikis/myWiki?pagePath=%2FHome" ;
827+ const result = await handler ( { url } ) ;
828+
829+ expect ( result . isError ) . toBe ( true ) ;
830+ expect ( result . content [ 0 ] . text ) . toContain ( "does not match the configured organization 'testorg'" ) ;
831+ expect ( result . content [ 0 ] . text ) . toContain ( "Cross-organization requests are not allowed" ) ;
832+ expect ( mockWikiApi . getPageText ) . not . toHaveBeenCalled ( ) ;
833+ } ) ;
834+
835+ it ( "should reject a legacy visualstudio.com URL pointing to a different organization" , async ( ) => {
836+ configureWikiTools ( server , tokenProvider , connectionProvider , userAgentProvider ) ;
837+ const call = ( server . tool as jest . Mock ) . mock . calls . find ( ( [ toolName ] ) => toolName === "wiki_get_page_content" ) ;
838+ if ( ! call ) throw new Error ( "wiki_get_page_content tool not registered" ) ;
839+ const [ , , , handler ] = call ;
840+
841+ const url = "https://otherorg.visualstudio.com/project/_wiki/wikis/myWiki?pagePath=%2FHome" ;
842+ const result = await handler ( { url } ) ;
843+
844+ expect ( result . isError ) . toBe ( true ) ;
845+ expect ( result . content [ 0 ] . text ) . toContain ( "organization 'otherorg'" ) ;
846+ expect ( mockWikiApi . getPageText ) . not . toHaveBeenCalled ( ) ;
847+ } ) ;
848+
849+ it ( "should allow a URL that matches the configured organization regardless of casing" , async ( ) => {
850+ configureWikiTools ( server , tokenProvider , connectionProvider , userAgentProvider ) ;
851+ const call = ( server . tool as jest . Mock ) . mock . calls . find ( ( [ toolName ] ) => toolName === "wiki_get_page_content" ) ;
852+ if ( ! call ) throw new Error ( "wiki_get_page_content tool not registered" ) ;
853+ const [ , , , handler ] = call ;
854+
855+ const mockStream = {
856+ setEncoding : jest . fn ( ) ,
857+ on : function ( event : string , cb : ( chunk ?: unknown ) => void ) {
858+ if ( event === "data" ) setImmediate ( ( ) => cb ( "same org content" ) ) ;
859+ if ( event === "end" ) setImmediate ( ( ) => cb ( ) ) ;
860+ return this ;
861+ } ,
862+ } ;
863+ mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
864+
865+ const url = "https://dev.azure.com/TestOrg/project/_wiki/wikis/myWiki?pagePath=%2FHome" ;
866+ const result = await handler ( { url } ) ;
867+
868+ expect ( result . isError ) . toBeUndefined ( ) ;
869+ expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/Home" , undefined , undefined , true ) ;
870+ expect ( result . content [ 0 ] . text ) . toContain ( "same org content" ) ;
871+ } ) ;
872+
820873 it ( "should handle URL with pageId that returns 404" , async ( ) => {
821874 configureWikiTools ( server , tokenProvider , connectionProvider , userAgentProvider ) ;
822875 const call = ( server . tool as jest . Mock ) . mock . calls . find ( ( [ toolName ] ) => toolName === "wiki_get_page_content" ) ;
@@ -832,7 +885,7 @@ describe("configureWikiTools", () => {
832885 status : 404 ,
833886 } ) ;
834887
835- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/999/NonExistent-Page" ;
888+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/999/NonExistent-Page" ;
836889 const result = await handler ( { url } ) ;
837890
838891 expect ( result . isError ) . toBe ( true ) ;
@@ -868,7 +921,7 @@ describe("configureWikiTools", () => {
868921 } ;
869922 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
870923
871- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/not-a-number/Some-Page" ;
924+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/not-a-number/Some-Page" ;
872925 const result = await handler ( { url } ) ;
873926
874927 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/" , undefined , undefined , true ) ;
@@ -898,7 +951,7 @@ describe("configureWikiTools", () => {
898951 } ;
899952 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
900953
901- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/123/Page-Title" ;
954+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/123/Page-Title" ;
902955 const result = await handler ( { url } ) ;
903956
904957 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/" , undefined , undefined , true ) ;
@@ -921,7 +974,7 @@ describe("configureWikiTools", () => {
921974 } ;
922975 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
923976
924- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki?pagePath=Home" ;
977+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki?pagePath=Home" ;
925978 const result = await handler ( { url } ) ;
926979
927980 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/Home" , undefined , undefined , true ) ;
@@ -944,7 +997,7 @@ describe("configureWikiTools", () => {
944997 } ;
945998 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
946999
947- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki" ;
1000+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki" ;
9481001 const result = await handler ( { url } ) ;
9491002
9501003 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/" , undefined , undefined , true ) ;
@@ -1035,7 +1088,7 @@ describe("configureWikiTools", () => {
10351088 } ;
10361089 mockWikiApi . getPageText . mockResolvedValue ( mockStream as unknown ) ;
10371090
1038- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/123/Page-Title" ;
1091+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/123/Page-Title" ;
10391092 const result = await handler ( { url } ) ;
10401093
10411094 expect ( mockWikiApi . getPageText ) . toHaveBeenCalledWith ( "project" , "myWiki" , "/" , undefined , undefined , true ) ;
@@ -1771,7 +1824,7 @@ describe("configureWikiTools", () => {
17711824 json : jest . fn ( ) . mockResolvedValue ( { content : pageContent } ) ,
17721825 } ) ;
17731826
1774- const url = "https://dev.azure.com/org /project/_wiki/wikis/myWiki/123/Page-Title" ;
1827+ const url = "https://dev.azure.com/testorg /project/_wiki/wikis/myWiki/123/Page-Title" ;
17751828 const result = await handler ( { url } ) ;
17761829
17771830 const responseText = result . content [ 0 ] . text ;
0 commit comments