1
0
mirror of https://git.cloudron.io/cloudron/gitea-app synced 2025-09-24 14:07:45 +00:00

Compare commits

...

59 Commits

Author SHA1 Message Date
Girish Ramakrishnan
6874ea9d46 Version 1.23.0 2021-12-03 10:36:21 -08:00
Girish Ramakrishnan
2c284d36fa Update test packages 2021-12-03 10:36:16 -08:00
Girish Ramakrishnan
83da665570 add asciidoctor and pandoc 2021-12-03 10:05:28 -08:00
Girish Ramakrishnan
a427a098fe Update gitea to 1.15.7 2021-12-03 09:44:35 -08:00
Girish Ramakrishnan
eb4f29375b Merge branch 'master' into 'master'
markup: add jupyter notebook markup language

See merge request cloudron/gitea-app!6
2021-12-03 17:43:23 +00:00
Mark Stenglein
05dcb14e8d markup: add jupyter notebook markup language
Follows documentation here:
  - https://docs.gitea.io/en-us/external-renderers/#installing-external-binaries

This adds jupyter and configures gitea to use jupyter to render notebook files.
2021-12-03 03:06:00 +00:00
Johannes Zellner
5a03ee8f27 Update test deps 2021-10-28 13:05:31 +02:00
Johannes Zellner
e62f99643d Bump version for 1.15.6 2021-10-28 13:04:04 +02:00
Johannes Zellner
73027148c6 Fixup tests 2021-10-22 08:27:40 +02:00
Johannes Zellner
67a138be41 Update test deps 2021-10-22 07:35:13 +02:00
Johannes Zellner
2c32dcf6bd Bump version for 1.22.5 2021-10-22 07:34:28 +02:00
Girish Ramakrishnan
dc7f7e2f4e Version 1.22.4 2021-10-08 12:54:00 -07:00
Girish Ramakrishnan
9a03f268cb Update test packages 2021-10-08 12:53:56 -07:00
Girish Ramakrishnan
fde6dfa485 Update Gitea to 1.15.4 2021-10-08 12:42:26 -07:00
Johannes Zellner
8b16de1dcd Update test deps 2021-09-22 12:14:42 +02:00
Johannes Zellner
1074999c40 Bump version for 1.15.3 2021-09-22 12:14:15 +02:00
Johannes Zellner
0cfe7fea88 Bump version for 1.15.2 2021-09-03 17:34:41 +02:00
Johannes Zellner
a3bb9db92e Update test deps 2021-09-03 10:26:24 +02:00
Johannes Zellner
8c84f905e7 Bump version for 1.15.1 2021-09-03 10:26:05 +02:00
Johannes Zellner
0008351e7c Fixup tests 2021-08-23 13:10:31 +02:00
Johannes Zellner
0aab01b926 Update test deps 2021-08-23 11:17:41 +02:00
Johannes Zellner
2877b4e599 Bump version for 1.15.0 2021-08-23 11:17:23 +02:00
Girish Ramakrishnan
f5f690ebd9 Version 1.21.6 2021-08-06 10:12:10 -07:00
Girish Ramakrishnan
4a5bf98d60 Update test packages 2021-08-06 10:00:52 -07:00
Girish Ramakrishnan
3e84ab8730 Update gitea to 1.14.6 2021-08-05 10:47:29 -07:00
Johannes Zellner
c0d7b41a77 Bump version for 1.14.5 2021-07-16 11:12:03 +02:00
Johannes Zellner
df77df2347 Update test deps 2021-07-06 15:30:30 +02:00
Johannes Zellner
f18b11626c Bump version for 1.14.4 2021-07-06 15:29:52 +02:00
Johannes Zellner
75917ed6e1 Update test deps 2021-06-21 11:21:07 +02:00
Johannes Zellner
8033a4f001 Bump version for 1.14.3 2021-06-21 11:19:40 +02:00
Girish Ramakrishnan
6c2c00a53a Version 1.21.2 2021-05-10 09:28:21 -07:00
Girish Ramakrishnan
86e13642e6 Update test packages 2021-05-10 09:22:38 -07:00
Girish Ramakrishnan
257b51d226 Version 1.14.2 2021-05-10 09:17:46 -07:00
Johannes Zellner
37544c8e9b Fix version 2021-04-16 12:56:52 +02:00
Johannes Zellner
a04656847a Update test deps 2021-04-16 12:56:05 +02:00
Johannes Zellner
5e8950ec86 Bump version for 1.14.1 2021-04-16 12:34:15 +02:00
Johannes Zellner
2637ef1b4b CLI command has changed subcommand style 2021-04-12 18:35:50 +02:00
Johannes Zellner
0bea878d12 Use /explore instead of non-existing /healthcheck 2021-04-12 18:35:32 +02:00
Johannes Zellner
bed765a1e4 Bump version for 1.14.0 2021-04-12 12:40:28 +02:00
Johannes Zellner
1e38bd58c6 Bump version for 1.13.7 2021-04-08 14:35:40 +02:00
Johannes Zellner
a0f8607250 Bump version for 1.13.6 2021-03-24 13:41:35 +01:00
Johannes Zellner
4c0e49def0 Update test deps 2021-03-22 10:12:11 +01:00
Johannes Zellner
c9937d6134 Bump version for 1.13.5 2021-03-22 10:11:47 +01:00
Johannes Zellner
3d51637daf Update test deps 2021-03-08 11:45:35 +01:00
Johannes Zellner
65a87ede58 Bump version for 1.13.4 2021-03-08 11:41:13 +01:00
Johannes Zellner
11800518cb Update test deps 2021-03-04 17:09:43 +01:00
Johannes Zellner
731be1ccf8 Bump version for 1.13.3 2021-03-04 17:08:50 +01:00
Girish Ramakrishnan
32c5507674 Version 1.20.0 2021-02-16 11:08:41 -08:00
Girish Ramakrishnan
1deeedfc87 Use base image v3 2021-02-16 11:01:28 -08:00
Girish Ramakrishnan
86a0949b14 the login UI has changed 2021-02-16 11:01:11 -08:00
Johannes Zellner
1aee702ada Update test deps 2021-02-02 10:09:47 +01:00
Johannes Zellner
6833bcd31b Bump version for 1.13.2 2021-02-02 10:09:18 +01:00
Girish Ramakrishnan
1a433ecee0 Version 1.19.1 2020-12-28 16:17:13 -08:00
Girish Ramakrishnan
c1f261592e Update Gitea to 1.13.1 2020-12-28 12:21:18 -08:00
Girish Ramakrishnan
282eed291e Fix doc url 2020-12-07 17:01:55 -08:00
Johannes Zellner
43900e7897 Update test deps 2020-12-02 17:11:33 +01:00
Johannes Zellner
5ff6e0a410 Bump version for 1.13.0 2020-12-02 17:11:11 +01:00
Johannes Zellner
3b9989fcf0 Update test deps 2020-11-16 15:45:45 +01:00
Johannes Zellner
8b92a4feb4 Bump version for 1.12.6 2020-11-16 15:45:16 +01:00
10 changed files with 759 additions and 1451 deletions

283
CHANGELOG
View File

@@ -568,3 +568,286 @@
* Fix yet another bug with diff file names (#12771) (#12776)
* RepoInit Respect AlternateDefaultBranch (#12746) (#12751)
* Fix Avatar Resize (resize algo NearestNeighbor -> Bilinear) (#12745) (#12750)
[1.18.5]
* Update Gitea to 1.12.6
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.6)
* Prevent git operations for inactive users (#13527) (#13537)
* Disallow urlencoded new lines in git protocol paths if there is a port (#13521) (#13525)
* API should only return Json (#13511) (#13564)
* Fix before and since query arguments at API (#13559) (#13560)
* Prevent panic on git blame by limiting lines to 4096 bytes at most (#13470) (#13492)
* Fix link detection in repository description with tailing '_' (#13407) (#13408)
* Remove obsolete change of email on profile page (#13341) (#13348)
* Fix permission check on get Reactions API endpoints (#13344) (#13346)
* Add migrated pulls to pull request task queue (#13331) (#13335)
* API deny wrong pull creation options (#13308) (#13327)
* Fix initial commit page & binary munching problem (#13249) (#13259)
* Fix diff parsing (#13157) (#13136) (#13139)
* Return error 404 not 500 from API if team does not exist (#13118) (#13119)
* Prohibit automatic downgrades (#13108) (#13111)
* Fix GitLab Migration Option AuthToken (#13101)
* GitLab Label Color Normalizer (#12793) (#13100)
* Log the underlying panic in runMigrateTask (#13096) (#13098)
* Fix attachments list in edit comment (#13036) (#13097)
* Fix deadlock when deleting team user (#13093)
* Fix error create comment on outdated file (#13041) (#13042)
* Fix repository create/delete event webhooks (#13008) (#13027)
* Fix internal server error on README in submodule (#13006) (#13016)
[1.19.0]
* Update Gitea to 1.13.0
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.13.0)
[1.19.1]
* Update Gitea to 1.13.1
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.13.1)
* Security: Hide private participation in Orgs (#13994) (#14031)
* Security: Fix escaping issue in diff (#14153) (#14154)
[1.19.2]
* Update Gitea to 1.13.2
* Prevent panic on fuzzer provided string (#14405) (#14409)
* Add secure/httpOnly attributes to the lang cookie (#14279) (#14280)
* If release publisher is deleted use ghost user (#14375)
* Internal ssh server respect Ciphers, MACs and KeyExchanges settings (#14523) (#14530)
* Set the name Mapper in migrations (#14526) (#14529)
* Fix wiki preview (#14515)
* Update code.gitea.io/sdk/gitea v0.13.1 -> v0.13.2 (#14497)
* ChangeUserName: rename user files back on DB issue (#14447)
* Fix lfs preview bug (#14428) (#14433)
* Ensure timeout error is shown on u2f timeout (#14417) (#14431)
* Fix Deadlock & Delete affected reactions on comment deletion (#14392) (#14425)
* Use path not filepath in routers/editor (#14390) (#14396)
* Check if label template exist first (#14384) (#14389)
* Fix migration v141 (#14387) (#14388)
* Use Request.URL.RequestURI() for fcgi (#14347)
* Use ServerError provided by Context (#14333) (#14345)
* Fix edit-label form init (#14337)
* Fix mailIssueCommentBatch for pull request (#14252) (#14296)
* Render links for commit hashes followed by comma (#14224) (#14227)
* Send notifications for mentions in pulls, issues, (code-)comments (#14218) (#14221)
* Fix avatar bugs (#14217) (#14220)
* Ensure that schema search path is set with every connection on postgres (#14131) (#14216)
* Fix dashboard issues labels filter bug (#14210) (#14214)
* When visit /favicon.ico but the static file is not exist return 404 but not continue to handle the route (#14211) (#14213)
* Fix branch selector on new issue page (#14194) (#14207)
* Check for notExist on profile repository page (#14197) (#14203)
[1.20.0]
* Use base image v3
[1.20.1]
* Update Gitea to 1.13.3
* Turn default hash password algorithm back to pbkdf2 from argon2 until we find a better one (#14673) (#14675)
* Fix paging of file commit logs (#14831) (#14879)
* Print useful error if SQLite is used in settings but not supported (#14476) (#14874)
* Fix display since time round (#14226) (#14873)
* When Deleting Repository only explicitly close PRs whose base is not this repository (#14823) (#14842)
* Set HCaptchaSiteKey on Link Account pages (#14834) (#14839)
* Fix a couple of CommentAsPatch issues. (#14804) (#14820)
* Disable broken OAuth2 providers at startup (#14802) (#14811)
* Repo Transfer permission checks (#14792) (#14794)
* Fix double alert in oauth2 application edit view (#14764) (#14768)
* Fix broken spans in diffs (#14678) (#14683)
* Prevent race in PersistableChannelUniqueQueue.Has (#14651) (#14676)
* HasPreviousCommit causes recursive load of commits unnecessarily (#14598) (#14649)
* Do not assume all 40 char strings are SHA1s (#14624) (#14648)
* Allow org labels to be set with issue templates (#14593) (#14647)
* Accept multiple SSH keys in single LDAP SSHPublicKey attribute (#13989) (#14607)
* Fix bug about ListOptions and stars/watchers pagnation (#14556) (#14573)
* Fix GPG key deletion during account deletion (#14561) (#14569)
[1.20.2]
* Update Gitea to 1.13.4
* Fix issue popups (#14898) (#14899)
* Fix race in LFS ContentStore.Put(...) (#14895) (#14913)
* Fix a couple of issues with a feeds (#14897) (#14903)
* When transfering repository and database transaction failed, rollback the renames (#14864) (#14902)
* Fix race in local storage (#14888) (#14901)
* Fix 500 on pull view page if user is not loged in (#14885) (#14886)
[1.20.3]
* Update Gitea to 1.13.5
* Update to goldmark 1.3.3 (#15059) (#15061)
* Another clusterfuzz spotted issue (#15032) (#15034)
* Fix set milestone on PR creation (#14981) (#15001)
* Prevent panic when editing forked repos by API (#14960) (#14963)
* Fix bug when upload on web (#15042) (#15055)
* Delete Labels & IssueLabels on Repo Delete too (#15039) (#15051)
* Fix postgres ID sequences broken by recreate-table (#15015) (#15029)
* Fix several render issues (#14986) (#15013)
* Make sure sibling images get a link too (#14979) (#14995)
* Fix Anchor jumping with escaped query components (#14969) (#14977)
* Fix release mail html template (#14976)
* Fix excluding more than two labels on issues list (#14962) (#14973)
* Don't mark each comment poster as OP (#14971) (#14972)
* Add "captcha" to list of reserved usernames (#14930)
* Re-enable import local paths after reversion from #13610 (#14925) (#14927)
[1.20.4]
* Update Gitea to 1.13.6
* Fix bug on avatar middleware (#15124) (#15125)
* Fix another clusterfuzz identified issue (#15096) (#15114)
* Fix nil exeption for get pull reviews API #15104 (#15106)
* Fix markdown rendering in milestone content (#15056) (#15092)
[1.20.5]
* Update Gitea to 1.13.7
* Update to bluemonday-1.0.6 (#15294) (#15298)
* Clusterfuzz found another way (#15160) (#15169)
* Fix wrong user returned in API (#15139) (#15150)
* Add 'fonts' into 'KnownPublicEntries' (#15188) (#15317)
* Speed up enry.IsVendor (#15213) (#15246)
* Response 404 for diff/patch of a commit that not exist (#15221) (#15238)
* Prevent NPE in CommentMustAsDiff if no hunk header (#15199) (#15201)
* Add size to Save function (#15264) (#15271)
[1.21.0]
* Update Gitea to 1.14.0
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.0)
[1.21.1]
* Update Gitea to 1.14.1
* Fix bug clone wiki (#15499) (#15502)
* Github Migration ignore rate limit, if not enabled (#15490) (#15495)
* Use subdir for URL (#15446) (#15493)
* Query the DB for the hash before inserting in to email_hash (#15457) (#15491)
* Ensure review dismissal only dismisses the correct review (#15477) (#15489)
* Use index of the supported tags to choose user lang (#15452) (#15488)
* Fix wrong file link in code search page (#15466) (#15486)
* Quick template fix for built-in SSH server in admin config (#15464) (#15481)
* Prevent superfluous response.WriteHeader (#15456) (#15476)
* Fix ambiguous argument error on tags (#15432) (#15474)
* Add created_unix instead of expiry to migration (#15458) (#15463)
* Fix repository search (#15428) (#15442)
* Prevent NPE on avatar direct rendering if federated avatars disabled (#15434) (#15439)
* Fix wiki clone urls (#15430) (#15431)
* Fix dingtalk icon url at webhook (#15417) (#15426)
* Standardise icon on projects PR page (#15387) (#15408)
* Add option to skip LFS/attachment files for dump (#15407) (#15492)
* Clone panel fixes (#15436)
* Use semantic dropdown for code search query type (#15276) (#15364)
[1.21.2]
* Update Gitea to 1.14.2
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.2)
* Display conflict-free merge messages for pull requests (#15773) (#15796)
* Exponential Backoff for ByteFIFO (#15724) (#15793)
* Issue list alignment tweaks (#15483) (#15766)
* Implement delete release attachments and update release attachments' name (#14130) (#15666)
* Add placeholder text to deploy key textarea (#15575) (#15576)
* Project board improvements (#15429) (#15560)
* Repo branch page: label size, PR ref, new PR button alignment (#15363) (#15365)
[1.21.3]
* Update Gitea to 1.14.3
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.3)
* Encrypt migration credentials at rest (#15895) (#16187)
* Only check access tokens if they are likely to be tokens (#16164) (#16171)
* Add missing SameSite settings for the i_like_gitea cookie (#16037) (#16039)
* Fix setting of SameSite on cookies (#15989) (#15991)
[1.21.4]
* Update Gitea to 1.14.4
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.4)
* Fix relative links in postprocessed images (#16334) (#16340)
* Fix list_options GetStartEnd (#16303) (#16305)
* Fix API to use author for commits instead of committer (#16276) (#16277)
* Handle misencoding of login_source cfg in mssql (#16268) (#16275)
* Fixed issues not updated by commits (#16254) (#16261)
* Improve efficiency in FindRenderizableReferenceNumeric and getReference (#16251) (#16255)
* Use html.Parse rather than html.ParseFragment (#16223) (#16225)
* Fix milestone counters on new issue (#16183) (#16224)
* reqOrgMembership calls need to be preceded by reqToken (#16198) (#16219)
[1.21.5]
* Update Gitea to 1.14.5
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.5)
* Hide mirror passwords on repo settings page (#16022) (#16355)
* Update bluemonday to v1.0.15 (#16379) (#16380)
* Retry rename on lock induced failures (#16435) (#16439)
* Validate issue index before querying DB (#16406) (#16410)
* Fix crash following ldap authentication update (#16447) (#16449)
* Redirect on bad CSRF instead of presenting bad page (#14937) (#16378)
[1.21.6]
* Update Gitea to 1.14.6
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.6)
* SECURITY
* Bump github.com/markbates/goth from v1.67.1 to v1.68.0 (#16538) (#16540)
* Switch to maintained JWT lib (#16532) (#16535)
* Upgrade to latest version of golang-jwt (as forked for 1.14) (#16590) (#16607)
[1.22.0]
* Update Gitea to 1.15.0
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.0)
[1.22.1]
* Update Gitea to 1.15.1
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.1)
[1.22.2]
* Update Gitea to 1.15.2
* Add unique constraint back into issue_index (#16938)
* Close storage objects before cleaning (#16934) (#16942)
[1.22.3]
* Update Gitea to 1.15.3
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.3)
* Add fluid to ui container class to remove margin (#16396) (#16976)
* Add caller to cat-file batch calls (#17082) (#17089)
* Many bug fixes
[1.22.4]
* Update Gitea to 1.15.4
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.4)
* Raw file API: don't try to interpret 40char filenames as commit SHA (#17185) (#17272)
* Don't allow merged PRs to be reopened (#17192) (#17271)
* Fix incorrect repository count on organization tab of dashboard (#17256) (#17266)
* Fix unwanted team review request deletion (#17257) (#17264)
* Fix broken Activities link in team dashboard (#17255) (#17258)
* API pull's head/base have correct permission(#17214) (#17245)
* Fix stange behavior of DownloadPullDiffOrPatch in incorect index (#17223) (#17227)
* Upgrade xorm to v1.2.5 (#17177) (#17188)
* Fix missing repo link in issue/pull assigned emails (#17183) (#17184)
* Fix bug of get context user (#17169) (#17172)
* Nicely handle missing user in collaborations (#17049) (#17166)
* Add Horizontal scrollbar to inner menu on Chrome (#17086) (#17164)
* Fix wrong i18n keys (#17150) (#17153)
* Fix Archive Creation: correct transaction ending (#17151)
* Prevent panic in Org mode HighlightCodeBlock (#17140) (#17141)
* Create doctor command to fix repo_units broken by dumps from 1.14.3-1.14.6 (#17136) (#17137)
[1.22.5]
* Update Gitea to 1.15.5
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.5)
* Upgrade Bluemonday to v1.0.16 (#17372) (#17374)
* Ensure correct SSH permissions check for private and restricted users (#17370) (#17373)
* Prevent NPE in CSV diff rendering when column removed (#17018) (#17377)
* Offer rsa-sha2-512 and rsa-sha2-256 algorithms in internal SSH (#17281) (#17376)
* Don't panic if we fail to parse U2FRegistration data (#17304) (#17371)
* Ensure popup text is aligned left (backport for 1.15) (#17343)
* Ensure that git daemon export ok is created for mirrors (#17243) (#17306)
* Disable core.protectNTFS (#17300) (#17302)
* Use pointer for wrappedConn methods (#17295) (#17296)
* AutoRegistration is supposed to be working with disabled registration (backport) (#17292)
* Handle duplicate keys on GPG key ring (#17242) (#17284)
* Fix SVG side by side comparison link (#17375) (#17391)
[1.22.6]
* Update Gitea to 1.15.6
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.6)
* Prevent panic in serv.go with Deploy Keys (#17434) (#17435)
* Fix CSV render error (#17406) (#17431)
* Read expected buffer size (#17409) (#17430)
* Ensure that restricted users can access repos for which they are members (#17460) (#17464)
* Make commit-statuses popup show correctly (#17447) (#17466)
[1.23.0]
* Update Gitea to 1.15.7
* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.7)
* Enable rendering of jupyter notebooks, rst, asciidoc by default
* Only allow webhook to send requests to allowed hosts (#17482) (#17510)
* Fix login redirection links (#17451) (#17473)

View File

@@ -4,8 +4,8 @@
"author": "Gitea developers",
"description": "file://DESCRIPTION.md",
"tagline": "A painless self-hosted Git Service",
"version": "1.18.4",
"healthCheckPath": "/healthcheck",
"version": "1.23.0",
"healthCheckPath": "/explore",
"httpPort": 3000,
"memoryLimit": 536870912,
"addons": {
@@ -38,5 +38,5 @@
"postInstallMessage": "file://POSTINSTALL.md",
"minBoxVersion": "5.3.0",
"forumUrl": "https://forum.cloudron.io/category/19/gitea",
"documentationUrl": "https://cloudron.io/documentation/apps/gitea/"
"documentationUrl": "https://docs.cloudron.io/apps/gitea/"
}

View File

@@ -1,4 +1,4 @@
This app packages Gitea <upstream>1.12.5</upstream>
This app packages Gitea <upstream>1.15.7</upstream>
Gitea is a painless self-hosted Git service. It is similar to GitHub, Bitbucket or Gitlab.

View File

@@ -1,11 +1,10 @@
FROM cloudron/base:2.0.0@sha256:f9fea80513aa7c92fe2e7bf3978b54c8ac5222f47a9a32a7f8833edf0eb5a4f4
ARG VERSION=1.12.5
FROM cloudron/base:3.0.0@sha256:455c70428723e3a823198c57472785437eb6eab082e79b3ff04ea584faf46e92
RUN apt-get update && \
apt-get install -y openssh-server git && \
apt-get install -y openssh-server git asciidoctor pandoc && \
rm -rf /etc/ssh_host_* && \
rm -r /var/cache/apt /var/lib/apt/lists
RUN pip3 install jupyter
ADD supervisor/ /etc/supervisor/conf.d/
@@ -16,6 +15,9 @@ RUN passwd -d git
RUN mkdir -p /home/git/gitea
WORKDIR /home/git
ARG VERSION=1.15.7
RUN curl -L https://dl.gitea.io/gitea/${VERSION}/gitea-${VERSION}-linux-amd64 -o /home/git/gitea/gitea \
&& chmod +x /home/git/gitea/gitea

View File

@@ -6,7 +6,3 @@ The initial credentials are:
Please change the admin password immediately.
<sso>
Cloudron users can login using the `Cloudron` authentication source.
</sso>

View File

@@ -103,3 +103,24 @@ COOKIE_SECURE = true
COOKIE_NAME = cloudron_gitea
GC_INTERVAL_TIME = 2592000
[markup.asciidoc]
ENABLED = true
FILE_EXTENSIONS = .adoc,.asciidoc
RENDER_COMMAND = "asciidoctor -s -a showtitle --out-file=- -"
; Input is not a standard input but a file
IS_INPUT_FILE = false
[markup.restructuredtext]
ENABLED = true
FILE_EXTENSIONS = .rst
RENDER_COMMAND = "timeout 30s pandoc +RTS -M512M -RTS -f rst"
IS_INPUT_FILE = false
[markup.jupyter]
ENABLED = true
FILE_EXTENSIONS = .ipynb
RENDER_COMMAND = "jupyter nbconvert --stdin --stdout --to html --template basic"
IS_INPUT_FILE = false
[markup.sanitizer.jupyter.img]
ALLOW_DATA_URI_IMAGES = true

View File

@@ -26,7 +26,7 @@ setup_ldap_source() {
setup_root_user() {
set -eu
if sudo -H -u git /home/git/gitea/gitea admin create-user --name root --password changeme --email test@cloudron.io --admin -c /run/gitea/app.ini; then
if sudo -H -u git /home/git/gitea/gitea admin user create --name root --password changeme --email test@cloudron.io --admin -c /run/gitea/app.ini; then
echo "==> root user added"
else
echo "==> Failed to add root user"
@@ -38,7 +38,7 @@ setup_auth() {
set -eu
# Wait for gitea to finish db setup, before we do any db operations
while ! curl --fail http://localhost:3000/healthcheck; do
while ! curl --fail http://localhost:3000/explore; do
echo "==> Waiting for gitea to come up"
sleep 1
done

1531
test/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,11 +9,11 @@
"author": "",
"license": "ISC",
"dependencies": {
"chromedriver": "^85.0.1",
"chromedriver": "^96.0.0",
"expect.js": "^0.3.1",
"mocha": "^8.1.3",
"mocha": "^9.1.3",
"rimraf": "^3.0.2",
"selenium-webdriver": "^3.6.0",
"selenium-webdriver": "^4.1.0",
"superagent": "^6.1.0"
}
}

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env node
/* jslint node:true */
/* jshint esversion: 8 */
/* global it:false */
/* global xit:false */
/* global describe:false */
@@ -54,247 +54,130 @@ describe('Application life cycle test', function () {
function getAppInfo() {
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
app = inspect.apps.filter(function (a) { return a.location.indexOf(LOCATION) === 0; })[0];
expect(app).to.be.an('object');
}
function setAvatarOld(done) {
browser.get('https://' + app.fqdn + '/user/settings/avatar').then(function () {
return browser.findElement(By.xpath('//input[@type="file" and @name="avatar"]')).sendKeys(path.resolve(__dirname, '../logo.png'));
}).then(function () {
return browser.findElement(By.xpath('//button[contains(text(), "Update Avatar Setting")]')).click();
}).then(function () {
if (app.manifest.version === '1.0.3') {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"updated successfully")]')), TIMEOUT);
} else {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"Your avatar setting has been updated.")]')), TIMEOUT);
}
}).then(function () {
done();
});
function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
function setAvatar(done) {
if (app.manifest.version === '1.5.4') return setAvatarOld(done);
async function setAvatar() {
await browser.get('https://' + app.fqdn + '/user/settings');
browser.get('https://' + app.fqdn + '/user/settings').then(function () {
var button = browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]'));
return browser.executeScript('arguments[0].scrollIntoView(false)', button);
}).then(function () {
return browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]')).click();
}).then(function () {
return browser.findElement(By.xpath('//input[@type="file" and @name="avatar"]')).sendKeys(path.resolve(__dirname, '../logo.png'));
}).then(function () {
return browser.findElement(By.xpath('//button[contains(text(), "Update Avatar")]')).click();
}).then(function () {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"Your avatar has been updated.")]')), TIMEOUT);
}).then(function () {
done();
});
var button = await browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]'));
await browser.executeScript('arguments[0].scrollIntoView(false)', button);
await browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]')).click();
await browser.findElement(By.xpath('//input[@type="file" and @name="avatar"]')).sendKeys(path.resolve(__dirname, '../logo.png'));
await browser.findElement(By.xpath('//button[contains(text(), "Update Avatar")]')).click();
await browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"Your avatar has been updated.")]')), TIMEOUT);
}
function checkAvatar(done) {
return done();
superagent.get('https://' + app.fqdn + '/avatars/a3e6f3316fc1738e29d621e6a26e93d3').end(function (error, result) {
expect(error).to.be(null);
expect(result.statusCode).to.be(200);
done();
});
async function checkAvatar() {
await browser.get(`https://${app.fqdn}/${username}`);
var avatarSrc = await browser.findElement(By.xpath('//a[@id="profile-avatar"]/img')).getAttribute('src');
var avatar = await superagent.get(avatarSrc);
expect(avatar.statusCode).to.equal(200);
}
function login(username, password, done) {
browser.get('https://' + app.fqdn + '/user/login').then(function () {
return browser.findElement(By.id('user_name')).sendKeys(username);
}).then(function () {
return browser.findElement(By.id('password')).sendKeys(password);
}).then(function () {
return browser.findElement(By.tagName('form')).submit();
}).then(function () {
return browser.wait(until.elementLocated(By.linkText('Dashboard')), TIMEOUT);
}).then(function () {
done();
});
async function login(username, password) {
await browser.get('https://' + app.fqdn + '/user/login');
await browser.findElement(By.id('user_name')).sendKeys(username);
await browser.findElement(By.id('password')).sendKeys(password);
await browser.findElement(By.xpath('//form[@action="/user/login"]//button')).click();
await browser.wait(until.elementLocated(By.linkText('Dashboard')), TIMEOUT);
}
function adminLogin(done) {
login('root', 'changeme', done);
async function adminLogin() {
await login('root', 'changeme');
}
function logout(done) {
browser.get('https://' + app.fqdn).then(function () {
return browser.findElement(By.xpath('//img[contains(@class, "avatar")]')).click();
}).then(function () {
browser.sleep(2000);
}).then(function () {
return browser.findElement(By.xpath('//a[@data-url="/user/logout"]')).click();
}).then(function () {
browser.sleep(2000);
}).then(function () {
done();
});
async function logout() {
await browser.get('https://' + app.fqdn);
await browser.findElement(By.xpath('//img[contains(@class, "avatar")]')).click();
await sleep(2000);
await browser.findElement(By.xpath('//a[@data-url="/user/logout"]')).click();
await sleep(2000);
}
function addPublicKey(done) {
async function addPublicKey() {
var publicKey = fs.readFileSync(__dirname + '/id_rsa.pub', 'utf8');
const sshPage = 'https://' + app.fqdn + '/user/settings/keys';
browser.get(sshPage).then(function () {
return browser.findElement(By.xpath('//div[text()="Add Key"]')).click();
}).then(function () {
return browser.findElement(By.id('ssh-key-title')).sendKeys('testkey');
}).then(function () {
return browser.findElement(By.id('ssh-key-content')).sendKeys(publicKey.trim()); // #3480
}).then(function () {
var button = browser.findElement(By.xpath('//button[contains(text(), "Add Key")]'));
return browser.executeScript('arguments[0].scrollIntoView(false)', button);
}).then(function () {
return browser.findElement(By.xpath('//button[contains(text(), "Add Key")]')).click();
}).then(function () {
if (app.manifest.version === '1.0.3') {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "added successfully!")]')), TIMEOUT);
} else {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "has been added.")]')), TIMEOUT);
}
}).then(function () {
done();
});
await browser.get(sshPage);
await browser.findElement(By.xpath('//div[text()="Add Key"]')).click();
await browser.findElement(By.id('ssh-key-title')).sendKeys('testkey');
await browser.findElement(By.id('ssh-key-content')).sendKeys(publicKey.trim()); // #3480
var button = browser.findElement(By.xpath('//button[contains(text(), "Add Key")]'));
await browser.executeScript('arguments[0].scrollIntoView(false)', button);
await browser.findElement(By.xpath('//button[contains(text(), "Add Key")]')).click();
await browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "has been added.")]')), TIMEOUT);
}
function createRepo(done) {
var getRepoPage;
if (app.manifest.version === '1.0.3') {
getRepoPage = browser.get('https://' + app.fqdn).then(function () {
return browser.findElement(By.linkText('New Repository')).click();
}).then(function () {
return browser.wait(until.elementLocated(By.xpath('//*[contains(text(), "New Repository")]')), TIMEOUT);
async function createRepo() {
var getRepoPage = await browser.get('https://' + app.fqdn + '/repo/create');
await browser.findElement(By.id('repo_name')).sendKeys(reponame);
var button = browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]'));
await browser.executeScript('arguments[0].scrollIntoView(true)', button);
await browser.findElement(By.id('auto-init')).click();
await browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]')).click();
await browser.wait(function () {
return browser.getCurrentUrl().then(function (url) {
return url === 'https://' + app.fqdn + '/' + username + '/' + reponame;
});
} else {
getRepoPage = browser.get('https://' + app.fqdn + '/repo/create');
}
getRepoPage.then(function () {
return browser.findElement(By.id('repo_name')).sendKeys(reponame);
}).then(function () {
var button = browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]'));
return browser.executeScript('arguments[0].scrollIntoView(true)', button);
}).then(function () {
return browser.findElement(By.id('auto-init')).click();
}).then(function () {
return browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]')).click();
}).then(function () {
browser.wait(function () {
return browser.getCurrentUrl().then(function (url) {
return url === 'https://' + app.fqdn + '/' + username + '/' + reponame;
});
}, TIMEOUT);
}).then(function () {
done();
});
}, TIMEOUT);
}
function checkCloneUrl(done) {
browser.get('https://' + app.fqdn + '/' + username + '/' + reponame).then(function () {
return browser.findElement(By.id('repo-clone-ssh')).click();
}).then(function () {
return browser.findElement(By.id('repo-clone-url')).getAttribute('value');
}).then(function (cloneUrl) {
expect(cloneUrl).to.be(`ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame}.git`);
done();
});
async function checkCloneUrl() {
await browser.get('https://' + app.fqdn + '/' + username + '/' + reponame);
await browser.findElement(By.id('repo-clone-ssh')).click();
var cloneUrl = await browser.findElement(By.id('repo-clone-url')).getAttribute('value');
expect(cloneUrl).to.be(`ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame}.git`);
}
function cloneRepo(done) {
function cloneRepo() {
rimraf.sync(repodir);
var env = Object.create(process.env);
env.GIT_SSH = __dirname + '/git_ssh_wrapper.sh';
execSync(`git clone ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame}.git ${repodir}`, { env: env });
done();
}
function pushFile(done) {
function pushFile() {
var env = Object.create(process.env);
env.GIT_SSH = __dirname + '/git_ssh_wrapper.sh';
execSync(`touch newfile && git add newfile && git commit -a -mx && git push ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame} master`,
{ env: env, cwd: repodir });
rimraf.sync('/tmp/testrepo');
done();
}
function addCustomFile(done) {
fs.writeFileSync('/tmp/customfile.txt', 'GOGS TEST', 'utf8');
execSync(`cloudron exec --app ${app.id} -- mkdir -p /app/data/custom/public`);
execSync(`cloudron push --app ${app.id} /tmp/customfile.txt /app/data/custom/public/customfile.txt`);
fs.unlinkSync('/tmp/customfile.txt');
done();
}
function checkCustomFile(done) {
superagent.get('https://' + app.fqdn + '/customfile.txt').end(function (error, result) {
if (error) return done(error);
expect(result.text).to.contain('GOGS TEST');
done();
});
}
function fileExists() {
expect(fs.existsSync(repodir + '/newfile')).to.be(true);
}
function sendMail(done) {
browser.get(`https://${app.fqdn}/admin/config`).then(function () {
var button = browser.findElement(By.xpath('//button[@id="test-mail-btn"]'));
return browser.executeScript('arguments[0].scrollIntoView(true)', button);
}).then(function () {
return browser.findElement(By.xpath('//input[@name="email"]')).sendKeys('test@cloudron.io');
}).then(function () {
return browser.findElement(By.xpath('//button[@id="test-mail-btn"]')).click();
}).then(function () {
return browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"A testing email has been sent to \'test@cloudron.io\'")]')), TIMEOUT);
}).then(function () {
done();
});
async function sendMail() {
await browser.get(`https://${app.fqdn}/admin/config`);
var button = await browser.findElement(By.xpath('//button[@id="test-mail-btn"]'));
await browser.executeScript('arguments[0].scrollIntoView(true)', button);
await browser.findElement(By.xpath('//input[@name="email"]')).sendKeys('test@cloudron.io');
await browser.findElement(By.xpath('//button[@id="test-mail-btn"]')).click();
await browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"A testing email has been sent to \'test@cloudron.io\'")]')), TIMEOUT);
}
xit('build app', function () { execSync('cloudron build', EXEC_ARGS); });
// it('can login', function (done) {
// var inspect = JSON.parse(execSync('cloudron inspect'));
// superagent.post(`https://${inspect.apiEndpoint}/api/v1/developer/login`).send({
// username: username,
// password: password
// }).end(function (error, result) {
// if (error) return done(error);
// if (result.statusCode !== 200) return done(new Error('Login failed with status ' + result.statusCode));
// token = result.body.accessToken;
// superagent.get(`https://${inspect.apiEndpoint}/api/v1/profile`)
// .query({ access_token: token }).end(function (error, result) {
// if (error) return done(error);
// if (result.statusCode !== 200) return done(new Error('Get profile failed with status ' + result.statusCode));
// email = result.body.email;
// done();
// });
// });
// });
it('install app', function () { execSync(`cloudron install --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); });
it('can get app information', getAppInfo);
it('can get the main page', function (done) {
superagent.get('https://' + app.fqdn).end(function (error, result) {
expect(error).to.be(null);
expect(result.status).to.eql(200);
done();
});
});
it('can admin login', adminLogin);
it('can send mail', sendMail);
@@ -314,9 +197,6 @@ return done();
it('can add and push a file', pushFile);
it('can add custom file', addCustomFile);
it('can check custom file', checkCustomFile);
it('can restart app', function () { execSync('cloudron restart --app ' + app.id); });
xit('can login', login.bind(null, username, password)); // no need to relogin since session persists
@@ -332,18 +212,14 @@ return done();
it('can clone the url', cloneRepo);
it('file exists in repo', function () { expect(fs.existsSync(repodir + '/newfile')).to.be(true); });
it('move to different location', function (done) {
it('move to different location', async function () {
//browser.manage().deleteAllCookies(); // commented because of error "'Network.deleteCookie' wasn't found"
// ensure we don't hit NXDOMAIN in the mean time
browser.get('about:blank').then(function () {
execSync('cloudron configure --location ' + LOCATION + '2 --app ' + app.id, EXEC_ARGS);
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION + '2'; })[0];
expect(app).to.be.an('object');
await browser.get('about:blank');
done();
});
execSync('cloudron configure --location ' + LOCATION + '2 --app ' + app.id, EXEC_ARGS);
});
it('can get app information', getAppInfo);
it('can login', login.bind(null, username, password));
it('can get avatar', checkAvatar);
@@ -351,57 +227,38 @@ return done();
it('can clone the url', cloneRepo);
it('file exists in repo', function () { expect(fs.existsSync(repodir + '/newfile')).to.be(true); });
it('uninstall app', function (done) {
it('uninstall app', async function () {
// ensure we don't hit NXDOMAIN in the mean time
browser.get('about:blank').then(function () {
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
done();
});
await browser.get('about:blank');
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
});
// check if the _first_ login via email succeeds
it('can login via email', function (done) {
execSync(`cloudron install --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS);
var inspect = JSON.parse(execSync('cloudron inspect'));
it('can login via email', async function () { execSync(`cloudron install --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); });
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
expect(app).to.be.an('object');
it('can get app information', getAppInfo);
it('can login', login.bind(null, email, password));
login(email, password, function (error) {
if (error) return done(error);
// ensure we don't hit NXDOMAIN in the mean time
browser.get('about:blank').then(function () {
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
done();
});
});
it('uninstall app', async function () {
// ensure we don't hit NXDOMAIN in the mean time
await browser.get('about:blank');
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
});
// No SSO
it('install app (no sso)', function () {
execSync(`cloudron install --no-sso --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS);
});
it('can get app information', function () {
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
expect(app).to.be.an('object');
});
it('install app (no sso)', function () { execSync(`cloudron install --no-sso --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); });
it('can get app information', getAppInfo);
it('can admin login (no sso)', adminLogin);
it('can logout', logout);
it('uninstall app (no sso)', function () {
it('uninstall app (no sso)', async function () {
await browser.get('about:blank');
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
});
// test update
it('can install app', function () {
execSync(`cloudron install --appstore-id ${app.manifest.id} --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS);
});
it('can install app', function () { execSync(`cloudron install --appstore-id ${app.manifest.id} --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); });
it('can get app information', getAppInfo);
it('can login', login.bind(null, username, password));
@@ -412,9 +269,7 @@ return done();
it('can clone the url', cloneRepo);
it('can add and push a file', pushFile);
it('can update', function () {
execSync('cloudron update --app ' + app.id, EXEC_ARGS);
});
it('can update', function () { execSync('cloudron update --app ' + app.id, EXEC_ARGS); });
xit('can admin login', adminLogin);
xit('can send mail', sendMail);
@@ -425,11 +280,9 @@ return done();
it('can clone the url', cloneRepo);
it('file exists in cloned repo', fileExists);
it('uninstall app', function (done) {
it('uninstall app', async function () {
// ensure we don't hit NXDOMAIN in the mean time
browser.get('about:blank').then(function () {
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
done();
});
await browser.get('about:blank');
execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS);
});
});