From 1c2554bfd38fc455be16116f6a8cf7700c8db62b Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Fri, 2 Aug 2019 15:34:25 +0100 Subject: [PATCH 1/7] Add BitBucketServerImport project filtering --- app/controllers/import/bitbucket_server_controller.rb | 2 +- app/views/import/bitbucket_server/status.html.haml | 4 ++++ lib/bitbucket_server/client.rb | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb index f71ea8642cd..f5ea33a8880 100644 --- a/app/controllers/import/bitbucket_server_controller.rb +++ b/app/controllers/import/bitbucket_server_controller.rb @@ -57,7 +57,7 @@ class Import::BitbucketServerController < Import::BaseController # rubocop: disable CodeReuse/ActiveRecord def status - @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page) + @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: params[:filter_bitbucket_projects]) @repos, @incompatible_repos = @collection.partition { |repo| repo.valid? } # Use the import URL to filter beyond what BaseService#find_already_added_projects diff --git a/app/views/import/bitbucket_server/status.html.haml b/app/views/import/bitbucket_server/status.html.haml index 40609fddbde..29cfa0d3f4c 100644 --- a/app/views/import/bitbucket_server/status.html.haml +++ b/app/views/import/bitbucket_server/status.html.haml @@ -20,6 +20,10 @@ .btn-group = link_to('Reconfigure', configure_import_bitbucket_server_path, class: 'btn btn-primary', method: :post) + .input-btn-group.float-right + = form_tag status_import_bitbucket_server_path, :method => 'get' do + = text_field_tag :filter_bitbucket_projects, params[:filter_bitbucket_projects], class: 'form-control', placeholder: _('Filter your projects by name'), size: 40 + .table-responsive.prepend-top-10 %table.table.import-jobs %colgroup.import-jobs-from-col diff --git a/lib/bitbucket_server/client.rb b/lib/bitbucket_server/client.rb index 6a608058813..d1661fe92ba 100644 --- a/lib/bitbucket_server/client.rb +++ b/lib/bitbucket_server/client.rb @@ -23,8 +23,9 @@ module BitbucketServer BitbucketServer::Representation::Repo.new(parsed_response) end - def repos(page_offset: 0, limit: nil) + def repos(page_offset: 0, limit: nil, filter: nil) path = "/repos" + path += "?q=name=#{filter}" if filter get_collection(path, :repo, page_offset: page_offset, limit: limit) end From 91353779bfab544f3439cfdff9c6d0db1357166f Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Fri, 2 Aug 2019 16:46:41 +0100 Subject: [PATCH 2/7] Add changelog entry --- .../import/bitbucket_server_controller.rb | 2 +- app/views/import/bitbucket_server/status.html.haml | 13 +++++++------ ...260-add-filtering-to-bitbucket-server-import.yml | 5 +++++ lib/bitbucket_server/client.rb | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb index f5ea33a8880..1956442b72b 100644 --- a/app/controllers/import/bitbucket_server_controller.rb +++ b/app/controllers/import/bitbucket_server_controller.rb @@ -57,7 +57,7 @@ class Import::BitbucketServerController < Import::BaseController # rubocop: disable CodeReuse/ActiveRecord def status - @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: params[:filter_bitbucket_projects]) + @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: params[:filter]) @repos, @incompatible_repos = @collection.partition { |repo| repo.valid? } # Use the import URL to filter beyond what BaseService#find_already_added_projects diff --git a/app/views/import/bitbucket_server/status.html.haml b/app/views/import/bitbucket_server/status.html.haml index 29cfa0d3f4c..1218462577a 100644 --- a/app/views/import/bitbucket_server/status.html.haml +++ b/app/views/import/bitbucket_server/status.html.haml @@ -17,12 +17,13 @@ = button_tag class: 'btn btn-import btn-success js-import-all' do = _('Import all projects') = icon('spinner spin', class: 'loading-icon') - .btn-group - = link_to('Reconfigure', configure_import_bitbucket_server_path, class: 'btn btn-primary', method: :post) - .input-btn-group.float-right - = form_tag status_import_bitbucket_server_path, :method => 'get' do - = text_field_tag :filter_bitbucket_projects, params[:filter_bitbucket_projects], class: 'form-control', placeholder: _('Filter your projects by name'), size: 40 +.btn-group + = link_to('Reconfigure', configure_import_bitbucket_server_path, class: 'btn btn-primary', method: :post) + +.input-btn-group.float-right + = form_tag status_import_bitbucket_server_path, :method => 'get' do + = text_field_tag :filter, params[:filter], class: 'form-control append-bottom-10', placeholder: _('Filter your projects by name'), size: 40, autoFocus: true .table-responsive.prepend-top-10 %table.table.import-jobs @@ -66,7 +67,7 @@ = text_field_tag :path, current_user.namespace_path, class: "input-group-text input-large form-control", tabindex: 1, disabled: true %span.input-group-prepend .input-group-text / - = text_field_tag :path, sanitize_project_name(repo.slug), class: "input-mini form-control", tabindex: 2, autofocus: true, required: true + = text_field_tag :path, sanitize_project_name(repo.slug), class: "input-mini form-control", tabindex: 2, required: true %td.import-actions.job-status = button_tag class: 'btn btn-import js-add-to-import' do Import diff --git a/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml b/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml new file mode 100644 index 00000000000..3bfbfd11249 --- /dev/null +++ b/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml @@ -0,0 +1,5 @@ +--- +title: Add BitBucket project import filtering +merge_request: 31420 +author: +type: added diff --git a/lib/bitbucket_server/client.rb b/lib/bitbucket_server/client.rb index d1661fe92ba..cf55c692271 100644 --- a/lib/bitbucket_server/client.rb +++ b/lib/bitbucket_server/client.rb @@ -25,7 +25,7 @@ module BitbucketServer def repos(page_offset: 0, limit: nil, filter: nil) path = "/repos" - path += "?q=name=#{filter}" if filter + path += "?name=#{filter}" if filter get_collection(path, :repo, page_offset: page_offset, limit: limit) end From 83cb24358eaf1361b7d7ac0500e35e1392917909 Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Fri, 2 Aug 2019 18:19:15 +0100 Subject: [PATCH 3/7] Add i18n strings --- locale/gitlab.pot | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b96ceb970ae..8aba22fff14 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -4936,6 +4936,9 @@ msgstr "" msgid "Filter results by project" msgstr "" +msgid "Filter your projects by name" +msgstr "" + msgid "Filter..." msgstr "" From 13adfb3e7a6458668fd27795dcf8e74004a5860c Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Fri, 2 Aug 2019 18:34:06 +0100 Subject: [PATCH 4/7] Add bitbucket_server/client_spec.rb spec --- spec/lib/bitbucket_server/client_spec.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/lib/bitbucket_server/client_spec.rb b/spec/lib/bitbucket_server/client_spec.rb index 988710b7c4d..aa0217856ee 100644 --- a/spec/lib/bitbucket_server/client_spec.rb +++ b/spec/lib/bitbucket_server/client_spec.rb @@ -58,6 +58,17 @@ describe BitbucketServer::Client do subject.repos(page_offset: 10, limit: 25) end + + context 'when filter param is passed' do + let(:filter) { 'test' } + let(:expected_path) { "#{path}?name=#{filter}" } + + it 'requests a collection with filter applied' do + expect(BitbucketServer::Paginator).to receive(:new).with(anything, expected_path, :repo, page_offset: 0, limit: nil) + + subject.repos(filter: filter) + end + end end describe '#create_branch' do From 4e64ca44774ff6d2e23dceabaf0f1117a7ff298f Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Tue, 6 Aug 2019 10:56:54 +0100 Subject: [PATCH 5/7] Add BitbucketServerController filtering spec --- ...60-add-filtering-to-bitbucket-server-import.yml | 2 +- .../import/bitbucket_server_controller_spec.rb | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml b/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml index 3bfbfd11249..c455b4cf642 100644 --- a/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml +++ b/changelogs/unreleased/georgekoltsov-51260-add-filtering-to-bitbucket-server-import.yml @@ -1,5 +1,5 @@ --- -title: Add BitBucket project import filtering +title: Add BitBucketServer project import filtering merge_request: 31420 author: type: added diff --git a/spec/controllers/import/bitbucket_server_controller_spec.rb b/spec/controllers/import/bitbucket_server_controller_spec.rb index b89d7317b9c..e1aeab46fca 100644 --- a/spec/controllers/import/bitbucket_server_controller_spec.rb +++ b/spec/controllers/import/bitbucket_server_controller_spec.rb @@ -134,6 +134,8 @@ describe Import::BitbucketServerController do describe 'GET status' do render_views + let(:repos) { instance_double(BitbucketServer::Collection) } + before do allow(controller).to receive(:bitbucket_client).and_return(client) @@ -145,7 +147,6 @@ describe Import::BitbucketServerController do it 'assigns repository categories' do created_project = create(:project, :import_finished, import_type: 'bitbucket_server', creator_id: user.id, import_source: @created_repo.browse_url) - repos = instance_double(BitbucketServer::Collection) expect(repos).to receive(:partition).and_return([[@repo, @created_repo], [@invalid_repo]]) expect(repos).to receive(:current_page).and_return(1) @@ -159,6 +160,17 @@ describe Import::BitbucketServerController do expect(assigns(:repos)).to eq([@repo]) expect(assigns(:incompatible_repos)).to eq([@invalid_repo]) end + + context 'when filtering' do + let(:filter) { 'test' } + + it 'passes filter param to bitbucket client' do + expect(repos).to receive(:partition).and_return([[@repo, @created_repo], [@invalid_repo]]) + expect(client).to receive(:repos).with(filter: filter, limit: 25, page_offset: 0).and_return(repos) + + get :status, params: { filter: filter }, as: :json + end + end end describe 'GET jobs' do From 94e1404c4b138ede19611a46a5736764a61cdab7 Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Tue, 6 Aug 2019 11:26:11 +0100 Subject: [PATCH 6/7] Update import/bitbucket_server.md docs --- doc/user/project/import/bitbucket_server.md | 6 ++++-- .../bitbucket_server_import_select_project.png | Bin 19427 -> 0 bytes ...ucket_server_import_select_project_v12_3.png | Bin 0 -> 47059 bytes 3 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 doc/user/project/import/img/bitbucket_server_import_select_project.png create mode 100644 doc/user/project/import/img/bitbucket_server_import_select_project_v12_3.png diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md index 4e1614d82a5..5f426ed7153 100644 --- a/doc/user/project/import/bitbucket_server.md +++ b/doc/user/project/import/bitbucket_server.md @@ -32,6 +32,8 @@ Import your projects from Bitbucket Server to GitLab with minimal effort. 1. Attachments in Markdown are currently not imported. 1. Task lists are not imported. 1. Emoji reactions are not imported +1. Project filtering does not support fuzzy search (only starts with or full + match strings are currently supported) ## How it works @@ -68,7 +70,7 @@ namespace that started the import process. ![Grant access](img/bitbucket_server_import_credentials.png) 1. Click on the projects that you'd like to import or **Import all projects**. - You can also select the namespace under which each project will be + You can also filter projects by name and select the namespace under which each project will be imported. - ![Import projects](img/bitbucket_server_import_select_project.png) + ![Import projects](img/bitbucket_server_import_select_project_v12_3.png) diff --git a/doc/user/project/import/img/bitbucket_server_import_select_project.png b/doc/user/project/import/img/bitbucket_server_import_select_project.png deleted file mode 100644 index e7fddef9955e38a72ebbc1604b870cc9c18d57d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19427 zcma&M1ymft(=Q5v1b255AcUYngS$f@XmAT|2@Z?9y9Esr++CJk+}(9?4=k|2;`{Qy z@4R>3JNMr2eto99tE;DK=GQ%4Q#I33>R;q>Fex#SkdSZ`6=XD!kWk=ANXU-pDE~O_ zLUxz`DpYGpRY@eI`UI>ev)BLH$gUdlQb;wE)W`oC7(W#BT#=Bli2jq2k+O2gk&s?J ztE*_qA`poE{e3Fi77h*$iVAJ`-2>9P9YxFOSh(|Y}>(yBUBEZ9TQz@wk_*-FV$;T;GO>Pk+B%}7Vu_o z*`HPf;#$3^uVb(izA;$8FjV(X$xeNf35RL<>htZAZ7z5Lju5kLxm_uzaqkQ-0&YDa zz}sW?4lPuHKm_6halZpYAWjhoHiJ5Sc6Lq<^X@s|PK&FSZHu{GOJP>a!*0j*_07xC z*y-_+S^Yq$T?+@7LBiaGO;qc{{q+w{jvvm>8u4IrP7WWZ7V{cN!OB!j6KMbLDJHHZ z+P_6wR<>hvETgd9tGI-yDe zbIDd`HUQfOW+Q5*g?-z-0veC{V>tz*${bp<<69R0-UGUZrW+&Y3tI;d;W;2Mm3_Cl znF#>2_h+D6+pmqXGVT8SuhZrpi++6l-<#@+3O_I3Jn%-FyG&~J zZwA4N`k|g+19sQKskyaH`rlA9_w?iKZAPBt@nY|>jq|o4ZTCsIR(8u!4QL?4Vs~kL zZ@#VO>;ZnVYE!BGmQlP)f-QfjI?dPCXL$H6quD9+rgjE2ksysgY!9@TtbvQeQWIOW zSXx6`sQO02r1=KMAsgGN&FSquQ7v>?b4BgrTzvd`W`Ru=0S@w?%ktGAGg~Lev-Dn@ z5vGQBh`USyHsEBAhK}~)<(|oBGm#(J7GAT~9q~d&p81*6tAD2{t9;9&!;cQ2d1lJw ze>BtDw7<#-P`0(id(DKJ$?WYFv`_eZ^#Uk=seZ~a;K?=I16>3lA<-i#%1CN?t^Qpx zQ83V>MZ4g6A`d3H`oZZv$9x8!!!LF>R|CZ-}m5BGxD;|IEl1{QdOm#LY1?gh7V$Mw0mG+2=KVju#cSHN^ z#_X~@W|B7d<_U!#wcOIWEYRI!BX<;KyU0AX+%`xH+0Q>rJIYtyOfvY9*1a&P5Zi3_ zxeFa{4m?!(ZTY^wDAlZH!rK@zzCLKx^SDt2vck3No!?u3c*_AL;zxXaTZpV1^w+ z40G4;X0C+~ahy)nrOE^axN7R}&8aiqQJxJkW7d`4K!%@lZqFQ=7qvPnZnR5jTCP`S zbty8~H=3M{PYtG%mnfUdo3AI<9cDh+j*LA|gA8&n3BKIQF+0965EkD>=YP@GXs-)9 zD~vO)Nmh#*XnJoM&vQ0D9~JG8 z>o?pS+gM*@Y~DwxcWWqUiu4+6a3wr00`!m)h@ zu2wqepDCTmSWa5m5{AmGES<%Qba3)sY(Kd8u&I;o>2=#3fL2Pi z9?yc&(rFedx(C%nJhZ-`_~xLKuA3lrp9_gs+v+>!CbrYPWM{Yrq`2nK7RyX8!^g6I zn}3<(UTdB2tU26=kkzx@dCTIZj@%e+jsUU*`%Ay;SN6%@I7t?gPvLMMe%EzvKlFPf zTzX^W$}~cSVIgh5O|)RPLg*qRJ$NSJ*VTIZIyCPQ`h7A0H~(v_36V2I5-ITABfwZ) z5U$e>sq{JD=P{eXLTYYWYpX4-vE)36x65@{ZU@)49m1UU^NLovd)}UtvHL%o!5zS(r{KxKg4Cj-Su(IS48u*Pl&10hr zEA5Xqz^jBV$>_5Hg(y<+lNlLa*}+ynT!giaRy|;>KW#-Y4}Y+X|J|Nn*Cotos%*(2 z-2mk+DIk&u5t!_m6>$Pd2M9Hcc6t3}3K+Mf&L}KdyOTk_O#~PipNFNyJhJq(3*_(n zkJ}1t)V57RS$RWWpzwKOg0D5Z5tg?8mfGhl3xb8Qh`Jx1gmDRxrd8w5T#!~SNv&Oy zFJQKb>P5?YXM}Fpf=$g5jCIw^9RJ)_tSUF=-tb(_D+>>c3Sq+O8X&47?blu(x2wO$ zhJrNU>b!B^88!x0Qgtc^b5XVUP9+%Dd) zE=>yS`tyw$X_=>VaqoG#cBU-}4GB!vY=(FGKsQmi74qu8GHw6*0ynpKknU2=lKwctZSjnbk|i`5idF`a#=q0enCK4aq-Qmdm(2Wx=zxwXvE6tTNcclE_VN*2BWwZ zuCQ4K05H5v(0hQo*DoP{KfH>K_eWlEZEMn0&QMhx(O{hzDxDaGjP1;2D0op#sEYDy z55B=|>SG`HOzMPXYjvS*S*0{Ob?d&lN8SFkXGv!BjQlFZg>HScOK8yk`MKG)(DkmR zyEGMG#=^p~o%}gBAJFXjd`Uf{tlO3Up&We*cDV-QtuLu>8`XR|XnjM%ZeF-`u1P?8_ z2y_n>FJ`B|kDky)3UD}=Z_TTP4*R8jg$&*d5jE`bH&Jyud8lkpE6C>#CKx*Ao!W@d zTvK-03^Pd|;I|yC*Sdf?S6I)F4_(>-u_-5d{FE$7R0k7tgwGXAH#JXuSz}lJ&oq1C z<2Px{xSH);w5;Q;o?pO>#`E`O)u$DU%8$^S-aO$qZ?2pL64^e)g1;PD3ywsdaEWJ? zw*St2j6($(Tzoow!N|B|U1h9&P=k#7UEy-p?V^nNzX*+~&-)IN1ghCyYC4$4nS5LV zpULaXi>zOE|K($VuhHz!l`P702Wdulu{Tr2oQl-W2W9K4MZzsb-{jZ|gP$}=5EP8Ebp9e$&want?(#AdFu37J!K zluFx7>YAqf!~W$(td>E%8LQGJ^(NTxvtRVMXzj7}wO`}Z7{kwPqvt1EI_JUt4x_2B zpefD7WH4ADV#Ryaxa*bf-qyY_sfCb^HKc$myeieY)rI56dw9G{s2Y4go%R^0t^@7{ zo{p|T23@?JI89PCTZY9GjIBPgK8v{4y%o+OIHj+tLbSB7;39 zIx1VD8VCilae_yJ6^(4o7wT4d&pNVKojN;@p`Mdno-bU%9Wj$9aM+gN!ONr|*z73} z_L%G1W}WmJ6^UCCUTF&ychinMEAOanVeWd0x0sPZgt6ZQVc)uV1g`C6%t zmsXzthu@cX>N@(IfCU$^8|n@wyol8q&q?M5%Z1E&2gW74IZexBh&s&2z@W|8ud+L9 zN>>l1HSae-K<&ZAy~GD|@?6Y3#RXnp5$(XQk=pJaL$!=UsE=D|2kz ze7@MOluc5KS58}c)nEGooB;YXL7*6HB4^l{XW*F~rVW8s@dmxC+->#q_T51^$ju%2@R*_ym`?y#TGU@xzJbrd%${hy?~Tqq+-gbb zg%(at^U0}7x{*83D5i#P&kc*xI|Cz5K=b;08Za-i9Ffm&!5Qgo5rZWQ#jb%t?))q%Iln7}5XLYf{G1J1il?s;h+-2At7XMN$!hVxSQThJGfQE;E z-2HNpyqRaPrgElyP{DRlWQ1MFaT#_maEmeKZN#+V^hZ*#mnweoYA~N>&QR)XW?NOl z!-x^yX5za<+gz&U`J+hmrKe8^MT+@T?VvaV^mDHl9ybkxJ;(Nx%RvLJQ~7n8BjP6R zmr?y`61HOl>&H+^5_jLaD1TlzRT7qx>{Lr1QXBqlo3BU%8Ai1{+%J%k?gnb#MXfupZv2!zVwj~A@}Ctu|M?oTXm=xB3&zg^&d&|Z{a5CZn> z(}X|hHDPqSO83;c4_8+|j=94el*B~a)Jce7c!>fQo1?auX<+nHL$+xvN)VF(lGo%1 zTbjQ_86^ypN46bUnvSv5o4a`jc{Ok^-`L>af1D0?^xBZSVT1Z~;y0iMezvPA#r98C z?%;za|8UW+H}bOG%&kXt9oD7}-*7|24i|5auikN7exd7HJKI5HKOT*qlk`3-#< z-&>Xtad`3|{E8(Zt{C82R+&2Z+^{CyWlX7vW~eJQnZz3>a>suVYP_FfF2tfier`?h zSR^~oTK7ZoK$MuejV1O&i2$rM++FA^b4`QwUHo?Ha zd%l=|GiZ(Rkp*WNJjSBOw&p4&GPO9Zo%I`#CwjyptgADtv@yI~$`J7l4iH2cAyT~W z(p;YLYxE(>Q_nj-UlfgW`8{~WwekHmQun*}o@B$K%wKZK9CbSo!Y1e7vzkWt&GbUR zIXdQ@;k|F`qTdB^+A={6LfY04-pg}O=bpnjML)cOL+tmMmFAW*2$*|LiRzHpdu&ip z8Kwf~Fm1R31Pin_*1{Y&8i@=Ej4~@?%r{(HO#$c|D2eH>(m2V+T9D{SZLQk1a;DIP zY44}0cY0h;I+%2Is46pK(<-#Ax?#c8hm8{1=UDOZI6eUIy(fiy{HaJF+Kn%~tHOV~ zykfVeaC||620a2(2oO2ilDrt;o>rlOTrN9?_)+rP6}jUFX6b?`T;XQF-Tyq+0WYjV z{rj%{8+wd9w6UzK8y^@aS^{MKeayFy11_cmsegYj(E({v+=0vR7Ue_uK956{RvI+^ z9PE{as<>Ktd6P#6%VjsBiXM->w;8ATxCtKP#C!T|m9JB&*6)y5TjfyjQYc?zuwqWf zM3b0WtX9_8nlKR?M(9SDc&hX5y_*@?mr8)1T#bi%WB}WFfx44d#p157K2ma7PPzu} zEZ6zUd&_&VS>tA|l45;qqQy#r6rZhXx}3Cz*4%JoowOl#%i^#0ocM+M524>Q|Cq%1 zHMEB&WQm#D)>vgST>6Uj`KN{lbS(Jw%=%%dEt9xz^)%;PHJ6{bN;wAGO&M&2q z3&#Fbo!H(nE6;WPR2W6B-IrLtQYTKN%3H+soj@v9uLnxe?Nf>`Pja2vKilOy%VIh! z#b$v^{iih@N0@k3S0)vx5+|aZDON}(@9W=~P{5R@mdYj^BQ?o&`Rh{u-FGc6Aw=eW95cfZh2Zd1ZAW z7ux*yOz@^R1mU9{esS}-S~PQ>k)D43)%R@cb;ff>KIa&|7(xRh!0mZVc>+rBdtnaK z9vsdKMUVjIpRZ=;;y7u6(^dNEl2zsj#y*%G0T?DCf#(GPq~CxeTBIY|4m6~Wh;!us zKa1YN9npixQ>gal+r{fe_}xAC$=VO)tH1-!);m4juALJK_YQVhCsQH+M7>lt=>GY5 zA9j54LFrF}0H$5Kc97Q{2M`Uyx*MaDtOK{cPFmrK!MazIS{G-Cmw+R&#hr`0{F!@h ze%-Puro@Cd^ZdN@05epLNw|alLdfOdbrYSuOswU%$xNUbCj~gJpg_f=Lj~nLA#5ZE z6F=P>_pEu}93sB1(79p2Vq`WDjb#VF@%hsC@3wCdjh-)W9rL`A0zSu1{kiFt?%&0Q z(7JK!@iG6R<RXHKKt z$42elMTJVDwcg^8#p($2x|XhUxyPY4DBOFqzpT9EtbOkGvA{kV?sqlu1e!YZ22H_A zhBKiAwA#{ap+f8-Ti$C$BwgUBFH|2jJl81ZLSBq8E&jN2fjfU~Lmcer@F*#2Ge<4Q z%b=^c)u*vl{C5+Ex^G3GJiQcMy-r`c91RWm65*)cbWl-?Rta`GJ7Kf$ujj)43Q>;( zi@3aJJr9%VUVP{ey{+zlnmycqhN>MjUWcU6f-(??cs%S=yVlU(Kcg-4hBTA}me zapi8J7omBp;YW1^WV*Nj2GvI;9_}%UEYaUTvl6`CxVFk0N~z;bNI%MGk?O+b81k+) zW!h5JHORACs|zC8nLH%LmV9DOGDLUR7$HxVq}<->p918$^dPxbW;4o$m*3(cjKRZE%pxnnC>l}KgK=wN*O3H z0LZ63^gH1F!A!Uzq_tVcfTSFyeexuB?cR+qaggrqtgz>|!3}l4JI~$|m1NxR!oVYy zAub!zq$C3dwADR>t0n{LrZq?(iR7;RjlP3l%*L*U}MYADCA;!$Sxb$R@>SSSYN_&u-*c^<(~(tIevfW^IylLhhmtQ!$)Ut z{PYTdtPxm06ZK&JprlX7A0e@$*;1pu%|x8pUgXKbcig2sUmN>^ z1ly4U1?Kw&KGgpD13kl+;f6FusNJbPhi=|wf9QYo7M})>^-w+DE`V#5Aw+x6yKMf4 zGekb(h`9hJbe^sov?sWiyT_!!L^2%pG8OV~T$s?W@_@|$t0L0<)w8imu-7(MRo`aF z^Ag|E%i%SkE{e?P2^!GwN=M&}P47p532t9i6|L*YmvLb`u z4^xqX3QFQn@%(#;65;=&K>bJj_i|MlJY*x%XPVCk}mb>$D#3)T|s3?d70Xz zP*z(layX8;>cJzoAC_^kELnqW4*9m;f>iF@Wior0$lf!NY5NB4R!D2#t!!7ou}bS# zpssN6@e62e+feL)I89ZZ^xT1@fJdkFGugK~fxeZIY96H+{LQ>+?VE1Hi7` z*j~RbsT|mt7bx5UQ?7$x&(7j+#;$B;yPyBcMVZla_i-hc&ch321dU1t-46LQ?yGfD zywCF7gq%xcm`Ze!Q*}P+c1qVICB&tW_+zkhLO*b-gHsCH-t!2rl(kGu&cM!87+wbv z{8C~ME3qTU60~{7ciDU;N`ou(ULYC1bteXh`n+8cE>)tW1u|sse>915saC$fFaPw} z%wx}rFVwhW5HIqFU&!*GFXTVwJ#_Zsgjmn;@$&dD34c1x6WvzEEl6E=sZytgHv;ry zV%$#9tU~s6elG9z*yOh5c{K(LE%SIeUwu9Sgb8_M<Ww8OKoPt47=#C6BQ>fnxN37lbxG0zn0y*%UyxL?+-ct z;y`!QG6pNVVO;|epQm&Hi5;Mb!{yeN5h3xvLtx?wz`)1f&F*i67C9d!AF-!6{(AD+ zS+s*9eloi82Bup8L#|M~v3%7Pzp-GH&x}_(^5R!|nFQmumW{DA2HL0WyR-+p2p>oo z=0ew;BmR)ZgX9Zg6!MJaWkQxq zzZF2&8O5u=2I7gxfq%z3wT6LjxA)fMf!=JXUnTp^;E zVPCWL){lSWiq|qju@UIocL6niz<58$-^Ep2uAKJU_ASjl?sRtj3>vQ_VQ zJ5U`}dO^#XnQo9Gl<*kt`tS9^j_Y^%)jdf_e5GN|MvckVM>boebKIB_R#>&Ny7Z;B!D- zJ^)4-$)S-u-&2A^EiH$=mMUt(Mru+jsz*lYhInFb84q3 zR!ObxCV_BTpo5zyABzg@(B8o(=3=6MH~Lnb%E`k(5^eoUbM(^aV6-cLBAj-9dWrLU znhX7b-#WGMJ}5lV|$j~-`{IryoMO438JmM3 zL8gFzi3@mAfyG|WANOiRhb=!AvFwrM7RI+?eqF)j^a%qhcb#`7oN3DqAsbv}Q#X`P zmMlT+S&e*sE|qg9bxRV2iwv%g`Ss0T)TW;^{7$`9?WcAwj5d110GyG=3^v5F0`HXE zwPpIaM*8JtiFvfq+sN^ydOjt~8Y;d@qG!ZT4#Vms_iAJ}(9r&W_5xsf$IPl`B(zBL z8v%_3z5h9N_$Yd4-${Lk1_p0$rgdoK zU-m=&Y%==ViI1SP!>KRlo?!QP0hS2P2=6J=b#Vv}Irf2QNRR3NL;$V-vBm*!LVAGK zT>lHgGXsuCjy>2Kt9E5W{u}GXuYhQOcb9`Y{y=Qs z7~-((Gr(UA#y(IApqUH!S$vb+CyN}P@KB^ys0|z*Dc(K$e7wT3f14p1b+C4&TA%z7 ztaiB;p$!BAi?JV0yudSQ&Vvyb!)FKX`qh?ZKvK`wOK#wF1x{a>g^YC4pQ)&8>ulTy zF+YX^`I@+-{k+f%Yd0fwBfL98F9PQBdjHs8hPbhWg_Xq}rp)ULHv-__Umm~nHf5s_ zVBMwnb>NfM-~ap$qBrkwdx*RKsJ>LvB;yprVWk=Na%K-f3Ow8E;!VS4k6o=QolZZTP+K=USjtJY^5t-6&sKFYf) zbVB|XQ!Yaxl(*{->bY6n3s*_y=|Bx$(%xOvUYIsWFEZU#5mkfy7t_)or86Jms;Meq zb;P5Z$IKea)k$IMO&Cm%t`1I~Yn1U*3WAoh1q;GXoo7INh~`c`*K88AT(w@iJ=?xY zI51F*&kZ<-nmn6=3>A_RG!JU7Ky$=}Xyf?5zITFa2=A`1F2hV?9(v4XAD zM?HKs@r^yvqAA4V?7rUR(0(11Q4<#HWHO};3Ed~1C3b;`*v+?8vJ*JJvwjnnM7-GB zEJy2tcTFM<1Abnai?!{*s2YGueA34bs*yx@p5_xyO@GX3XZplMVo6D5pqJl;O!R8u z6MU*JZ-O4Waf8947;VJrLrgsJwel=|&pK9){Jc5)EKH)G55KdjSx zS;d@jDV9#sq_6!fgQZt29}PBc=%irSC*enL*Fo?mfz1&|Q#5jC3SqU=tmjo;1oEXf z;;GA4jLvp-Vd{X6^51GRDC8N7=}MDM%9b^Fw?RHY57!q;eoe#@B#0u26&yCmQcU=L za-iG>djok?fE?#g7EnmW1?#;J+_aJEwQkVJ)Vh(iK!V4-!`h6IaEe~XCz`LJ5$>Hy zKHAeL!z0hi3k{{4M|Hg^M1MuHTWoKj#cbK(VZ~Rkm@e#ESq(^n-@d^nll5Vh2yqz<-XrflLV3KWGdb?X(;Wo~^mugd!lG2J$P z3rS!*Ezs{Fd?$=T`B+d=`eBFILl4^gLtCpw$oo~nub{MxL@Gg1e>DokZCYWMcTGDG zEjn8iFysq(IfDA1h1_31@ew2G9>5O~+yGBcu=pT#H?e$t>bo}GEnGa#kf!yL57u$j zuNXQ1=C)Zlpz%3(Z$I{;~O*C`;uT9XC(ZO9gyr03?8*6Wr);Jy&p_xR0}Q7t$~4Uj24 z^)U_8MKUdYP>bxCVI9*9&J4O*p@eQzs_cwcliR_5 zXO@9`H7)egFk!NyPeCF%tlVRp?+f;?2`gMChP;tf80qq18T(1yJl@{{CQ%#jc4MxZRrpQ7u29^+EM$C(@lrAkl^Mu0B4TduIPmfkhGfhf;(A<=R`=V` zefxg6t8n(s6kUvNgb;V4jxZVS6d>+IBZl=BnpSO4_hoB`BLQwvs9&B6Wr1!=`UQX_ z0LoVoIS9%I-(zXUY6Ka>#KT2zEA0AmcPPR5?wl7YEpP>~g=%NvhHff*^8JW|GZlDp zMa&9HY}m6j$MnS>Nr2;aari(~3JW_mbyXT)=`Lxj7*O^pcP~KEg`%s}UB0F5+5qS! z2$wp6EslPIKmM|4ZIg&enqX>=tDeNWcK#K`s1P}0%I(H}UaMn$^z7XF#LpO%sQ>zeEKC6dZu{dFfmT zdTdQ&F1)abp|BGnR@;@KXnt*(n{a%F%cxGP0ie=kNcs|1PiYuY+=s)!684j0*IdTk zkuCs}ikSpjRKV-INuaY~i>!Hp?fek}uV+mlfc9Ccoa`ZM_jy#x|Fb4zxBm6uR{OCu z@oNm`1xRUi6NRfpZ=&suDttr8^cfqrF} zp*y1YEvtMwA${Ia507kjIv2f|gS3ujKYmCCd#`1bR#5(6j#$Bx@Vwgd3c!8x6an%< zFAqDJAo4Sxk9{q;e_`+YfC^*eR6QR6UN8NRyrQZ@I@Z<(B-SuWTI4qoWN)=sHq>@F z|87rr=jVg@C-STi7Z$qm}CU9jh_jrpI5S@!_8?717$T-?0%TUyjL zJ|i{h^x);swVoTuj=xWXFj5;>EsZ$m_Z{lS38b7PvMyZcfUh?y)JIQ=SUAT4Q=ghE8{}bGcvNtZpFXdHfb-2(!D4c=U9V3_}>V7 z73XE0ROlc&D)hN?X{U}}k_&OzjlMa5*sJQz-YJRRBD$c2mkXaLrQ2^*0GIH3fP)%2 z{8xSu>9H>-iKw%?cSNKNMJ&IfzRhITCfobBPQUi}17`eN97`)ghl@JTg40Kia{JvR zXs@w1%#6=t=sGynsYz4UFF4HA_!%?O-*1i$l@^i+56?d=DlGpU=I~2__{cHcmqXa@ zck-j0YamPN%ai1*$C?QwXmho{jq+558j)!Avvct9u9jmJQPM~zo;b`%8&6aoli<+~W32(qyYop5m=P>qlFyn;M zXU3LVk-M{a#|o!2WfbpIb(A!!HDHGz-7QTsNwOaTrNUuE{L^1GAP=XC|A#mSc!!?Y zI4~h1J5jJ`3z~%Z`TNCX>5PIi^3K{bRm9?iwX?IV#O>Kx%a->yh{Z!`P*sXH_GpPs z!4qBW5GCps^s>*r3)-^x2G7NyR>nEkb!!F~BeJMjR$hQC2ZKu|0;2bZsovQVY8HDA9K$&)UuR zM#e5Q$kb9~x2aw|bc(GW##S;fB<~l5My6p)qxVG$3j)bap_InEpI`+YA+(XpWbesM z*c1y#IMYEJyy#QS@=FjOmaF^f>xv60mC+nfg)L?Z$n*w(W{}b4K>w;=RT`?$Pns2yY(si{y&@)aUC;33ilu&nM`c%lr+Ye+}G@pb*-r7{Rl!sb& zEY!S;D**f0sgq1C{_$4NA)xTFqJ2=3G_hv^N-nvm>79G&3$SZ8y$@r3h3c7eQR#>o ziy>caMKJI^)`Jp9Fj$JIB9RS8G zS+aL^b1n30(Zqcti5qlkI+5n2P8EMLV_fmqhHfH6QKg!Dc066?XYKKNm^M7+b`fB3 zNlWhBIi^;WA{r*X^8~ zOPF>?CU`_D2piS@%x_B&|M0s>6F?GWLcm5ExCh6f4zLLD~!Q+l)=O~tj z^`&YH{q9HGHGW4M;*Dy0?Vs~@2ducUZ%ZYUPWblWck|HK3Z!*2@J{=AIGBKXJSll z25G}FZaXzq0jJ;I05h)EPddgHJ9p8<2lnJoM=q%pkS43?5)k(85$SM-&e=h4y&=6_ zbJJmSw|@L~9XGA4n4s~TYDtkyc438_uuyC&-*;?Vd29NGNWZLDX;H$Q(p@?gsp`<1ELo`rMDlB2V9FUuadIcCsrGI# zJY5{q8U~=cwPG@zH+qD^GrK>=Y-2A(2Dk|XQ?Cii*V7Sn(ZK+m7}uLH=TEf zfa*pSw6_e0AoAr@sl60YYgWcZv4us(yIeU?{Z^AWG@vuygP#ijM`jC_dh#n;B61CC z@}k^uVo7%@?XqY6|6(x$%N^8?lNQ`c%}NPBY2G!1?X7i5AZPHD zpBpzAZQcaWt5%Lr&Nh)&e*jR6?3RJn7Q6}4hO?}LBc5J97yIEuli;;KRRa8(#6hT} zzP`t7;@(epmmwLG>M*ezMabiRS03E{9qE;^fZ?{EGN z+FA!q+cYIk=mNHOkZbNgkA8u27Y2$dG~&GB7ur;8<$!W7!J9nyCpA7wbZNYjjz+O~ z1!2g()R8f38<+LUXSk(@He(XvcqPP_Nfz^&)0?vvp>dfD=l-O(;QH*TvswAvL4B?; zd{j2r^t&>Gl=K6q`w{Hrwz@;@v!B`;9Qo|o3(<3uCmqE(H#Q8AzkC_;473pZ3oNaz zv?n0Y0cMJu_NgqTBJ$JvaZDE5Ft`rZK;No)CEakc`RtOgz*#9xd*x7G#v;BSkT z+}%7~T=^?b#B_Ky&DIyIpFVdx%WGAVzDW@g%iW~abLdwIDa<<4Vh~D zq_;kZeCwQu5$yV&55Bsko&$QzH{6;Q`BiLjW<`#4! zZ?^qY{kp(qlMDMpjUu_{fD23C2Sk3CYeLk?=)a#t5d2?0t~0-KX@-J0+*U^l12ukQ zm${dYtC&V%#hc3y(72sBd{_J=HacCC_HLOl_ow^G8ztYYnPP!&g;V85O;q4+C*j zuQ;|%K^=PK>0fhag1=1o7+ea0qy{t>UW=|bo$()|RLN8alNp(bA_sJpq84^y!a-+R@~83>H(+Zbv*>m%}rzHet!BkElKaS^90N&o!LTc1*1N4;6XS zF{dV}H%w20w+pXtd{$d}FRd)X7J^`hwrhii;uTf31*uk6D##+`9MBTme3iZadzz){ZGex~Qxq6?@?_o-z!?dn+L)6R`bDE;-kmEl68=1lOO!THj58v6z7KfEE zofGf)hqDyx$msuw;}2_NK3D7){i(K|5((JJYhxCjTJOY(u`=oxwP;uqP9gR=Mnjo3 zbb<1*<(-{G0TKaL-bN1e7mBXK&xLwJd2RCE)|pEK#&)H}f_r%caMzyaSeTMCdg6by z{X-S?56*us@elDosQ-hxP6YplxJ`}neBU;Y;rvju_Qxz#SUJrvbE zpNbH3lX7J<<6rKN%KWI)-gtu%aOeT_#A|x`cF51$h*OES-W33+vnqW`jIMm)&^ZuK zfRSkCgM$R=s9ifZP^P#bP@uXv0lZ;6KLdMMx0q*8{JRLoI-L%vKYG+6eq`!-R9l2w z52okO{f5F~NFpWeQ8$9=RFGb}PTSisc-jbm^sH5}eL@BFQ`S<-^CJ5XB7t$<1u&aM7&DVuvGg}n6@Ve1A8@- zlG(vJ-DK0=r@F(RMkA>{9hv1k+}QKIqUqp3c3q(qX^wKVbV9FjsJe)Noja>(#Rr#O z73t=|9UISb`9S%7{7{R}=qrhU>Xg0<;=U}hnIaJu6(0K&&g3c@JN}%$U}9RQ1m)0# zm5?n>w0OAcmV7K7pVo8axgc8rd-BJ*g>RoQ%T_Ivtq;as@y|c%@s$Yi5Si`fT{2-m%^(I|;=YCn;2K+HPjjw*UcMJ3vVt?8{9H+d~YBYY&wa%=wMa0p`s3Q@> z(&=fxvD)BXh;Wm1aS>yYz;wj^->nIF6uJ$Kr2R%!P!VN18 zXgYS=TjjT#NX1QNm}{nZYR7(1 zuL5@Lsi9~BHF%q3W_tBstANcvYg>i|{N956PkUDh&)Ou~rbq{-a3$s4D<8a~+V!7G zj*~NcM*HWsr3>*mTf%bT1M4NTj5JXBIzFknJ=oK`Z(?X+K88q3V+D~(JU#L(kLr~K zVs>%U>w4&=t*aOjOu4Rf!QQ-1|5qXR{?GKI#{oR*8$v`bSuQ0aER$PCinKyhVse>T zL|?Z_uCuu%;<%SfqostyT$cNF3iEBuwcKKuTW*^SADZdwdwx9Uhx0$YAMeNG`FcNI z@1UH-E6EP|eo``NRbdGGDf4>&&Zm4ADp|gNKw+Xc3*I5ryul?yH_Y;7yXLF5^O<5l zv_!|Pyo5(()GOL+I>tUdS)XVi=V8i+X>m+_W-MA^T~dC=)vb5h=o)~^5jdv93MXVWQ%#5LP3foQFT52;=D^;0hhjYkYZo3N(?;B*ossG-Fe5g_t zPx-PTLqb5o(o9eeci`3!n={nqjDD2de98q^vQ4T6suV=LlH0R_k=~Uq%DPC4866Gy zYSviW3=giDmT?w+QF7=IKm4D+0J?yJU)Qog5(il~Xmi;5X0>Utx7YWC*+zp$Id7c_ zAp(uZEF2y27E4z{$l@Jb-4B{!?~)Rn_3b$Ir|8fbq)2U#*)Ez~eJpd48YaJ18mKmT z|1@x@woU3(@5TxDqjwJ5#!icOari6Ioqy5%59W4!*8zL~(n?wZ6-w(o06N&FQPrJ}pE&tKlTaMJ@K7W{%yYwv#?7ARN;Bc875n$-iV9X<9e95M z@?_mP7G2coW)RoKVwYx`5-Vb3Wv&^@X6+lv)$iZ^8F z?`y*Zd{P!W#mxn7h(_}`<7>>lZQwVGRTCrxhzj;Ta0uRkaaHNnZi<$m*|<+VN=f{L zSKtppko3-3yJry5ZVGzzg^*k87+zR+l*45P0}~lV$~6&n*CVE+u;WF+KogW10B|Oq zM1&#arvdWh&>vmgU>)H0a2siB1x6HJt@69-vF0&`mQUqi{%Vni@I`VEcuwR* zn|dhIU;8ZZq~?luf%^I8tZczJi8u`92|^)%_H&=q?!ISPlC0eHG>$!V^i9^R48Qvy zd$)dQi-aR8WWPwbtgKLP%^wZ5dPkP;5q?Np z`}nQ5xzG?9uVFNT&sl>Tg&6Q`Ri_-f-yNuN_Q%7g(rtg%cdV}>%8#^DyvV!G3uVfi&Hj^xo$O5=*5}uQDz7KH9 zoLGd8AdvJV>|Lfj+3|7;fz_ng;CB)ha+P--nXPvO(B#r`!(bnLJo@js#JU@Ir(@Rh zqd|48&Hg+`889CnJm>v~aNNZk$Xsh%)9MB#FD0WuW1vH;to6a~N3!%pY|Hc4r}b&l z!(neG2QM3B!Xxn39+Cfg(4oFCT4PGrbs znhO=Wquj2QCG2f)8sO}BL5!xV%hngu4SQkGC!%}GyPh|%5(?hY! zzMC)=F_^)nG_ZD&P^rT?Lz_FBsk(w}>1-#p^KB2V)DYOXBE?@}G1&gi_-XpkOWAcH zgArjjo2{V~Ok$w;(20nw*Rz!prkb#ja%s+RJlFiOB``(p08lR0r>BBWWI?* zb2vYluk*wm-_=Ba)^V0ICv0tXn$%?32@vxg>N}IX{b*S9s#h?{x-dnPv#z}}nfyWu zW^)cmqpIwk@g-GWTb~f zV2Fr-am!!3D#S;c6DuQ8WM6V*6qWlp1Z0hFbr&*+3LV*Pa%g3Q$i=?sJpMq15;`PZ zxM*`%oj*x~~dsZRZBr zh3jp1)(6J{Og5+A&wDXOb|%wVv(~Coa6p((kB@aJhAooN9kq@g5RF3?`!fZY3Gax zWqfX*eE;M9OoBa@N%rmW9Gb$(T4!WVYNl8{W_hi7!9KV zI3z@0%kLo6`F4-i5JOn{oJFbB>j>iX-mc3Wtg=kn$H9A1393R~1%ol~TFO%WL!hOHMmXzpvr}LkGVX zCMR5A;2x9|IO-H^fNEqVbPDE+qm#$}pQ*2()v&NVC$@Au^DNip91Ca+fKZwL6r66E LSzRwTK}P=#2Mk$t diff --git a/doc/user/project/import/img/bitbucket_server_import_select_project_v12_3.png b/doc/user/project/import/img/bitbucket_server_import_select_project_v12_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1c344853cc812d93ab3ea7a21adf1573982fbc9c GIT binary patch literal 47059 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⪻H&$6C5 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 WthZ1G^L~s6yfjsHRS-&+A^!!cPSHC6 literal 0 HcmV?d00001 From 485b8b86edaeed1ba3a8bf55df23ca6cbc1f015b Mon Sep 17 00:00:00 2001 From: George Koltsov Date: Tue, 6 Aug 2019 17:18:53 +0100 Subject: [PATCH 7/7] Add filter param sanitization --- app/controllers/import/bitbucket_server_controller.rb | 8 +++++++- app/views/import/bitbucket_server/status.html.haml | 2 +- doc/user/project/import/bitbucket_server.md | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb index 1956442b72b..dc72a4e4fd9 100644 --- a/app/controllers/import/bitbucket_server_controller.rb +++ b/app/controllers/import/bitbucket_server_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Import::BitbucketServerController < Import::BaseController + include ActionView::Helpers::SanitizeHelper + before_action :verify_bitbucket_server_import_enabled before_action :bitbucket_auth, except: [:new, :configure] before_action :validate_import_params, only: [:create] @@ -57,7 +59,7 @@ class Import::BitbucketServerController < Import::BaseController # rubocop: disable CodeReuse/ActiveRecord def status - @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: params[:filter]) + @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: sanitized_filter_param) @repos, @incompatible_repos = @collection.partition { |repo| repo.valid? } # Use the import URL to filter beyond what BaseService#find_already_added_projects @@ -147,4 +149,8 @@ class Import::BitbucketServerController < Import::BaseController def limit_per_page BitbucketServer::Paginator::PAGE_LENGTH end + + def sanitized_filter_param + sanitize(params[:filter]) + end end diff --git a/app/views/import/bitbucket_server/status.html.haml b/app/views/import/bitbucket_server/status.html.haml index 1218462577a..aac09801d91 100644 --- a/app/views/import/bitbucket_server/status.html.haml +++ b/app/views/import/bitbucket_server/status.html.haml @@ -23,7 +23,7 @@ .input-btn-group.float-right = form_tag status_import_bitbucket_server_path, :method => 'get' do - = text_field_tag :filter, params[:filter], class: 'form-control append-bottom-10', placeholder: _('Filter your projects by name'), size: 40, autoFocus: true + = text_field_tag :filter, sanitize(params[:filter]), class: 'form-control append-bottom-10', placeholder: _('Filter your projects by name'), size: 40, autoFocus: true .table-responsive.prepend-top-10 %table.table.import-jobs diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md index 5f426ed7153..28e211ee2ba 100644 --- a/doc/user/project/import/bitbucket_server.md +++ b/doc/user/project/import/bitbucket_server.md @@ -32,8 +32,8 @@ Import your projects from Bitbucket Server to GitLab with minimal effort. 1. Attachments in Markdown are currently not imported. 1. Task lists are not imported. 1. Emoji reactions are not imported -1. Project filtering does not support fuzzy search (only starts with or full - match strings are currently supported) +1. Project filtering does not support fuzzy search (only `starts with` or `full + match strings` are currently supported) ## How it works