Skip to content

Fix up some of the logic around repo and submodule URLs #3859

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 310 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
310 commits
Select commit Hold shift + click to select a range
41a46f4
Merge branch 'master' into rel
ericholscher Sep 30, 2015
35b034c
Merge branch 'master' into rel
agjohnson Oct 6, 2015
3cce57c
Merge branch 'master' into rel
agjohnson Oct 6, 2015
c5314f4
Merge branch 'master' into rel
agjohnson Oct 6, 2015
ad78da6
Merge branch 'master' into rel
agjohnson Oct 6, 2015
6e67977
Merge branch 'master' into rel
agjohnson Oct 6, 2015
40204b3
Merge branch 'master' into rel
agjohnson Oct 6, 2015
e9f321b
Merge branch 'master' into rel
agjohnson Oct 6, 2015
e4052d2
Merge branch 'master' into rel
agjohnson Oct 6, 2015
1ade14e
Merge branch 'master' into rel
ericholscher Oct 9, 2015
9d5a003
Merge branch 'master' into rel
ericholscher Oct 12, 2015
960083e
Merge branch 'master' into rel
ericholscher Oct 16, 2015
36f534f
Merge branch 'master' into rel
ericholscher Oct 16, 2015
f42270b
Merge branch 'master' into rel
agjohnson Oct 22, 2015
3f78014
Merge branch 'master' into rel
ericholscher Oct 28, 2015
de44a84
Merge branch 'master' into rel
ericholscher Oct 28, 2015
5cd94f4
Merge branch 'master' into rel
ericholscher Oct 28, 2015
4ae0a02
Merge branch 'master' into rel
ericholscher Oct 28, 2015
04fec5e
Merge branch 'master' into rel
agjohnson Oct 30, 2015
053206f
Merge branch 'master' into rel
agjohnson Nov 4, 2015
23db99e
Merge branch 'spam' into rel
agjohnson Nov 23, 2015
d0ffe72
Merge branch 'master' into rel
agjohnson Nov 23, 2015
eb3335f
Merge branch 'hotfix-import' into rel
agjohnson Nov 29, 2015
6ea41ad
Merge branch 'hotfix-import' into rel
agjohnson Nov 29, 2015
6a18ae3
Merge branch 'hotfix-frontpage-list' into rel
agjohnson Nov 29, 2015
3cb114b
Merge branch 'hotfix-frontpage-list' into rel
agjohnson Nov 29, 2015
0dc0ea4
Merge branch 'hotfix-remote-sync' into rel
agjohnson Nov 29, 2015
56baae7
Merge branch 'master' into rel
ericholscher Dec 29, 2015
0e87136
Merge branch 'master' into rel
ericholscher Dec 31, 2015
d61d606
Merge branch 'master' into rel
ericholscher Dec 31, 2015
1738226
Merge branch 'master' into rel
ericholscher Dec 31, 2015
ce54d40
Merge branch 'master' into rel
ericholscher Dec 31, 2015
79a2077
Merge branch 'master' into rel
ericholscher Dec 31, 2015
3b62448
Merge branch 'master' into rel
ericholscher Dec 31, 2015
4c5a150
Merge branch 'master' into rel
ericholscher Jan 4, 2016
734cf63
Merge branch 'master' into rel
ericholscher Jan 4, 2016
36305f0
Merge branch 'master' into rel
ericholscher Jan 5, 2016
702aad1
Merge branch 'master' into rel
agjohnson Jan 6, 2016
6ba10b0
Merge branch 'master' into rel
ericholscher Jan 11, 2016
432ee3b
Merge branch 'master' into rel
ericholscher Jan 15, 2016
0baa14b
Merge branch 'master' into rel
ericholscher Jan 15, 2016
eee7976
Merge branch 'master' into rel
ericholscher Jan 15, 2016
7648a8a
Merge branch 'master' into rel
ericholscher Jan 15, 2016
ef73e24
Merge branch 'master' into rel
ericholscher Jan 19, 2016
5e23b95
Merge branch 'master' into rel
ericholscher Jan 22, 2016
89867e2
Merge branch 'master' into rel
ericholscher Jan 22, 2016
1464d3d
Merge branch 'master' into rel
ericholscher Jan 27, 2016
48bf368
Merge branch 'master' into rel
ericholscher Jan 28, 2016
d924b7c
Merge branch 'master' into rel
ericholscher Jan 28, 2016
91bf970
Merge branch 'master' into rel
agjohnson Jan 29, 2016
da89e0b
Merge branch 'master' into rel
ericholscher Feb 3, 2016
5bf6136
Merge branch 'master' into rel
ericholscher Feb 26, 2016
156edb7
Merge branch 'master' into rel
agjohnson Feb 28, 2016
c51ed30
Merge branch 'master' into rel
agjohnson Feb 28, 2016
9a746be
Fix several issues with search linking
agjohnson Feb 28, 2016
f5efa17
Merge branch 'hotfix-search-linking' into rel
agjohnson Feb 28, 2016
f6c1a45
Merge branch 'master' into rel
agjohnson Mar 8, 2016
5ee77d9
Merge branch 'master' into rel
ericholscher Mar 10, 2016
e28d30a
Merge branch 'master' into rel
ericholscher Mar 10, 2016
4761a51
Merge branch 'master' into rel
ericholscher Mar 10, 2016
897b876
Fix merge fail
ericholscher Mar 10, 2016
7c11a06
Merge branch 'master' into rel
ericholscher Mar 10, 2016
ffde17e
Merge branch 'master' into rel
ericholscher Mar 10, 2016
8db66be
Merge branch 'master' into rel
ericholscher Mar 11, 2016
7855158
Merge branch 'master' into rel
ericholscher Apr 1, 2016
aa75ba6
Merge branch 'master' into rel
ericholscher Apr 1, 2016
76962eb
Merge branch 'master' into rel
ericholscher Apr 1, 2016
e6679fa
Merge branch 'master' into rel
ericholscher Apr 4, 2016
d0d0e55
Merge branch 'master' into rel
ericholscher Apr 4, 2016
ead61e8
Merge branch 'master' into rel
ericholscher Apr 11, 2016
24b4b6b
Merge branch 'master' into rel
ericholscher Apr 12, 2016
6cc38b6
Merge branch 'master' into rel
ericholscher Apr 13, 2016
ff5891f
Merge branch 'master' into rel
ericholscher Apr 14, 2016
067bf58
Fix iso_code
ericholscher Apr 14, 2016
06b4d72
Add admin action for sending user emails
agjohnson Apr 19, 2016
568e9f1
Merge branch 'email-users' into rel
agjohnson Apr 20, 2016
8e1253e
Add admin action for sending user emails
agjohnson Apr 19, 2016
c955865
Tune email templates
agjohnson Apr 20, 2016
f5f8af5
Merge branch 'email-users' into rel
agjohnson Apr 20, 2016
18ed9a4
Add user admin project filtering
agjohnson Apr 26, 2016
722efa5
Merge branch 'master' into rel
ericholscher Apr 27, 2016
a48a742
Merge branch 'master' into rel
agjohnson Apr 29, 2016
34b800a
Merge branch 'master' into rel
ericholscher May 10, 2016
15bd6e1
Merge branch 'master' into rel
ericholscher May 17, 2016
4a05360
Merge branch 'master' into rel
ericholscher May 17, 2016
b940da0
Merge branch 'master' into rel
ericholscher Jun 2, 2016
010a3be
Merge branch 'master' into rel
ericholscher Jun 21, 2016
ce5b8b1
Merge branch 'master' into rel
ericholscher Jul 20, 2016
ba44e8a
Merge branch 'master' into rel
ericholscher Jul 20, 2016
eb35503
Merge branch 'master' into rel
ericholscher Aug 23, 2016
82c0f3f
Merge branch 'master' into rel
ericholscher Aug 25, 2016
0139236
Merge branch 'master' into rel
ericholscher Aug 26, 2016
717061a
Merge branch 'master' into rel
ericholscher Oct 5, 2016
ec5e5bd
Merge branch 'master' into rel
agjohnson Oct 10, 2016
62a226c
Merge branch 'master' into rel
agjohnson Oct 12, 2016
6968da3
Merge branch 'master' into rel
agjohnson Oct 12, 2016
cd528ea
Merge branch 'master' into rel
ericholscher Nov 1, 2016
7417550
Merge branch 'master' into rel
ericholscher Nov 1, 2016
c9fc886
Merge branch 'master' into rel
ericholscher Nov 1, 2016
759e78d
Merge branch 'master' into rel
ericholscher Nov 1, 2016
5fcaee8
Merge branch 'master' into rel
ericholscher Nov 1, 2016
9bd858c
Merge branch 'master' into rel
ericholscher Nov 14, 2016
02e4d54
Merge branch 'master' into rel
ericholscher Nov 16, 2016
caeb065
Merge branch 'master' into rel
ericholscher Nov 21, 2016
b7a2bca
Merge branch 'master' into rel
ericholscher Nov 21, 2016
37d59bb
Merge remote-tracking branch 'origin/add-payment-form' into rel
ericholscher Nov 21, 2016
def06b1
Merge remote-tracking branch 'origin/add-payment-form' into rel
ericholscher Nov 21, 2016
57843d3
Merge remote-tracking branch 'origin/add-payment-form' into rel
ericholscher Nov 21, 2016
b2f1162
Merge remote-tracking branch 'origin/add-payment-form' into rel
ericholscher Nov 22, 2016
a42e06e
Merge branch 'add-payment-form' into rel
ericholscher Dec 1, 2016
18e6a44
Merge branch 'fix-translation-model' into rel
agjohnson Jan 4, 2017
f48f19c
Merge branch 'master' into rel
agjohnson Jan 10, 2017
abe292c
Fix pagination of Builds on build list page.
ericholscher Feb 7, 2017
1095fde
Merge branch 'master' into rel
agjohnson Feb 13, 2017
3a0d1d2
Merge branch 'master' into rel
agjohnson Feb 13, 2017
f8ad71a
Merge branch 'master' into rel
agjohnson Feb 13, 2017
8238bfc
Merge branch 'master' into rel
agjohnson Feb 14, 2017
e1597b7
Merge branch 'master' into rel
ericholscher Mar 2, 2017
acf57e7
Merge branch 'master' into rel
ericholscher Mar 3, 2017
dd4efc4
Merge branch 'bump-theme' into rel
ericholscher Mar 3, 2017
fbbeea8
Merge branch 'master' into rel
ericholscher Mar 6, 2017
ccd92b1
Merge branch 'master' into rel
ericholscher Mar 9, 2017
bffa526
Merge branch 'master' into rel
ericholscher Mar 15, 2017
e29c109
Merge branch 'hotfix-19' into rel
ericholscher Mar 15, 2017
1b48686
Merge branch 'master' into rel
ericholscher Mar 27, 2017
caf9749
Merge branch 'master' into rel
ericholscher Mar 30, 2017
e805755
Merge branch 'fix-unicode-handling' into rel
ericholscher Mar 30, 2017
51f4031
Merge branch 'center-404-text' into rel
ericholscher Mar 30, 2017
6dbcc2b
Add a bit more color to the promo display.
ericholscher Mar 31, 2017
959a8ef
Small filtering update to disable globbing
ericholscher Apr 1, 2017
5ef72c0
Another approach
ericholscher Apr 1, 2017
81dc9c4
Some admin display improvements
ericholscher Apr 1, 2017
d13b309
Merge branch 'master' into rel
ericholscher Apr 3, 2017
e9b3aee
Merge remote-tracking branch 'origin/promo-filter-updates' into rel
ericholscher Apr 3, 2017
a951f1b
Rename the wonderful sponsor who hosts our search
ericholscher Apr 10, 2017
e6b6643
Merge branch 'master' into rel
ericholscher Apr 10, 2017
2dac189
Merge branch 'fix-search-callout' into rel
ericholscher Apr 10, 2017
0b0b6bf
Add stricter linting to prospector as second pass
agjohnson Mar 21, 2017
0513df9
Add sold clicks as an option, and show it when asked
ericholscher Apr 4, 2017
cdf35ca
Add ability to filter promos by theme
ericholscher Apr 12, 2017
bd0fed2
Log user agent on invalid click/view
ericholscher Apr 12, 2017
1bb11e2
Keep track of which projects are using which theme.
ericholscher Apr 13, 2017
5275492
Address review feedback
ericholscher Apr 17, 2017
fa97528
Newline
ericholscher Apr 17, 2017
8410401
Merge branch 'master' into rel
ericholscher Apr 17, 2017
ab08424
Index the slug, not the project repr
ericholscher Apr 17, 2017
7cc952a
Merge branch 'hotfix-theme' into rel
ericholscher Apr 17, 2017
a9c82c2
Merge branch 'master' into rel
agjohnson May 11, 2017
9299f93
Merge branch 'master' into rel
ericholscher Jun 8, 2017
d3a10ce
Fix geo filters
ericholscher Jun 8, 2017
c085bcc
Merge branch 'fix-geo-filter' into rel
ericholscher Jun 8, 2017
ae8c6d1
Another fix
ericholscher Jun 8, 2017
48303dc
Merge branch 'fix-geo-filter' into rel
ericholscher Jun 8, 2017
929cfc1
Fix syncers.
ericholscher Jun 8, 2017
662de1a
Merge branch 'fix-syncers' into rel
ericholscher Jun 8, 2017
f18d150
Merge branch 'master' into rel
ericholscher Jun 26, 2017
1f9516f
Don't explode on makedirs
ericholscher Jun 26, 2017
9488ccd
Merge branch 'fix-sync-deploy' into rel
ericholscher Jun 26, 2017
d6b9e70
Fix ad lookup
ericholscher Jun 26, 2017
92d6103
Merge branch 'fix-sync-deploy' into rel
ericholscher Jun 26, 2017
a48cd63
Fix task designation
ericholscher Jun 26, 2017
9ff3f82
Merge branch 'fix-sync-deploy' into rel
ericholscher Jun 26, 2017
f14e743
Handle version handling.
ericholscher Jun 26, 2017
8e44981
Merge branch 'fix-sync-deploy' into rel
ericholscher Jun 26, 2017
742fb56
Upgrade slumber
ericholscher Jun 26, 2017
adaeff3
Merge branch 'fix-sync-deploy' into rel
ericholscher Jun 26, 2017
892dbab
Merge branch 'master' into rel
ericholscher Jun 28, 2017
59be155
Merge branch 'master' into rel
ericholscher Jul 13, 2017
9582778
Merge remote-tracking branch 'origin/hotfix-oauth' into rel
ericholscher Jul 13, 2017
00e048c
Merge branch 'master' into rel
ericholscher Jul 19, 2017
2d152ec
Merge branch 'master' into rel
ericholscher Jul 19, 2017
babce00
Merge branch 'master' into rel
ericholscher Jul 20, 2017
3179269
Merge branch 'master' into rel
ericholscher Jul 20, 2017
b874ff5
Merge branch 'master' into rel
ericholscher Aug 30, 2017
a56d07c
Add some basic spam removal features to admin
agjohnson Sep 28, 2017
7367d81
Merge branch 'spam-admin-features' into rel
agjohnson Sep 28, 2017
a69f665
Add some docs on subprojects
agjohnson Apr 18, 2017
ecc5f6a
Clarify project slug, pull back on language on subproject search
agjohnson Apr 18, 2017
0a23bfa
Fix version V1 api for projects with numbers
JLorne Aug 10, 2017
08ca7a5
Add doc on user opt ou
ericholscher Aug 30, 2017
83e543a
Fix bold typo
ericholscher Aug 30, 2017
24cb961
Add link
ericholscher Aug 30, 2017
9a142a4
Move section for clarity, also clarify language and directions
agjohnson Aug 31, 2017
f1fe59f
Fix runtime error on python 3 (#3072)
ericholscher Aug 31, 2017
9dc336b
Document binary files for no line ending changes
davidfischer Sep 6, 2017
ec151b7
Add a tastypie XML requirement
davidfischer Sep 6, 2017
deeefab
Removing anchor - contributors should read the top bit about the CoC,…
RichardLitt Sep 7, 2017
39e5072
Adding a License section for redundancy
RichardLitt Sep 7, 2017
63f5de8
Rename License.mit to License
RichardLitt Sep 7, 2017
e26f111
Adjust manifest
RichardLitt Sep 7, 2017
adb591b
Manifest changes
RichardLitt Sep 7, 2017
af91982
Do not 404 on double clicks and views
davidfischer Sep 19, 2017
467c7e1
Make manage.py test work for the donate app
davidfischer Sep 20, 2017
d24b50f
Remove a double-check left in
davidfischer Sep 20, 2017
3a30fe1
Make the donate tests run in CI
davidfischer Sep 26, 2017
e137d8a
Typo: intergrations -> integrations
jessetan Sep 26, 2017
b17db45
Remove unused NGINX_X_ACCEL_REDIRECT
alexbarcelo Sep 28, 2017
18946e9
docs: Fix license link, add period
RichardLitt Sep 28, 2017
f304035
Serve default avatar over HTTPS.
EdOverflow Sep 29, 2017
183f7b9
Fix typo in DMCA page
dereckson Oct 3, 2017
ce1f713
Add additional signals around sphinx context data (#3141)
agjohnson Oct 3, 2017
dfcf78e
Add some basic spam removal features to admin (#3131)
agjohnson Oct 5, 2017
fac0012
Refactor project documentation syncing tasks (#3143)
agjohnson Oct 5, 2017
0d5be72
Add cold storage option on builds & configurable BuildViewSet
ericholscher Oct 5, 2017
a91991b
Small docstring
ericholscher Oct 5, 2017
97867e6
Fix up migration
ericholscher Oct 5, 2017
da72709
Merge branch 'master' into rel
ericholscher Oct 9, 2017
9cd827c
Fix cold storage modeling to be nullable
ericholscher Oct 10, 2017
348a6bf
Merge branch 'cold-storage-hotfixes' into rel
ericholscher Oct 10, 2017
87916a8
No default
ericholscher Oct 10, 2017
2f3584f
Merge branch 'cold-storage-hotfixes' into rel
ericholscher Oct 10, 2017
a903f44
Merge branch 'master' into rel
ericholscher Oct 19, 2017
934ae16
Merge branch 'master' into rel
ericholscher Oct 24, 2017
f7cec7e
Merge branch 'master' into rel
ericholscher Oct 25, 2017
b8a63f4
Merge branch 'master' into rel
agjohnson Oct 31, 2017
ff0fa34
Merge branch 'master' into rel
ericholscher Nov 8, 2017
6841fc1
Merge branch 'master' into rel
ericholscher Nov 9, 2017
52dc2a1
Merge branch 'master' into rel
ericholscher Nov 14, 2017
4751ea7
Merge branch 'master' into rel
ericholscher Nov 15, 2017
65b15f9
Merge branch 'master' into rel
agjohnson Nov 20, 2017
492c68b
Merge branch 'master' into rel
ericholscher Nov 29, 2017
7e6e8f5
Merge branch 'master' into rel
ericholscher Nov 29, 2017
47050f3
Merge branch 'master' into rel
ericholscher Dec 5, 2017
9b15d28
Revert "Merge pull request #3336 from rtfd/use-active-for-stable"
ericholscher Dec 6, 2017
d6b3a8f
Merge branch 'master' into rel
agjohnson Dec 7, 2017
6ed95c9
Merge branch 'master' into rel
ericholscher Dec 14, 2017
49cb0e1
Merge branch 'master' into rel
ericholscher Dec 14, 2017
e84c431
Merge branch 'master' into rel
ericholscher Dec 21, 2017
d67adfc
Merge branch 'hotfix-verison-slug-hack' into rel
ericholscher Dec 21, 2017
8c01e59
Merge remote-tracking branch 'origin/humitos/git/hotfix' into rel
ericholscher Dec 21, 2017
cbb37e1
Merge branch 'master' into rel
ericholscher Dec 21, 2017
d9140dd
Merge branch 'fix-git' into rel
ericholscher Dec 22, 2017
83a3bbd
Merge branch 'master' into rel
ericholscher Jan 4, 2018
c571e8d
Merge branch 'master' into rel
ericholscher Jan 16, 2018
75a0241
Merge branch 'master' into rel
ericholscher Jan 25, 2018
2d6c695
Merge branch 'master' into rel
ericholscher Feb 9, 2018
b85b16b
Merge tag '2.2.0' into rel
agjohnson Feb 22, 2018
38f9aa0
Fix issue with missing setting in oauth SyncRepo task
agjohnson Feb 22, 2018
3323b2c
Hotfix for adding logging call back into project sync task
agjohnson Feb 22, 2018
6d3bc31
Merge branch 'agj/hotfix-sync-repo-log' into rel
agjohnson Feb 22, 2018
21ffc0d
Merge branch 'agj/hotfix-oauth-sync-repo' into rel
agjohnson Feb 22, 2018
78bacad
Merge branch 'master' into rel
agjohnson Mar 12, 2018
1058fa7
Merge branch 'master' into rel
ericholscher Mar 13, 2018
5890058
Update proper font
ericholscher Mar 13, 2018
cebd51a
Merge branch 'master' into rel
ericholscher Mar 13, 2018
b6dc3fc
Merge tag '2.3.1' into rel
agjohnson Mar 23, 2018
57fa4b7
Merge branch 'humitos/import/url-repo-validation' into rel
agjohnson Mar 23, 2018
b872806
Use gitpython to find a commit reference
agjohnson Mar 24, 2018
939d0d8
Check submodule URLs integrity using gitpython
humitos Mar 23, 2018
29cb96e
Fix up some of the logic around repo and submodule URLs
agjohnson Mar 26, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 49 additions & 22 deletions readthedocs/core/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ def __call__(self, value):
@deconstructible
class RepositoryURLValidator(object):

disallow_relative_url = True

# Pattern for ``[email protected]:user/repo`` pattern
re_git_user = re.compile(r'^[\w]+@.+')

def __call__(self, value):
allow_private_repos = getattr(settings, 'ALLOW_PRIVATE_REPOS', False)
public_schemes = ['https', 'http', 'git', 'ftps', 'ftp']
Expand All @@ -60,28 +65,50 @@ def __call__(self, value):
if allow_private_repos:
valid_schemes += private_schemes
url = urlparse(value)
if (
(
url.scheme not in valid_schemes and \
'@' not in value and \
not value.startswith('lp:')
) or \
(
value.startswith('/') or \
value.startswith('file://') or \
value.startswith('.')
)
):
# Avoid ``/path/to/local/file`` and ``file://`` scheme but allow
# ``[email protected]:user/project.git`` and ``lp:bazaar``
raise ValidationError(_('Invalid scheme for URL'))
elif '&&' in value or '|' in value:

# Malicious characters go first
if '&&' in value or '|' in value:
raise ValidationError(_('Invalid character in the URL'))
elif (
('@' in value or url.scheme in private_schemes) and
not allow_private_repos
):
raise ValidationError('Clonning via SSH is not supported')
return value
elif url.scheme in valid_schemes:
return value

# Repo URL is not a supported scheme at this point, but there are
# several cases where we might support it
# Launchpad
elif value.startswith('lp:'):
return value
# Relative paths are conditionally supported
elif value.startswith('.') and not self.disallow_relative_url:
return value
# SSH cloning and ``[email protected]:user/project.git``
elif self.re_git_user.search(value) or url.scheme in private_schemes:
if allow_private_repos:
return value
else:
# Throw a more helpful error message
raise ValidationError('Manual cloning via SSH is not supported')

# No more valid URLs without supported URL schemes
raise ValidationError(_('Invalid scheme for URL'))


class SubmoduleURLValidator(RepositoryURLValidator):

"""
A URL validator for repository submodules

If a repository has a relative submodule, the URL path is effectively the supermodule's remote ``origin`` URL with the relative path applied.

From the git docs::

``<repository>`` is the URL of the new submodule's origin repository.
This may be either an absolute URL, or (if it begins with ``./`` or
``../``), the location relative to the superproject's default remote
repository
"""

disallow_relative_url = False


validate_repository_url = RepositoryURLValidator()
validate_submodule_url = SubmoduleURLValidator()
4 changes: 4 additions & 0 deletions readthedocs/projects/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ class RepositoryError(BuildEnvironmentError):
'Private repositories are not supported.'
)

INVALID_SUBMODULES = _(
'One or more submodule URLs are not valid.'
)

def get_default_message(self):
if settings.ALLOW_PRIVATE_REPOS:
return self.PRIVATE_ALLOWED
Expand Down
1 change: 1 addition & 0 deletions readthedocs/projects/views/private.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ def project_version_detail(request, project_slug, version_slug):
broadcast(
type='app', task=tasks.clear_artifacts, args=[version.pk])
version.built = False
version.machine = False
version.save()
url = reverse('project_version_list', args=[project.slug])
return HttpResponseRedirect(url)
Expand Down
15 changes: 15 additions & 0 deletions readthedocs/rtd_tests/tests/test_backend.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from __future__ import absolute_import
from os.path import exists

import pytest
from django.contrib.auth.models import User
import django_dynamic_fixture as fixture

from readthedocs.projects.exceptions import RepositoryError
from readthedocs.projects.models import Project, Feature
from readthedocs.rtd_tests.base import RTDTestCase

Expand Down Expand Up @@ -101,6 +103,19 @@ def test_skip_submodule_checkout(self):
self.assertTrue(self.project.has_feature(Feature.SKIP_SUBMODULES))
self.assertFalse(repo.are_submodules_available())

def test_check_submodule_urls(self):
repo = self.project.vcs_repo()
repo.checkout('submodule')
self.assertTrue(repo.are_submodules_valid())
repo.checkout('relativesubmodule')
self.assertTrue(repo.are_submodules_valid())

@pytest.mark.xfail(strict=True, reason="Fixture is not working correctly")
def test_check_invalid_submodule_urls(self):
with self.assertRaises(RepositoryError) as e:
repo.checkout('invalidsubmodule')
self.assertEqual(e.msg, RepositoryError.INVALID_SUBMODULES)


class TestHgBackend(RTDTestCase):
def setUp(self):
Expand Down
2 changes: 1 addition & 1 deletion readthedocs/rtd_tests/tests/test_sync_versions.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ def test_update_inactive_stable_version(self):

version_stable = Version.objects.get(slug=STABLE)
self.assertFalse(version_stable.active)
self.assertEqual(version_stable.identifier, '0.9')
self.assertEqual(version_stable.identifier, '1.0.0')

def test_stable_version_tags_over_branches(self):
version_post_data = {
Expand Down
28 changes: 24 additions & 4 deletions readthedocs/rtd_tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import logging
import subprocess
from os import chdir, environ, getcwd
from os import chdir, environ, getcwd, mkdir
from os.path import abspath, join as pjoin
from shutil import copytree
from tempfile import mkdtemp
Expand Down Expand Up @@ -49,11 +49,31 @@ def make_test_git():
# Set up the actual repository
log.info(check_output(['git', 'add', '.'], env=env))
log.info(check_output(['git', 'commit', '-m"init"'], env=env))
# Add repo itself as submodule
log.info(check_output(['git', 'checkout', '-b', 'submodule'], env=env))
log.info(check_output(['git', 'submodule', 'add', '-b', 'master', './', 'submodule'], env=env))

# Add fake repo as submodule. We need to fake this here because local path
# URL are not allowed and using a real URL will require Internet to clone
# the repo
log.info(check_output(['git', 'checkout', '-b', 'submodule', 'master'], env=env))
# https://stackoverflow.com/a/37378302/2187091
mkdir(pjoin(directory, 'foobar'))
gitmodules_path = pjoin(directory, '.gitmodules')
with open(gitmodules_path, 'w') as fh:
fh.write('''[submodule "foobar"]\n\tpath = foobar\n\turl = https://foobar.com/git\n''')
log.info(check_output(['git', 'update-index', '--add', '--cacheinfo', '160000', '233febf4846d7a0aeb95b6c28962e06e21d13688', 'foobar'], env=env))
log.info(check_output(['git', 'add', '.'], env=env))
log.info(check_output(['git', 'commit', '-m"Add submodule"'], env=env))

# Add a relative submodule URL in the relativesubmodule branch
log.info(check_output(['git', 'checkout', '-b', 'relativesubmodule', 'master'], env=env))
log.info(check_output(['git', 'submodule', 'add', '-b', 'master', './', 'relativesubmodule'], env=env))
log.info(check_output(['git', 'add', '.'], env=env))
log.info(check_output(['git', 'commit', '-m"Add relative submodule"'], env=env))
# Add an invalid submodule URL in the invalidsubmodule branch
log.info(check_output(['git', 'checkout', '-b', 'invalidsubmodule', 'master'], env=env))
log.info(check_output(['git', 'submodule', 'add', '-b', 'master', 'file:///tmp/', 'invalidsubmodule'], env=env))
log.info(check_output(['git', 'add', '.'], env=env))
log.info(check_output(['git', 'commit', '-m"Add invalid submodule"'], env=env))

# Checkout to master branch again
log.info(check_output(['git', 'checkout', 'master'], env=env))
chdir(path)
Expand Down
49 changes: 37 additions & 12 deletions readthedocs/vcs_support/backends/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@
import os
import re

import git
from django.core.exceptions import ValidationError
from git.exc import BadName
from six import PY2, StringIO

from readthedocs.core.validators import validate_submodule_url
from readthedocs.projects.exceptions import RepositoryError
from readthedocs.vcs_support.base import BaseVCS, VCSVersion

Expand Down Expand Up @@ -71,6 +75,16 @@ def are_submodules_available(self):
code, out, _ = self.run('git', 'submodule', 'status', record=False)
return code == 0 and bool(out)

def are_submodules_valid(self):
"""Test that all submodule URLs are valid."""
repo = git.Repo(self.working_dir)
for submodule in repo.submodules:
try:
validate_submodule_url(submodule.url)
except ValidationError:
return False
return True

def fetch(self):
code, _, _ = self.run('git', 'fetch', '--tags', '--prune')
if code != 0:
Expand Down Expand Up @@ -230,18 +244,24 @@ def checkout(self, identifier=None):
# Update submodules, temporarily allow for skipping submodule checkout
# step for projects need more submodule configuration.
if self.are_submodules_available():
self.run('git', 'submodule', 'sync')
self.run(
'git',
'submodule',
'update',
'--init',
'--recursive',
'--force',
)

if self.are_submodules_valid():
self.checkout_submodules()
else:
raise RepositoryError(RepositoryError.INVALID_SUBMODULES)
return code, out, err

def checkout_submodules(self):
"""Checkout all repository submodules recursively."""
self.run('git', 'submodule', 'sync')
self.run(
'git',
'submodule',
'update',
'--init',
'--recursive',
'--force',
)

def find_ref(self, ref):
# Check if ref starts with 'origin/'
if ref.startswith('origin/'):
Expand All @@ -254,8 +274,13 @@ def find_ref(self, ref):
return ref

def ref_exists(self, ref):
code, _, _ = self.run('git', 'show-ref', ref, record_as_success=True)
return code == 0
try:
r = git.Repo(self.working_dir)
if r.commit(ref):
return True
except BadName:
return False
return False

@property
def env(self):
Expand Down
3 changes: 2 additions & 1 deletion requirements/pip.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Base packages
pip==9.0.1
pip==9.0.3
appdirs==1.4.3
virtualenv==15.1.0
docutils==0.14
Expand Down Expand Up @@ -47,6 +47,7 @@ dnspython==1.15.0

# VCS
httplib2==0.10.3
GitPython==2.1.8

# Search
elasticsearch==1.5.0
Expand Down